在Slim 4中访问中间件中的路由参数



我想知道如何在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__

这些似乎都不包含参数。

您需要的东西在这里有文档记录。您可以使用中间件中的请求对象来创建路由上下文和路由对象本身。请记住,您必须添加路由中间件才能正常工作。这里有一个例子:

<?php                                                                                                                                                                    
use SlimFactoryAppFactory;                                                                                                                                             
use SlimRoutingRouteContext;                                                                                                                                           
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,您会看到中间件知道参数值。

最新更新