2016-08-05 12 views
3

私は、サービスコンテナにオブジェクトを登録し、設定ファイルといくつかのミドルウェアを起動するサービスプロバイダを持っているが、ミドルウェアは循環依存関係にあるようだサービスプロバイダが認証されたユーザを取得する必要があり、5つの異なるタイプが存在するので、ユーザJWTトークンからインスタンス化される前にサービスコンテナにパースされたパラメータと、ユーザのガードを渡す必要があります(申請者、Manager、Adminなど)、Auth :: guard() - > getUser()のようにnullの場合、デフォルトで申請者にデフォルト設定されるので、ガードはコンストラクタ内でAuth :: guard($ guard) - > getUser()Laravel 5.2サービスプロバイダのサービスコンテナを登録するためのミドルウェアパラメータを渡す

どうすればこのようなことを回避できますか?それが役に立ったら、LaravelのガードAPIを利用するためにtymons/JWTAuth(開発)ブランチを使用しています。

  1. 私はリファクタリングとちょうどので、私はサービスコンテナオブジェクトをインスタンス化するためにパラメータを使用することができ、すべてのサービスプロバイダを使用して直接ミドルウェア内のサービスコンテナに結合し、すべきではない、とガード。唯一の可能性のある解決策のようですが、私がこれをすべてリファクタリングする前に、よりよい方法があるかどうか尋ねたいと思っていました。

  2. 2つのサービスプロバイダを使用できますか?ミドルウェアを追加するものと、サービスコンテナにオブジェクトを登録するものもしそうなら、あなたは設定でそのパラメータをどのように渡すでしょうか?私が知っていることに基づいてこれを考えることはできません。

セッターをオブジェクトに追加することは、間違って他の場所でそれを呼び出さないようにするためのオプションではありません。

答えて

0

tymon/jwt-authをお使いですか?その場合、サービスプロバイダは、トークンがデコードされたときに起動するイベントリスナーを設定できます。以下のような何か:あなたはこのパッケージを使用していない場合は、まだイベントをリッスンでき

event()->listen('tymon.jwt.valid', function($user){ 
    app()->singleton(YourInterface::class, function() use ($user){ 
    //this will only register once your token is decoded 
    } 
}); 

は、その後、一度バインド火災います。これは基本的にあなたの選択肢1と同じですが、少なくともそれが望む場所にコードを整理しておきます。

+0

私は 'tymon/jwt-auth'を使用しています。したがって、追加しているイベントバインディングは、サービスプロバイダの起動時です。 'event() - > listen'または' $ this-> app ['Event'] - > listen'を使う方が良いでしょうか?今すぐこれを試してみましょう。 – mtpultz

+1

あなたが使用できるバインディング・イベントのシンタックスはいくつかありますが、それらは両方とも機能するはずです。リスナーを作成し、EventServiceProviderの配列に配置することもできます – Jeff

+0

遅れて申し訳ありません。私はこれを働かせるように見えない。 'tymon/jwt-auth'で検索すると、' tymon.jwt.valid'というイベントは存在しないようです。私はJWTGuardを使って同等のものを見つけようとするので、 'develop'ブランチを使っています。私はまた、プロバイダーをミドルウェアに設定する必要がありますので、ユーザーは 'auth:user'の場合に' getProvider'を使ってこれにアクセスすることができます。 – mtpultz

関連する問題