路由对象
有时在中间件中,你可能需要使用路由的参数。
在下面的示例中,我们首先检查用户是否已登录,然后检查用户是否有权限查看他们正在尝试查看的特定视频。
$app
->get('/course/{id}', Video::class . ':watch')
->add(PermissionMiddleware::class);
<?php
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Routing\RouteContext;
class PermissionMiddleware
{
public function __invoke(Request $request, RequestHandler $handler)
{
$routeContext = RouteContext::fromRequest($request);
$route = $routeContext->getRoute();
$courseId = $route->getArgument('id');
// 进行权限逻辑处理...
return $handler->handle($request);
}
}
在路由中获取基路径
要在路由中获取基路径,只需进行以下操作:
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
use Slim\Routing\RouteContext;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->get('/', function(Request $request, Response $response) {
$routeContext = RouteContext::fromRequest($request);
$basePath = $routeContext->getBasePath();
// ...
return $response;
});
属性
通过 PSR-7,你可以将对象/值注入请求对象以便进一步处理。在应用程序的中间件中,通常需要将信息传递给路由闭包,可以通过属性将其添加到请求对象中。
示例:在请求对象上设置值。
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
$app->add(function (Request $request, RequestHandler $handler) {
// 将会话存储添加到请求对象中,以 [只读] 方式
$request = $request->withAttribute('session', $_SESSION);
return $handler->handle($request);
});
示例:如何检索该值。
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
$app->get('/test', function (Request $request, Response $response) {
// 从请求中获取会话
$session = $request->getAttribute('session');
$response->getBody()->write('Yay, ' . $session['name']);
return $response;
});
请求对象还具有批量功能。$request->getAttributes() 和 $request->withAttributes() 方法可以用来操作属性。