Используя middleware, вы сможете модифицировать стандартные параметры $route и $parameters во что-то совершенно отличное. При этом middleware будет вызываться перед обработкой роута.
При этом есть ряд правил:
- глобальные middleware будут вызываться в порядке их добавления;
- специфичные для конкретного роута middleware так же будут вызываться в порядке их добавления.
Порядок вызова:
- сначала будут вызываться глобальные middleware — $router->addRoute(’*’, ...);
- потом будут вызываться специфичные для роута.
Давайте посмотрим на пример:
$router = new Router();
$router->addRoute("/user/[i:id]", function(string $route, array $parameters){
$userModel = new UserModel();
$userObject = $userModel->getUserById($parameters['id']);
// используем далее $userObject по своему усмотрению
});
А теперь пример со всеми возможностями:
$router = new Router();
// Первый шаг. У нас есть API, которое принимает JSON в теле запроса $router->registerMiddleware('*', function (string $route, array $parameters){
$request = Request::createFromGlobals();
$parameters['_request'] = $request;
$parameters['_body'] = json_decode($request->getContent(), true);
return $parameters; });
// Второй шаг. Убеждаемся, что мы авторизованы
$router->registerMiddleware('*', function (string $route, array $parameters){
// Это публичная зона
if (mb_strpos($route, '/user') !== 0 || empty($parameters['user_id'])) {
return $parameters;
}
$token = $parameters['_request']->headers->get('oauth_token');
$auth = new SomeAuth();
$auth->validateTokenOrFail( $token, $parameters['user_id'] );
// Нет нужды возвращать что-либо
});
// Последний шаг. Теперь мы модифицируем параметры, чтобы обработчик роута мог с ними работать
$router->registerMiddleware('/user/[i:user_id]', function(string $route, array $parameters){
$userModel = new UserModel();
return $userModel->getUserById( $parameters['user_id'] );
});
// Последний момент. Middleware мы добавили и теперь можем обрабатывать роут
$router->addRoute('/user/[i:user_id]', function (UserObject $userObject){
// Do everything
});
Что такое Mezon Router?
mezon/router это:
- фреймворк для роутинга со 100% покрытием кода;
- 10.0 баллов на scrutinizer-ci.com
- роутер является частью проекта Mezon
Репа на github.com: https://github.com/alexdodonov/mezon-router