Slim 3在中间件中获取当前路由

时间:2015-12-27 00:10:06

标签: php slim slim-3

我想在中间件类中获取当前I路由的名称。以前(在Slim 2. *中)你可以像这样获取当前路线:

$route = $this->app->router->getCurrentRoute();

但是这个功能已在3.0版的Slim中删除了。我在__invoke的{​​{1}}方法中找到了以下代码:

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。但似乎我的自定义中间件类在设置属性之前被调用(通过Request方法)。因为调用$this->dispatchRouterAndPrepareRoute($request, $router);会解析为$request->getAttribute('routeInfo')

所以我的问题是;如何从中间件函数/类获取当前路由(或路由名称)?

或者我应该从NULL

复制上面的代码

4 个答案:

答案 0 :(得分:6)

显然,您可以使用此设置配置Slim以确定进入中间件之前的路由:

$app = new Slim\App([
    'settings'  => [
        'determineRouteBeforeAppMiddleware' => true,
    ]
]);

我不确定这会产生什么样的影响,但它对我有用:)

答案 1 :(得分:6)

$request->getUri()->getPath()

获取当前路线,即使在middleware

答案 2 :(得分:1)

以下内容是否为您提供了所需的足够信息,或者您是否还需要“请求”。在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()];

希望这有帮助。

答案 3 :(得分:0)

以下是如何在Slim框架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"
    ]
  }