Mezon Router: 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