我之前一直在做的是使用构造函数只注入(inject)我的模型和为 Laravel 提供的类使用 Facades 即 Session
, Auth
, Validator
等,例如。如果我通过构造注入(inject)每个类(我的或 Laravel 的)并通过 $this->..
语法或 使用它,这将是一个好主意吗?我应该使用构造函数注入(inject)我自己的类,并为 Laravel 提供的任何东西使用 Facades 吗?
更具体地说,这是我的 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('/');
}
...
}
结论
至于是否应该这样做,那是你的事,但要考虑:
- 首先,使用 Dependency-Injection 与 Facade(它还支持 IDE 自动完成)。
- 然后,只要依赖是唯一的(并且大多数路由不需要),使用按方法注入(inject)而不是构造函数。
- 因为让所有唯一的依赖项出现在方法定义中更容易进行单元测试(对我来说似乎更干净)。
关于php - 拉维尔 : Dependency injection vs Facades?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27080739/