Доступ к параметрам маршрута в промежуточном программном обеспечении в Slim 4 - PullRequest
0 голосов
/ 23 апреля 2020

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

При условии, что я определяю маршрут с заполнителем и подключенным промежуточным программным обеспечением:

<?php

// ...

$app
    ->get('/{userId}', Controller::class)
    ->add(Middleware::class);

Мне бы хотелось чтобы получить доступ к значению {userId} из промежуточного программного обеспечения до того, как контроллер будет запущен:

class Middleware
{
    function __invoke($request, $handler)
    {
        // Resolve user ID in this scope?..
        return $handler->handle($request);
    }
}

Я знаю, что в Slim 3 мы могли бы сделать это, обращаясь к атрибутам объекта запроса , однако это не работает в Slim 4. Атрибуты объекта маршрута содержат следующие записи:

  • __routingResults__
  • __route__
  • __basePath__

Кажется, что ни один из них не содержит параметров.

1 Ответ

1 голос
/ 23 апреля 2020

То, что вам нужно, задокументировано здесь . Вы можете создать контекст маршрута и сам объект маршрута, используя объект запроса в вашем промежуточном программном обеспечении. Просто имейте в виду, что для этого нужно добавить промежуточное программное обеспечение для маршрутизации. Вот пример:

<?php                                                                                                                                                                    
use Slim\Factory\AppFactory;                                                                                                                                             
use Slim\Routing\RouteContext;                                                                                                                                           

require __DIR__ . '/../vendor/autoload.php';                                                                                                                             

// Create App                                                                                                                                                            
$app =  AppFactory::create();                                                                                                                                            

Class Middleware                                                                                                                                                         
{                                                                                                                                                                        
    function __invoke($request, $handler)                                                                                                                                
    {                                                                                                                                                                    
        $routeContext = RouteContext::fromRequest($request);                                                                                                             
        $route = $routeContext->getRoute();                                                                                                                              
        // Resolve user ID in this scope                                                                                                                                 
        $id = $route->getArgument('id');                                                                                                                                 
        $response = $handler->handle($request);                                                                                                                          
        $response->getBody()->write("Route parameter value (in middleware): {$id}");                                                                                     
        return $response;                                                                                                                                                
    }                                                                                                                                                                    
}                                                                                                                                                                        

$app->get('/{id}', function($request, $response, $args) {                                                                                                                
    return $response;                                                                                                                                                    
})->add(Middleware::class);                                                                                                                                              

$app->addRoutingMiddleware();                                                                                                                                            

// Run app                                                                                                                                                               
$app->run();

Теперь попробуйте посетить /1 или /2, и вы увидите, что промежуточное ПО знает о значении параметра.

...