我想在中间件类中获取当前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
?
答案 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"
]
}