Skip to content

路由对象

有时在中间件中,你可能需要使用路由的参数。

在下面的示例中,我们首先检查用户是否已登录,然后检查用户是否有权限查看他们正在尝试查看的特定视频。

$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() 方法可以用来操作属性。