Представьте себе ситуацию, когда в конструкторе laravels (PostController) мне нужно ввести 3 модели: User, Post и Comment.
У меня есть два сценария:
1) Внедрить все эти 3 модели в конструктор контроллеров, а затем я использую эти переменные контроллеров в конкретных функциях следующим образом: $this->post
2) Внедрить эти модели в функции конкретного контроллера всякий раз, когда это необходимо (например, index(Post $post)
);
Какой из этих двух методов лучше? В первом сценарии в функции индекса я использую только $this->post
переменная, но я также создаю $this->comment
а также $this->user
потому что они мне нужны в других функциях? но они мне не нужны в индексе, поэтому я внедряю и создаю их даром всякий раз, когда вызываю индекс, обращаясь к конкретному маршруту индекса. Разве это не плохо? так что из этого лучше?
Как правило, когда вы вводите модель в контроллере метод это означает, что вы пытаетесь привязать значение маршрута к модели. Проще говоря, вы хотите, чтобы Laravel автоматическиволшебно принеси эту модель для тебя.
С другой стороны, когда вы вводите его через __construct()
Вы хотите, чтобы эти модели были созданы для использования в классе. Проще говоря, вы хотите, чтобы Laravel создал новый экземпляр этой модели в классе.
Пойдем практично:
Первая ситуация
//routes
Route::get('/ninjas/{ninja}') //ninja is a number or anything that identifies a model
//Controller
public function index(Ninja $ninja)
{
//$ninja will be a resolved model
}
Другая ситуация,
public function __construct(Ninja $ninja)
{
$this->ninja = $ninja;
}
public function index($ninja_id)
{
$this->ninja->find($ninja_id)
}
Как видно из приведенных выше примеров, это зависит от варианта использования. То есть, если вы намереваетесь связать модель с маршрутом, вы вводите методы контроллера в противном случае, если хотите использовать свои модели в очиститель Кстати, до конструктора.
Ура!
PS: примечание с просьбой лучшая практика обычно привлекает самоуверенный ответ, который сделал бы поиск правильный ответить тяжело.
Других решений пока нет …