Найти тему
Алексей Додонов

Mezon Router: middleware и модификация параметров

Оглавление

Используя 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 это:

  1. фреймворк для роутинга со 100% покрытием кода;
  2. 10.0 баллов на scrutinizer-ci.com
  3. роутер является частью проекта Mezon

Репа на github.com: https://github.com/alexdodonov/mezon-router

Будет здорово, если вы поучаствуете в жизни проекта. Это может быть написание документации, рекомендации друзьям в социальных сетях, правка багов, рефакторинг, или даже запрос тикета на новую функциональность. В любом случае большое спасибо.