在拉拉维尔立面上使用依赖注入
我读过许多资料,暗示laravel立面的存在最终是为了方便,并且应该注入这些类以允许松散耦合。甚至泰勒·奥特韦尔(Taylor Otwell)也有一篇文章解释了如何做到这一点。似乎我不是唯一一个想知道这一点的人。
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");
}
}
这很好,除了我开始发现一些构造函数和方法开始采用四个以上的参数。
由于Laravel IoC似乎只注入类构造函数和某些方法(控制器),即使我有相当精益的函数和类,我发现类的构造函数正在被所需的类打包,然后注入到所需的方法中。
现在我发现,如果我继续这种方法,我将需要自己的IoC容器,如果我使用像laravel这样的框架,感觉就像重新发明轮子一样?
例如,我使用服务来控制业务/视图逻辑,而不是处理它们的控制器 - 它们只是路由视图。所以一个控制器将首先获取其相应的 ,然后是其 url 中的 。一个服务函数还需要检查表单中的值,因此我需要 和 。就这样,我有四个参数。service
parameter
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容器能够消除我的问题?
也就是说,在这个问题上似乎没有明确的共识......