Flight은 라우트 및 그룹 라우트 미들웨어를 지원합니다. 미들웨어는 라우트 콜백 전(또는 후)에 실행되는 함수입니다. 이는 코드에 API 인증 확인을 추가하거나 사용자가 라우트에 액세스할 권한이 있는지 확인하는 좋은 방법입니다.
다음은 기본 예제입니다:
// 익명 함수만 제공하는 경우 라우트 콜백 전에 실행됩니다. 클래스(아래 참조)를 제외하고 "이후" 미들웨어 함수는 없습니다 Flight::route('/path', function() { echo '여기 있어요!'; })->addMiddleware(function() { echo '첫 번째 미들웨어!'; }); Flight::start(); // 결과는 "첫 번째 미들웨어! 여기 있어요!"가 됩니다.
미들웨어에 대해 사용하기 전에 알아야 할 몇 가지 중요 사항이 있습니다:
Flight::redirect()
function($params) { ... }
public function before($params) {}
__construct()
flight\Engine
미들웨어는 클래스로도 등록할 수 있습니다. "이후" 기능이 필요한 경우 반드시 클래스를 사용해야 합니다.
class MyMiddleware { public function before($params) { echo '첫 번째 미들웨어!'; } public function after($params) { echo '마지막 미들웨어!'; } } $MyMiddleware = new MyMiddleware(); Flight::route('/path', function() { echo '여기 있어요! '; })->addMiddleware($MyMiddleware); // 또는 ->addMiddleware([ $MyMiddleware, $MyMiddleware2 ]); Flight::start(); // 결과는 "첫 번째 미들웨어! 여기 있어요! 마지막 미들웨어!"가 됩니다.
인증 미들웨어가 있고 인증되지 않은 사용자를 로그인 페이지로 리디렉션하려는 경우에는 여러 옵션이 있습니다:
다음은 간단한 return 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 오류를 throw해야 한다고 가정해봅시다. 이렇게 할 수 있습니다:
class MyMiddleware { public function before($params) { $authorization = Flight::request()->headers['Authorization']; if(empty($authorization)) { Flight::jsonHalt(['error' => '이 페이지에 액세스하려면 로그인해야 합니다.'], 403); // 또는 Flight::json(['error' => '이 페이지에 액세스하려면 로그인해야 합니다.'], 403); exit; // 또는 Flight::halt(403, json_encode(['error' => '이 페이지에 액세스하려면 로그인해야 합니다.']); } } }
라우트 그룹을 추가하면 해당 그룹의 모든 라우트에 동일한 미들웨어가 적용됩니다. 이는 헤더의 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 '사용자:'.$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 '사용자:'.$id; }, false, 'user_view'); }, [ new ApiAuthMiddleware() ]);