Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Slim 3在中间件中获取当前路由_Php_Slim_Slim 3 - Fatal编程技术网

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

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 \

我想在中间件类中获取当前I路由的名称。以前(在Slim 2.*中),您可以按如下方式获取当前路由:


$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()