Php Slim 3在中间件中获取当前路由
我想在中间件类中获取当前I路由的名称。以前(在Slim 2.*中),您可以按如下方式获取当前路由:Php Slim 3在中间件中获取当前路由,php,slim,slim-3,Php,Slim,Slim 3,我想在中间件类中获取当前I路由的名称。以前(在Slim 2.*中),您可以按如下方式获取当前路由: $route=$this->app->router->getCurrentRoute(); 但在3.0版本的Slim中,此功能已被删除。我在Slim\App的\u invoke方法中找到了以下代码: // Get the route info $routeInfo = $request->getAttribute('routeInfo'); /** @var \
$route=$this->app->router->getCurrentRoute();
但在3.0版本的Slim中,此功能已被删除。我在Slim\App
的\u 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
。但是,似乎在设置属性之前调用了我的自定义中间件类(通过$this->dispatchRouterAndPrepareRoute($request,$router);
方法)。因为调用$request->getAttribute('routeInfo')
解析为NULL
所以我的问题是,;如何从中间件函数/类获取当前路由(或路由名称)
或者我应该从Slim\App
复制上面的代码吗?以下内容是否为您提供了所需的足够信息,或者您还需要routeInfo中的“请求”位
$app->getContainer()->get('router')->dispatch($req);
如果您还需要'request'位,则需要手动执行与DispatchRoute和dPrepareRoute
相同的操作
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以确定路由:
$app = new Slim\App([
'settings' => [
'determineRouteBeforeAppMiddleware' => true,
]
]);
我不确定这会产生什么样的影响,但它对我有效:)以下是如何在Slim framework 3的中间件中获得当前路径:
$routeInfo = $request->getAttribute('routeInfo');
请注意,您应该在中间件中的\uu 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"
]
}
对于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....
})
然后,如果此路由匹配,中间件示例中的$routeName
将是“index”
。然后,我定义了不需要身份验证的路由数组列表,并检查当前路由是否在该列表中。例如
if (!in_array($routeName, $publicRoutesArray))
{
# @TODO - check user logged in and redirect if not.
}
获取当前路线,即使是在中间件中
感谢您的回答!这解决了我的问题,但感觉不对,因为这是一个比Slim 2.*方法更复杂的解决方案代码>在中间件内部。没有这个,$routeInfo什么都不是。这是专门针对应用程序中间件的。此外,如果路由不存在,则@Samarizvi的答案中的$route
将为空,并更改此设置。我在中间件中获取当前路由时也遇到问题。我已经设置了'determiniteroutebeeforeappmiddleware'=>true
并且当我设置$route=$request->getAttribute('route')代码>我得到了一个对象(Slim\Route),但当我这样做时,$routeName=$Route->getName()代码>我得到空值。有人有什么建议吗?您是否通过setName()
方法命名路线?()Thx@Wessel。问题在于声明路由后缺少setName()
方法。
if (!in_array($routeName, $publicRoutesArray))
{
# @TODO - check user logged in and redirect if not.
}
$request->getUri()->getPath()