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(); // Это выведет "Сначала промежуточное программное обеспечение! Вот я! Последнее промежуточное программное обеспечение!"
Предположим, у вас есть промежуточное программное обеспечение аутентификации и вы хотите перенаправить пользователя на страницу входа, если он не аутентифицирован. У вас есть несколько вариантов действий:
Вот простой пример с возвратом false:
class MyMiddleware { public function before($params) { if (isset($_SESSION['user']) === false) { return false; } // поскольку это верно, всё продолжает идти } }
Вот пример перенаправления пользователя на страницу входа:
class MyMiddleware { public function before($params) { if (isset($_SESSION['user']) === false) { Flight::redirect('/login'); exit; } } }
Предположим, вам нужно сгенерировать JSON-ошибку, потому что вы создаете API. Вы можете сделать это следующим образом:
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() ]);