避免特征中的构造函数依赖注入

Avoiding Constructor Dependency Injection in trait

我有一个特征,trait 正在控制器中使用。这样,trait的很多功能都在Controller中使用了。 Controller 正在扩展一个基本控制器。 ControllerBaseController 已经有了它们的构造函数。

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

为了克服这个问题,我在\vendor\laravel\framework\src\Illuminate\Foundation\Auth\SendsPasswordResetEmails.php这个位置看到了SendsPasswordResetEmails trait。你会看到在这个 trait 中有一个名为 broker 的函数,其中 returns 一个合约。通过这种方式,他们不需要构造函数依赖注入,因为他们从 broker 函数

获取合同

我已经有一个 ServiceProvider,如下所示。

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 是一个数据库 class

问题:您能否告诉我如何通过 Facade 连接此服务提供,就像在 SendsPasswordResetEmails trait 中所做的那样,以避免在 [=11= 中进行构造函数依赖注入] ?

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

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

$dependency = app('App\Architecture\Contract\Role\IRole');

上面的意思是$dependency实际上是RoleDb的一个实例。

话虽这么说,制作 Facade 并没有更多的东西。 离开你当前的结构,创建 class 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';
    }

}

然后返回到您的 config/app.php 文件并在 aliases 数组的底部添加以下行:

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

就是这样。

现在,回到 Password::broker(); 示例,这是一个 Facade,它有一个实际解决另一个依赖关系的方法,所以除非你试图解决另一个 class在您的 RoleDb 中,此模式不适合您。

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

希望对您有所帮助!