php - 拉维尔 : Dependency injection vs Facades?

标签 php laravel laravel-facade

我之前一直在做的是使用构造函数只注入(inject)我的模型为 Laravel 提供的类使用 FacadesSession , 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/

相关文章:

php - 拉拉维尔 : Integrity constraint violation

html - 使用 Laravel 路由和 vuejs axios 以模式加载 PDF

php - 找不到 Laravel 5 类 'Illuminate\Support\Facades\FormFacade'

Laravel 在运行时更改文件系统磁盘路径

testing - 没有 Laravel 的模拟 Illuminate Config facade

php - 如何在php中提取字符串的一部分

php - Preg_replace 没有正确替换

php - 在您的实时站点上隐藏显示 mysql 查询是否安全

php - 不总结整列

ruby - Laravel Homestead 的 Vagrantfile : where is $confDir supposed to be set?