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

时间:2016-10-23 01:06:21

标签: laravel laravel-5 laravel-5.2 laravel-5.1 laravel-5.3

我有一个特性,而trait正在控制器中使用。通过这种方式,Controller中使用了Controller的许多功能。 Controller正在扩展基本控制器。 BaseControllertrait已经拥有了他们的构造函数。

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

为了解决这个问题,我在这个位置\vendor\laravel\framework\src\Illuminate\Foundation\Auth\SendsPasswordResetEmails.php看到了broker。您会看到此trait中有一个名为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是合同。 SendsPasswordResetEmails trait是数据库类

问题:您能否告诉我如何通过Facade连接此服务提供,就像在trait中一样,以避免{{1}}中的构造函数依赖注入?

1 个答案:

答案 0 :(得分:1)

首先,请确保您已在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';
    }

}

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

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

就是这样。

现在,回到Password::broker();示例,这是一个Facade,它有一个实际上解决了另一个依赖性的方法,所以除非您尝试从{{{{}内解析另一个类。 1}}这种模式不适合你。

您可以使用RoleDb来解析依赖关系,也可以直接在其他控制器方法中使用app('App\Architecture\Contract\Role\IRole')

希望这有帮助!