2016-10-23 96 views
1

我有一個特點,並且trait正在控制器中使用。這樣,在Controller中使用了trait的許多功能。 Controller正在擴展一個基礎控制器。 ControllerBaseController已經有它們的構造函數。避免構造函數依賴注入特性

由於某些原因,我還需要構造函數,因爲我需要構造函數依賴注入trait。現在,當我將構造函數放置在trait中時,構造函數不會執行。

爲了解決這個問題,我在這個位置看到了SendsPasswordResetEmails trait\vendor\laravel\framework\src\Illuminate\Foundation\Auth\SendsPasswordResetEmails.php。您會看到在此trait中有一個稱爲broker的函數,它返回一個合約。通過這種方式,他們不需要構造函數依賴注入,因爲他們從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做是爲了避免在trait構造函數依賴注入?

回答

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有實際解決另一個扶養所以,除非你想從你RoleDb這個模式中解決其他類將不會爲你工作的方法。

您將只使用app('App\Architecture\Contract\Role\IRole')來解決依賴問題,或直接在其他控制器方法中使用Facade

希望這會有所幫助!