2017-02-03 4 views
3

「ミドルウェアの前」でアクションを取り消し、コントローラを実行せずにクライアントに応答を送信する方法が見つかりませんでした。例えばミドルウェアキャンセルルートの前のSilexアプリケーション

$app->before(function(Request $request) { 
    // Do something here 
    // ... 
    // Here sent the response to the client and don't execute the controller 
}}); 

は可能ですか?

一例

このコードは正常に動作します。私はフレームワークの組み込みメソッドを使用して別のソリューションを探しています。可能な場合は問題ありません。

$app->before(function(Request $request) { 
    // Do something here 
    // ... 

    header('Content-Type: application/json'); 

    echo json_encode(array(
     'message' => 'Invalid token' 
    )); 

    http_response_code(400); // This code return Bad Request to client 
    exit; // Cancel the rest of the framework 
}}); 

答えて

1

すぐにリクエストをキャンセルして400応答を返す場合は、例外を使用してください。あなたの場合、ユーザーは権限がないので、401のようなものが適合します。

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException; 
use Symfony\Component\HttpFoundation\Response; 

$app->match('/', function() use ($app) { 
    $app->before(function (Request $request) { 
     $loggedIn= false; 

     if (!$loggedIn) { 
      throw new UnauthorizedHttpException(null,'unauthorized',null,Response::HTTP_UNAUTHORIZED); 
     } 
    }); 
}); 

$app->error(function (\Exception $e, Request $request, $code) { 
    $message = strlen($e->getMessage()) > 0 ? $e->getMessage() : null; 
    switch ($code) { 
     case Response::HTTP_UNAUTHORIZED: 
      $response = new Response($message, Response::HTTP_UNAUTHORIZED); 
      break; 
     default: 
      $response = new Response($message, Response::HTTP_NOT_FOUND); 
      break; 
    } 
    return $response; 
}); 
+0

あなたのお返事ありがとうございます。しかし私の意図は、クライアントに4XXステータスコードを返す要求を取り消すことです。このメソッドを使用すると、結果は他のコントローラによって生成されたボディを持つステータスコード200になります。おそらく、私のアイデアが間違っているか、そのアプローチが無効です。 –

+0

どこから脱出して4xxコードを返すかは、例外を使用してください。私は私の答えを編集しました。 –

+0

Horst Jahns、ありがとうございます。あなたのソリューションは私のアプローチには完璧です。よろしく –

0

official documentationを確認しましたか?ミドルウェアのドキュメントから:

短絡するコントローラ

ミドルウェアは、Responseオブジェクトを返す前にした場合、リクエストの処理が短絡し(次のミドルウェアが実行されることはありません、でもありますルートコールバック)、そしてレスポンスがすぐ後にミドルウェアに渡されます:あなたはそれがコントローラを呼び出して仕事をしてはならないResponseオブジェクトを返す場合

$app->before(function (Request $request) { 
    // redirect the user to the login screen if access to the Resource is protected 
    if (...) { 
     return new RedirectResponse('/login'); 
    } 
}); 

+0

はい、私はすでにドキュメントをチェックしていますが、この場合、RedirectResponseは302の応答をクライアントに送信し、別のコントローラにリダイレクトします。 私の場合、リダイレクトせずに4XXステータスコードを返す必要があります。 –

+0

あなたのコードを共有できますか? (あなたの質問を編集し、いくつかのコードを投稿してください) – mTorres

関連する問題