首页 > 解决方案 > Slim 4:是否可以调用带有传递参数的路由中间件?

问题描述

我想使用添加时从路由传递的参数调用路由中间件。这怎么可能?

$app->get('/path', function($request, $response, $lvlreq = 1) {
    $oViewParams = new \lib\ViewParams("referencia", "", "", "", "");
    $params = array('viewp' => $oViewParams->getMassParams());
    return $this->get('view')->render($response, 'some.html', $params);
})->add($authenticate)
  ->add($tmhasaccess);

第一个中间件不需要参数,一切顺利。

$authenticate = function (Request $request, RequestHandler $handler) { 
    if (!isset($_SESSION['param'])) {
        $routeContext = RouteContext::fromRequest($request);
        $route = $routeContext->getRoute();
        $redirect = $route->getPattern();
        $_SESSION['urlRedirect'] = $redirect;
        $this->get('flash')->addMessage('error', 'error');
        $response = $handler->handle($request);
        return $response->withStatus(302)->withHeader('Location', '/login');
    } else {
        $response = $handler->handle($request);
        return $response;
    }
    
};
$tmhasaccess = function (Request $request, RequestHandler $handler) {
    ###I need $lvlreq value inside here to work with it. This won't work:
    $routeContext = RouteContext::fromRequest($request);
    $route = $routeContext->getRoute();
    $lvlreq = $route->getArgument('lvlreq');
};

标签: phpslim

解决方案


中间件改为类:

class TMHasAccessMiddleware
{
    protected $lvlreq;
    private $container;
    
    function __construct($container, $lvlreq = 0) {
        $this->lvlreq = $lvlreq;
        $this->container = $container;
    }
    
    public function __invoke(Request $request, RequestHandler $handler): Response
    {
        ##$this->lvlreq now accessible.
    }
}

可以从路由调用:

->add(new TMHasAccessMiddleware($container, 1));

推荐阅读