Slim 3 получает текущий маршрут в промежуточном программном обеспечении

Я хочу получить имя текущего маршрута в классе промежуточного программного обеспечения. Ранее (в 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 ?

    Related of "Slim 3 получает текущий маршрут в промежуточном программном обеспечении"

    Для 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" ] }