我有一个特性,而trait
正在控制器中使用。通过这种方式,Controller
中使用了Controller
的许多功能。 Controller
正在扩展基本控制器。 BaseController
和trait
已经拥有了他们的构造函数。
由于某些原因,我需要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}}中的构造函数依赖注入?
答案 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')
。
希望这有帮助!