Laravel 避免trait中的构造函数依赖注入

Laravel 避免trait中的构造函数依赖注入,laravel,laravel-5,laravel-5.2,laravel-5.1,laravel-5.3,Laravel,Laravel 5,Laravel 5.2,Laravel 5.1,Laravel 5.3,我有一个trait,trait正在控制器中使用。通过这种方式,trait的许多功能正在控制器中使用控制器正在扩展基本控制器Controller和BaseController已经有了它们的构造函数 由于某些原因,我需要trait中的构造函数,因为我需要trait中的构造函数依赖项注入。现在,当我将构造函数放在trait中时,构造函数不会执行 为了克服这个问题,我在这个位置看到了SendsPasswordResetEmails trait,\vendor\laravel\framework\src\

我有一个trait,
trait
正在控制器中使用。通过这种方式,
trait
的许多功能正在
控制器中使用<代码>控制器
正在扩展基本控制器
Controller
BaseController
已经有了它们的构造函数

由于某些原因,我需要trait中的构造函数,因为我需要trait中的构造函数依赖项注入。现在,当我将构造函数放在trait中时,构造函数不会执行

为了克服这个问题,我在这个位置看到了
SendsPasswordResetEmails trait
\vendor\laravel\framework\src\illighte\Foundation\Auth\SendsPasswordResetEmails.php
。您将看到在这个
trait
中有一个名为
broker
的函数,它返回一个契约。通过这种方式,它们不需要构造函数依赖项注入,因为它们是从
broker
函数获取契约的

我已经有了一个
服务提供商
,如下所示

class RoleServiceProvider extends \Illuminate\Support\ServiceProvider {

    public function register() {
        $this->app->bind(
            'App\Architecture\Contract\Role\IRole', 
            '\App\Architecture\Database\Role\RoleDb'
        );
    }

    public function provides() {
        return ['App\Architecture\Contract\Role\IRole'];
    }
}
App\Architecture\Contract\Role\IRole
是一个契约。
\App\Architecture\Database\Role\RoleDb
是一个数据库类


问题:您能告诉我如何像在
SendsPasswordResetEmails trait
中那样通过Facade连接此服务以避免在
trait
中插入构造函数依赖项吗?

首先,确保您已在
config/app.php
文件中注册了服务提供商

您可能不一定需要使用
Facade
,因为您可以使用
app()
来解决依赖关系:

$dependency = app('App\Architecture\Contract\Role\IRole');
上述内容意味着
$dependency
实际上是
RoleDb
的一个实例

话虽如此,制作一个
Facade
没有更多的东西了。 离开当前结构,创建类
App\Architecture\Facades\Role

<?php

namespace App\Architecture\Facades;

use Illuminate\Support\Facades\Facade;

class Role extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'App\Architecture\Contract\Role\IRole';
    }

}
就这样

现在,回到
Password::broker()示例,这是一个
Facade
,它有一个实际解决另一个依赖性的方法,因此除非您试图从
RoleDb
中解决另一个类,否则此模式将不适用于您

您可以只使用
app('app\Architecture\Contract\Role\IRole')
来解决依赖关系,或者直接在其他控制器方法中使用
Facade

希望这有帮助

'Role'         => App\Architecture\Facades\Role::class,