Я хочу получить имя текущего маршрута в классе промежуточного программного обеспечения. Ранее (в Slim 2. *) вы могли бы получить текущий маршрут следующим образом:
$route = $this->app->router->getCurrentRoute();
Но эта функция была удалена в версии 3.0 Slim. Я нашел следующий код в методе __invoke
для Slim\App
:
// Get the route info $routeInfo = $request->getAttribute('routeInfo'); /** @var \Slim\Interfaces\RouterInterface $router */ $router = $this->container->get('router'); // If router hasn't been dispatched or the URI changed then dispatch if (null === $routeInfo || ($routeInfo['request'] !== [$request->getMethod(), (string) $request->getUri()])) { $request = $this->dispatchRouterAndPrepareRoute($request, $router); $routeInfo = $request->getAttribute('routeInfo'); }
Это указывает, что текущий маршрут хранится как атрибут routeInfo
в routeInfo
. Но кажется, что мой пользовательский класс промежуточного слоя вызывается до того, как атрибут установлен (методом $this->dispatchRouterAndPrepareRoute($request, $router);
). Потому что вызов $request->getAttribute('routeInfo')
разрешает NULL
.
Поэтому мой вопрос: как я могу получить текущий маршрут (или название маршрута) из функции / класса промежуточного программного обеспечения?
Или мне нужно просто скопировать часть кода из Slim\App
?
Для Slim3 приведен пример, показывающий, как получить информацию о маршрутизации из промежуточного программного обеспечения, что на самом деле представляет собой комбинацию предыдущих ответов.
<?php $slimSettings = array('determineRouteBeforeAppMiddleware' => true); // This is not necessary for this answer, but very useful if (ENVIRONMENT == "dev") { $slimSettings['displayErrorDetails'] = true; } $slimConfig = array('settings' => $slimSettings); $app = new \Slim\App($slimConfig); $myMiddleware = function ($request, $response, $next) { $route = $request->getAttribute('route'); $routeName = $route->getName(); $groups = $route->getGroups(); $methods = $route->getMethods(); $arguments = $route->getArguments(); print "Route Info: " . print_r($route, true); print "Route Name: " . print_r($routeName, true); print "Route Groups: " . print_r($groups, true); print "Route Methods: " . print_r($methods, true); print "Route Arguments: " . print_r($arguments, true); }; // Define app routes $app->add($myMiddleware); $app->get('/', function (\Slim\Http\Request $request, Slim\Http\Response $response, $args) { # put some code here.... })
В моем случае я хотел добавить промежуточное программное обеспечение, которое обеспечило бы вход пользователя на определенные маршруты и перенаправление на страницу входа в систему, если бы они не были. Я нашел, что самый простой способ сделать это – использовать ->setName()
на маршрутах, например:
$app->get('/', function (\Slim\Http\Request $request, Slim\Http\Response $response, $args) { return $response->withRedirect('/home'); })->setName('index');
Затем, если этот маршрут был сопоставлен, $routeName
в примере промежуточного программного обеспечения будет "index"
. Затем я определил список массивов маршрутов, которые не требуют проверки подлинности, и проверил, был ли текущий маршрут в этом списке. Например
if (!in_array($routeName, $publicRoutesArray)) { # @TODO - check user logged in and redirect if not. }
Очевидно, вы можете настроить Slim для определения маршрута, прежде чем переходить к промежуточному программному обеспечению с помощью этого параметра:
$app = new Slim\App([ 'settings' => [ 'determineRouteBeforeAppMiddleware' => true, ] ]);
Я не уверен, какое влияние это имеет, но это работает для меня 🙂
$request->getUri()->getPath()
Получить текущий маршрут, даже в middleware
.
Предоставляет ли следующая информация достаточную вам информацию или вам также нужен бит запроса в routeInfo?
$app->getContainer()->get('router')->dispatch($req);
Если вам также нужен бит «запрос», вам необходимо вручную сделать то же самое, что и dispatchRouterAndPrepareRoute
.
if ($routeInfo[0] === Dispatcher::FOUND) { $routeArguments = []; foreach ($routeInfo[2] as $k => $v) { $routeArguments[$k] = urldecode($v); } $route = $router->lookupRoute($routeInfo[1]); $route->prepare($request, $routeArguments); // add route to the request's attributes in case a middleware or handler needs access to the route $request = $request->withAttribute('route', $route); } $routeInfo['request'] = [$request->getMethod(), (string) $request->getUri()];
Надеюсь это поможет.
Вот как вы получаете текущий маршрут в своем промежуточном программном обеспечении в Slim framework 3:
$routeInfo = $request->getAttribute('routeInfo');
Обратите внимание, что вы должны использовать это внутри функции __invoke()
в вашем промежуточном программном обеспечении. Вот пример использования:
public function __invoke($request, $response, $next) { .... $routeInfo = $request->getAttribute('routeInfo'); .... }
$ routeInfo должен содержать объект, например:
{ "0": 1, "1": "route6", "2": { "name": "loremipsum" }, "request": [ "POST", "http://example.org/loremipsum" ] }