我之前一直在做的是使用Laravel提供的类的构造函数和使用Facades仅注入(inject)我的模型,例如SessionAuthValidator等。如果我通过构造方法注入(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('/');
    }
    ...
}

至于是否应该以这种方式进行操作,则取决于您-强制所有依赖项出现在方法定义中对我来说似乎更干净,并且更易于进行单元测试。

10-05 20:28
查看更多