在 Slim 4 中访问中间件中的路由参数
Accessing route parameters in middleware in 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__
这些似乎都不包含参数。
您需要的内容已记录在案 here。您可以使用中间件中的请求对象创建路由上下文和路由对象本身。请记住,您必须添加路由中间件才能使其正常工作。这是一个例子:
<?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
,您会看到中间件知道参数值。
我想知道如何在 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 中我们可以
__routingResults__
__route__
__basePath__
这些似乎都不包含参数。
您需要的内容已记录在案 here。您可以使用中间件中的请求对象创建路由上下文和路由对象本身。请记住,您必须添加路由中间件才能使其正常工作。这是一个例子:
<?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
,您会看到中间件知道参数值。