Laravel 避免trait中的构造函数依赖注入
我有一个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
的许多功能正在控制器中使用<代码>控制器
正在扩展基本控制器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,