Flightはルートおよびグループルートのミドルウェアをサポートしています。ミドルウェアは、ルートコールバックの前(または後)に実行される関数です。これは、コード内にAPI認証チェックを追加したり、ユーザーがルートにアクセスする権限を持っていることを検証するのに便利な方法です。
基本的な例を以下に示します:
// 無名関数のみを指定する場合、ルートコールバックの前に実行されます。 // 「after」ミドルウェア関数はクラスを除いて存在しません(以下を参照) Flight::route('/path', function() { echo 'Here I am!'; })->addMiddleware(function() { echo 'Middleware first!'; }); Flight::start(); // これにより、「Middleware first! Here I am!」と表示されます。
ミドルウェアについて重要な注意事項がいくつかありますので、使用する前に認識しておく必要があります:
Flight::redirect()
function($params) { ... }
public function before($params) {}
__construct()
flight\Engine
ミドルウェアはクラスとしても登録できます。"after"機能が必要な場合は、必ずクラスを使用する必要があります。
class MyMiddleware { public function before($params) { echo 'Middleware first!'; } public function after($params) { echo 'Middleware last!'; } } $MyMiddleware = new MyMiddleware(); Flight::route('/path', function() { echo 'Here I am! '; })->addMiddleware($MyMiddleware); // または ->addMiddleware([ $MyMiddleware, $MyMiddleware2 ]); Flight::start(); // これにより、「Middleware first! Here I am! Middleware last!」が表示されます。
認証ミドルウェアがあるとして、認証されていない場合にユーザーをログインページにリダイレクトしたいとします。その場合、次のオプションがいくつかあります:
次に、単純なfalseを返す例を示します:
class MyMiddleware { public function before($params) { if (isset($_SESSION['user']) === false) { return false; } // trueであるため、すべてが進行し続けます } }
ユーザーをログインページにリダイレクトする例は次のとおりです:
class MyMiddleware { public function before($params) { if (isset($_SESSION['user']) === false) { Flight::redirect('/login'); exit; } } }
APIを構築しているため、JSONエラーをスローする必要があるとしましょう。これは以下のように行えます:
class MyMiddleware { public function before($params) { $authorization = Flight::request()->headers['Authorization']; if(empty($authorization)) { Flight::jsonHalt(['error' => 'You must be logged in to access this page.'], 403); // または Flight::json(['error' => 'You must be logged in to access this page.'], 403); exit; // または Flight::halt(403, json_encode(['error' => 'You must be logged in to access this page.']); } } }
ルートグループを追加し、そのグループ内のすべてのルートに同じミドルウェアを適用できます。これは、例えばヘッダーのAPIキーをチェックするために、多くのルートをグループ化する必要がある場合に便利です。
// グループメソッドの最後に追加 Flight::group('/api', function() { // この「空」に見えるルートは実際には/apiに一致します Flight::route('', function() { echo 'api'; }, false, 'api'); // これは/api/usersに一致します Flight::route('/users', function() { echo 'users'; }, false, 'users'); // これは/api/users/1234に一致します Flight::route('/users/@id', function($id) { echo 'user:'.$id; }, false, 'user_view'); }, [ new ApiAuthMiddleware() ]);
すべてのルートにグローバルミドルウェアを適用する場合は、次のようにして「空の」グループを追加できます:
// グループメソッドの最後に追加 Flight::group('', function() { // これは依然として/usersです Flight::route('/users', function() { echo 'users'; }, false, 'users'); // そしてこれは依然として/users/1234です Flight::route('/users/@id', function($id) { echo 'user:'.$id; }, false, 'user_view'); }, [ new ApiAuthMiddleware() ]);