Silex ユーザーガイド

ミドルウェア (Middlewares)

Silexでは、リクエスト処理の際に ミドルウェア を通して、色々なタイミングでSilexの振舞を変更するようなコードを実行させることが出来ます。

  • アプリケーションミドルウェア は今、制御されているリクエストとは独立に呼び出されます。
  • ルートミドルウェア は、それが関連付けられたルーティングにマッチした時に呼び出されます。

アプリケーションミドルウェア (Application Middlewares)

アプリケーションミドルウェアは”マスター”リクエストに対してのみ実行されます。

前処理ミドルウェア (Before Middleware)

前処理 ミドルウェアでは、コントローラが実行される前にリクエストの微調整を行なうことができます。

$app->before(function (Request $request, Application $app) {
    // ...
});

標準では、ミドルウェアはルーティングとセキュリティに関する処理の後に実行されます。

早く例外が発生した場合でも(インスタンスに対する404や403エラーなど)ミドルウェアを実行させたいときは、ミドルウェアを早期イベントとして登録する必要があります。

$app->before(function (Request $request, Application $app) {
    // ...
}, Application::EARLY_EVENT);

もちろん、この場合では、ルーティングとセキュリティは実行されません。従って、ロケールやルーティングやセキュリティユーザに関する情報にはアクセスできません。

Note

前処理ミドルウェアはSymfony request イベントに登録されたイベントです。

後処理ミドルウェア (After Middleware)

後処理 アプリケーションミドルウェアは、レスポンスの微調整をクライアントに送信する前に行なうことが出来ます。

$app->after(function (Request $request, Response $response) {
    // ...
});

Note

後処理ミドルウェアはSymfony response イベントに登録されたイベントです。

完了ミドルウェア (Finish Middleware)

完了 アプリケーションミドルウェアは、レスポンスをクライアントに対して送信した後に、何らかのタスク(メールの送信、ログ処理等)を実行することが可能です。

$app->finish(function (Request $request, Response $response) {
    // ...
    // 注意:リクエストやレスポンスに対する変更は無視されます。
});

Note

完了ミドルウェアはSymfony terminate イベントに登録されたイベントです。

ルートミドルウェア (Routes middlewares)

ルートミドルウェアは、ルーティングやルーティングコレクションに対して追加することが出来ます。ルートミドルウェアは対応するルーティングがマッチしたときに呼び出されます。また、呼び出しは次の例のようにスタックすることが出来ます。

$app->get('/somewhere', function () {
    // ...
})
->before($before1)
->before($before2)
->after($after1)
->after($after2)
;

前処理ミドルウェア (Before Middleware)

前処理 ルートミドルウェアはルーティングのコールバックが実行される前に呼び出されます。ただし、 前処理 アプリケーションミドルウェアよりは後に呼び出されます。

$before = function (Request $request, Application $app) {
    // ...
};

$app->get('/somewhere', function () {
    // ...
})
->before($before);

後処理ミドルウェア (After Middleware)

後処理 ルートミドルウェアは、ルーティングのコールバックが実行された後に呼び出されます。ただし、 後処理 アプリケーションミドルウェアよりは前に呼び出されます。

$after = function (Request $request, Response $response, Application $app) {
    // ...
};

$app->get('/somewhere', function () {
    // ...
})
->after($after);

ミドルウェアの優先度 (Middlewares Priority)

望むがままにたくさんのミドルウェアを追加しても構いません、その場合は、追加した順番と同じ順番でミドルウェアが呼び出されます。

登録メソッドに対し、追加の引数を渡すことで、明示的にミドルウェアの優先度を制御することが可能です。

$app->before(function (Request $request) {
    // ...
}, 32);

利便性のために、出来るだけ早く、出来るだけ遅く、というイベントの登録に用いることが出来る二つの定数が用意されています。

$app->before(function (Request $request) {
    // ...
}, Application::EARLY_EVENT);

$app->before(function (Request $request) {
    // ...
}, Application::LATE_EVENT);

コントローラの省略 (Short-circuiting the Controller)

前処理ミドルウェアがレスポンスオブジェクトを返す場合、リクエスト制御では、以降の前処理ミドルウェアおよびルーティングコールバックの実行を省略し、後処理ミドルウェアにレスポンスを渡します。

$app->before(function (Request $request) {
    // アクセスしたページが保護されている場合ログイン画面にリダイレクトする。
    // redirect the user to the login screen if access to the Resource is protected
    if (...) {
        return new RedirectResponse('/login');
    }
});

Note

前処理ミドルウェアがレスポンスや `` null `` を返さない場合 RuntimeException が投げられます。

commit: 5ae31daefeea39c7fde4b44f8ac92f8e9b7d7b92 original: https://github.com/silexphp/Silex/blob/master/doc/middlewares.rst