避免特征中的构造函数依赖注入
Avoiding Constructor Dependency Injection in trait
我有一个特征,trait
正在控制器中使用。这样,trait
的很多功能都在Controller
中使用了。 Controller
正在扩展一个基本控制器。 Controller
和 BaseController
已经有了它们的构造函数。
由于某些原因,我需要 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
。
希望对您有所帮助!
我有一个特征,trait
正在控制器中使用。这样,trait
的很多功能都在Controller
中使用了。 Controller
正在扩展一个基本控制器。 Controller
和 BaseController
已经有了它们的构造函数。
由于某些原因,我需要 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
。
希望对您有所帮助!