Ответы пользователя по тегу Laravel
  • Так в чём преимущество паттерна репозиторий?

    @GoodBoy123
    По сути репозиторий это более высокий уровень абстракции. При использовании репозитория вы программируете к интерфейсу, а не к реализации. На примере Laravel. У вас есть MessagesRepository:

    interface MessagesRepository {
    
     // Выбрать все сообщение
     public function all();
    
     // Выбрать сообщение по id
     public function findById($id);
    
     //Записать  сообщение
     public function store($id, $userId);
    }


    В остальном коде вы обращаетесь именно к этому интерфейсу используя IOC контейнер:
    MessagesController.php
    protected $messages;
     public function __construct(MessagesRepository $messages){
            $this->messages = $messages;
     }
    
    public function index() {
     return view('messages.index')-with('messages', $this->messages->all());
    }


    После этого вы с помощью Laravel IOC контейнера связываете интерфейс с конкретной реализацией
    $this->app->bind(
                'App\Repositories\Messages\MessagesRepository',
                'App\Repositories\Messages\MysqlMessagesRepository'
            );


    И в MysqlMessagesRepository уже делаете реализацию применяя интерфейс
    class MysqlMessagesRepository implements MessagesRepository {
    
     // Выбрать все сообщение
     public function all() {
     MysqlGetAllMessages();
    }
    
    
     // Выбрать сообщение по id
     public function findById($id);
    
     //Записать  сообщение
     public function store($id, $userId);
    }


    Преимущество в том что код работает с интерфейсом, а не с реализацией, поэтому для того, чтобы поменять Mysql на redis нужно:
    создать реализацию MessagesRepository интерфейса
    class RedisMessagesRepository implements MessagesRepository {
    
     // Выбрать все сообщение
     public function all() {
     RedisGetAllMessages();
    }
    
    
     // Выбрать сообщение по id
     public function findById($id);
    
     //Записать  сообщение
     public function store($id, $userId);
    }


    Сказать IOC контейнеру, что нужно брать другую реализацию:
    $this->app->bind(
                'App\Repositories\Messages\MessagesRepository',
                'App\Repositories\Messages\RedisMessagesRepository'
            );


    И на этом все. Менять код в MessagesController не нужно, так как он работает с интерфейсом.
    Ответ написан
    1 комментарий
  • Правильно ли составлено отношение "Один ко многим"?

    @GoodBoy123
    Если использование колонок login и owner не является чем-то 100% необходимым, я бы сделал так. Текст скриптов не полный, только нужные части.

    Mysql:
    Таблица users:
    id,login

    Таблица sites:
    id, users_id,url,title

    Laravel
    Модели:
    Users:
    public function sites(){
            return $this->hasMany('Site');
    }


    Site:
    public funtion user() {
    	return $this->belongsTo('User');
    }


    CabinetController:
    // Используем IOC контейнер, чтобы в будущем было легче тестировать, также строка
    // $this->userManager->getSites() гораздо более понятна через 3 месяца, чем
    // Auth::user()->short()->getResults()
    
    use Acme\UserManager as UserManager;
    
    protected $userManager;
    
    public function __construct(UserManager $userManager) {
    	$this->userManager = $userManager;
    }
    
    public function index(){
                return View::make('cabinet')->with('sites', $this->userManager->getSites());
        }


    Acme\UserManager:
    public function getSites() {
    	
    	if (Auth::check()) {
    		return User::find( Auth::id() )->sites()->get();
    	}
    
    	return false;
    }


    cabinet.blade.php (За показ страница в виде для гостя или пользователя, отвечает View, если страницы очень разные, я бы разделил их на уровне route):

    @if($sites)
    @foreach($sites as $site)
    
            <ul>
                <li>url: {{ $site->url }}</li>
                <li>title: {{ $site->title }}</li>
                <li>description: {{ $site->description }}</li>
                <li>keywords: {{ $site->keywords }}</li>
            </ul>
    
    @endforeach
    @elseif
    <p>Войдите, чтобы пользоваться сервисом</p>
    @endif


    Набросал по быстрому, могут быть опечатки, также в процессе рефакторинга многое может меняться.

    Если же использовать ключи login и owner, то :

    Users:
    public function sites(){
            return $this->hasMany('Site', 'owner', 'login');
    }


    Site:
    public funtion user() {
    	return $this->belongsTo('User' , 'owner', 'login');
    }
    Ответ написан
    Комментировать