Slim 4: Можно ли вызвать промежуточное программное обеспечение маршрута с переданным для него аргументом?

#php #slim

Вопрос:

Я хотел бы вызвать промежуточное программное обеспечение маршрута с параметром, переданным из маршрута при добавлении. Как это возможно?

 $app->get('/path', function($request, $response, $lvlreq = 1) {
    $oViewParams = new libViewParams("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');
};
 

Ответ №1:

Промежуточное программное обеспечение изменено на класс:

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