我之前一直在做的是使用Laravel提供的类的构造函数和使用Facades仅注入(inject)我的模型,例如Session
,Auth
,Validator
等。如果我通过构造方法注入(inject)每个类(我的或Laravel的)并通过$this->..
语法或使用它,是否应该是一个好主意?
更具体地说,这是我的 Controller 通常的外观:
class MyController extends BaseController
{
public function __construct( User $user, Bookmark $bookmark ) {
$this->user = $user;
$this->bookmark = $bookmark
}
public function foobar ( ) {
$user_id = Input::get('bar');
...
Session::get('someInfo');
...
return Redirect::to('/');
}
...
}
我应该像下面的 Controller 那样构造我的方法吗?
class MyController extends BaseController
{
public function __construct( User $user, Bookmark $bookmark, Input $input, Session $session, Redirect $redirect ) {
$this->user = $user;
$this->bookmark = $bookmark
$this->input = $input;
$this->session = $session;
$this->redirect = $redirect;
}
public function foobar ( ) {
$user_id = $this->input->get('bar');
...
$this->session->get('someInfo');
...
return $this->redirect->to('/');
}
...
}
最佳答案
Laravel现在为与路由相关的类方法(不仅是构造函数)支持相同的注入(inject)功能,例如 Controller 和中间件。
您可以通过仅注入(inject)依赖项唯一的方法来防止不必要的注入(inject),也许在构造函数中保留更常见的依赖项:
class MyController extends BaseController
{
public function __construct( Input $input, Session $session, Redirect $redirect ) {
$this->input = $input;
$this->session = $session;
$this->redirect = $redirect;
}
public function foobar ( User $user, Bookmark $bookmark ) {
$user_id = $this->input->get('bar');
...
$this->session->get('someInfo');
...
return $this->redirect->to('/');
}
...
}
至于是否应该以这种方式进行操作,则取决于您-强制所有依赖项出现在方法定义中对我来说似乎更干净,并且更易于进行单元测试。