2016-10-23 13 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

質問 Databaseクラスである:それはtraitでコンストラクタ依存性注入を避けるためにSendsPasswordResetEmails traitで行われていたようにあなたは親切に私は、このサービスに接続する方法を教えてもらえますがファサードを通じて提供されるものですか。

答えて

1

まず、config/app.phpファイルにサービスプロバイダを登録してください。あなたは、必ずしもあなたは自分の依存関係を解決するためにapp()を使用できるようFacadeを使用する必要はないかもしれません

$dependency = app('App\Architecture\Contract\Role\IRole'); 

上記は$dependencyが実際にRoleDbのインスタンスであることを意味します。

言われているように、これ以上のことはありません。Facade

<?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, 

をそして、それはだ あなたが現在の構造だオフに行く、クラスApp\Architecture\Facades\Roleを作成それ。

は今、戻っPassword::broker();例に行く、これは実際にあなたがあなたのために動作しませんあなたのRoleDbこのパターンの中から別のクラスを解決しようとしている場合を除きので、別の依存を解決する方法がありますFacadeです。

app('App\Architecture\Contract\Role\IRole')を使用して依存関係を解決するか、他のコントローラメソッドで直接Facadeを使用します。

希望すると便利です。