Slim 3 get current route in middleware

后端 未结 5 1927
故里飘歌
故里飘歌 2021-01-04 13:30

I want to get the name of the current I route in a middleware class. Previously (in Slim 2.*) you could fetch the current route like so:

$route = $this->ap

相关标签:
5条回答
  • 2021-01-04 14:03
    $request->getUri()->getPath()
    

    Get current Route, even in middleware.

    0 讨论(0)
  • 2021-01-04 14:05

    For Slim3, here is an example showing you how to get routing information from within middleware, which is actually a combination of previous answers put together.

    <?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....
    })
    

    In my case, I wanted to add middleware that would ensure the user was logged in on certain routes, and redirect them to the login page if they weren't. I found the easiest way to do this was to use ->setName() on the routes like so:

    $app->get('/', function (\Slim\Http\Request $request, Slim\Http\Response $response, $args) {
        return $response->withRedirect('/home');
    })->setName('index');
    

    Then if this route was matched, the $routeName in the middleware example will be "index". I then defined my array list of routes that didn't require authentication and checked if the current route was in that list. E.g.

    if (!in_array($routeName, $publicRoutesArray))
    {
        # @TODO - check user logged in and redirect if not.
    }
    
    0 讨论(0)
  • 2021-01-04 14:06

    Does the following provide you with sufficient information you require or do you also need the 'request' bit in routeInfo?

    $app->getContainer()->get('router')->dispatch($req);
    

    If you also require the 'request' bit then you will need to manually do the same thing dispatchRouterAndPrepareRoute does.

    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()];
    

    Hope this helps.

    0 讨论(0)
  • 2021-01-04 14:17

    Here's how you get current route in your middleware in Slim framework 3:

    $routeInfo = $request->getAttribute('routeInfo');
    

    Note that you should use this inside __invoke() function in your middleware. Here's the sample usage:

    public function __invoke($request, $response, $next)
        {
            ....
            $routeInfo = $request->getAttribute('routeInfo');
            ....
        }
    

    $routeInfo shall then contain an object like:

    {
        "0": 1,
        "1": "route6",
        "2": {
          "name": "loremipsum"
        },
        "request": [
          "POST",
          "http://example.org/loremipsum"
        ]
      }
    
    0 讨论(0)
  • 2021-01-04 14:19

    Apparently you can configure Slim to determine the route before going into the middleware with this setting:

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

    I'm not sure what kind of impact this has, but it works for me :)

    0 讨论(0)
提交回复
热议问题