2017-05-26 8 views
1

私はLaravel 5.2を使用しています。私は2つの要求クラス:ApiRequestsGetUserDetailsRequestを持っています。ミドルウェアの終了メソッドのリクエストからメソッドを呼び出す

ApiRequestsはを返すメソッドshouldLogResponse()を持っています。 GetUserDetailsRequestApiRequestsを上書きし、shouldLogResponse()を上書きしてfalseを返します。

$response_content = 'Response is not logged'; 
if ($request->shouldLogResponse()) { 
    $response_content = $response->getContent(); 
} 
ApiLogger::request($request->getPathInfo(), $request->getContent(), $response_content); 

$requestGetUserDetailsRequestクラス(私は推測)のインスタンスではありませんので、それが機能していないが:

また、私は彼のterminate()方法で次のように持っているLoggingMiddlewareクラスを持っています。ミドルウェアで特定のリクエストのリクエストクラスを取得するにはどうすればよいですか?

編集:GetUserDetailsRequestがコントローラで使用されています。

public function getUser(GetUserDetailsRequest $request) { //... } 

LoggingMiddlewareapiグループで私のHttp\Kernel.php$middlewareGroupsに追加されます。このapiグループは、すべてのAPIルートに適用されます。

+0

あなたのクラスを登録してコール/インジェクトした場所や方法など、詳細を入力する必要があると思います。 –

+0

ミドルウェアはシングルトンとして定義されていますか?終了メソッドが新しいインスタンスを実行しているので... –

+0

@linktoahrefそれは期待通りに動作しています(私の検証ロジックがあります)。シモーネ・カブリノ、私はそうではないかと恐れている。どうやってやるの? –

答えて

0

私はあなたの手がかりに従います:$requestGetUserDetailsRequestのインスタンスではありません。

このcasでは、コントローラーのメソッドの中に正しいオブジェクトを挿入していない可能性があります。

そうように、あなたの方法に適切なクラスをtypehintしてください:

public function index(GetUserDetailsRequest $request) 
{} 

編集:メソッドがtypeHintedされている場合 あなたの編集は$requestGetUserDetailsRequestのインスタンスであるか、あなたの手掛かりが間違っていたことを私たちに示して実行に失敗します

+0

ミドルウェアで 'get_class($ request)'を実行すると、 'App \ Http \ Requests \ GetUserDetailsRequest'ではなく、' App \ Http \ Requests \ ApiRequests'を取得します。 –

+0

ああ、私の悪い、私はミドルウェアを意味して、あなたの記事を誤解しました。 –

+0

これで、このURLを介してアクセスするコントローラメソッドが正しくタイプヒントされていることを確認できますか? –

0

この問題はgithubの問題のページhttps://github.com/laravel/framework/issues/9683に記載されており、モデレータがLaravelのドキュメントに説明的なメッセージを追加しました。あなたのミドルウェア上で終端メソッドを呼び出すとき

Laravelはサービスコンテナからミドルウェアの新鮮なインスタンスを解決します。 handleメソッドとterminateメソッドが呼び出されたときに同じミドルウェアインスタンスを使用する場合は、コンテナのシングルトンメソッドを使用してミドルウェアをコンテナに登録します。

心から私はこのような何かをしたませんが、何が必要シングルトンとしてあなたのミドルウェアを登録してあるん。 Laravel container documentationから私は、これがこの

class AppServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
    } 

    /** 
    * Register any application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->singleton('HelpSpot\API', function ($app) { 
      return new HelpSpot\API($app->make('HttpClient')); 
     }); 
    } 
} 

のような方法で行わしかし、実行時にミドルウェアを登録するためにできることを理解し、あなたはこの

$this->app['router']->middleware('middleware_name', App\Middleware\Name::class); 

ような何かをしなければならない私にしてみましょうこれら2つのメソッドを一緒にマージする方法を理解しているかどうかを知ってください。

+0

あなたが示したようにミドルウェアを登録したら、それをミドルウェアグループにどのように適用できますか?*編集:*名前付きミドルウェアとしかし、 'terminate()'の 'exit(get_class($ request));'は 'GetUserDetailsRequest'ではなく' ApiRequests'です。 –

関連する問題