Я читал ряд источников, которые намекают на то, что фасад laravel в конечном счете существует для удобства, и что эти классы должны вместо этого вводиться для обеспечения слабой связи. Даже у Тейлора Отвелла есть пост, объясняющий, как это сделать. Кажется, я не единственный, кто задается этим вопросом.
use Redirect;
class Example class
{
public function example()
{
return Redirect::route("route.name");
}
}
станет
use Illuminate\Routing\Redirector as Redirect;
class Example class
{
protected $redirect;
public function __constructor(Redirect $redirect)
{
$this->redirect = $redirect
}
public function example()
{
return $this->redirect->route("route.name");
}
}
Это нормально, за исключением того, что я начинаю обнаруживать, что некоторые конструкторы и методы начинают принимать параметры four+.
Так как IoC Laravel, кажется, вводит только в конструкторы классов и определенные методы (контроллеры), даже когда у меня довольно простые функции и классы, я обнаружил, что конструкторы классов упаковываются с необходимыми классами, которые затем вводятся в необходимые методы.
Теперь я обнаружил, что если я продолжу в том же духе, мне понадобится мой собственный контейнер IoC, что похоже на переизобретение колеса, если я использую фреймворк типа laravel?
Например, я использую сервисы для управления логикой бизнеса/представления, а не контроллеров, которые с ними работают - они просто маршрутизируют представления. Таким образом, контроллер сначала получает соответствующую service
, а затем parameter
в своем URL. Одна сервисная функция также должна проверять значения из формы, поэтому мне нужны Request
и Validator
. Просто так у меня есть четыре параметра.
// MyServiceInterface is binded using the laravel container
use Interfaces\MyServiceInterface;
use Illuminate\Http\Request;
use Illuminate\Validation\Factory as Validator;
...
public function exampleController(MyServiceInterface $my_service, Request $request, Validator $validator, $user_id)
{
// Call some method in the service to do complex validation
$validation = $my_service->doValidation($request, $validator);
// Also return the view information
$viewinfo = $my_service->getViewInfo($user_id);
if ($validation === 'ok') {
return view("some_view", ['view_info'=>$viewinfo]);
} else {
return view("another_view", ['view_info'=>$viewinfo]);
}
}
Это единственный пример. На самом деле, многие из моих конструкторов уже содержат несколько классов (Модели, Сервисы, Параметры, Фасады). Я начал "разгружать" внедрение конструктора (когда это применимо) на внедрение метода, и классы, вызывающие эти методы, используют вместо этого свои конструкторы для внедрения зависимостей.
Мне сказали, что более четырех параметров для метода или конструктора класса, как правило, являются плохой практикой/запахом кода. Однако я не могу понять, как вы можете избежать этого, если выберете путь инъекции фасадов ларавеллы.
Я правильно понял эту идею? Мои классы/функции недостаточно просты? Я пропускаю точку контейнера laravels или мне действительно нужно подумать о создании собственного контейнера IoC? Некоторые другие ответы, похоже, намекают на то, что контейнер laravel может устранить мою проблему?
Тем не менее, по-видимому, нет окончательного консенсуса по этому вопросу...