【发布时间】:2016-04-01 07:04:32
【问题描述】:
我想在中间件类中获取当前 I 路由的名称。以前(在 Slim 2.* 中)您可以像这样获取当前路线:
$route = $this->app->router->getCurrentRoute();
但是这个功能在 Slim 3.0 版本中已经去掉了。我在Slim\App的__invoke方法中发现了如下代码:
// 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。
所以我的问题是;如何从中间件函数/类中获取当前路由(或路由名称)?
或者我应该从Slim\App复制上面的代码吗?
【问题讨论】:
-
我也无法在中间件中获取当前路由。我已经设置了
'determineRouteBeforeAppMiddleware' => true,当我设置$route = $request->getAttribute('route');时,我得到了一个对象(Slim\Route),但是当我设置$routeName = $route->getName();时,我得到了空值。有人有什么建议吗? -
您是否通过
setName()方法命名了路线? (slimframework.com/docs/objects/router.html#route-names) -
谢谢@Wessel。问题是声明路由后缺少
setName()方法。