如何在Slim4中为路由定义设置属性,并在中间件中使用它

问题描述 投票:0回答:1

我需要在路由定义中设置自定义属性,并将其用作路由中间件。例如,我需要管理参考页面以在登录后重定向用户。

这是我的路线定义:

return function (App $app) {
    $app->get('/', Home::class. ':home')->setName('home');
    $app->get('/login', UserAction::class. ':getLogin')->setName('login')->setAttribute('norefer',true);
    $app->post('/login', UserAction::class. ':postLogin');
};

->setAttribute('norefer',true);是我要寻找的,似乎不存在。

我需要在中间件中使用->getAttribute("norefer")来使用此属性,以便我可以存储用户最后访问的可参考页面:

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
    $routeContext = RouteContext::fromRequest($request);
    $route = $routeContext->getRoute();
    if (!empty($route) && !$routeContext->getRoute()->getAttribute("norefer")) {
        $referName = $routeContext->getRoute()->getName();
        $referArgs = $routeContext->getRoute()->getArguments();
        $this->session->set("referName", $referName);
        $this->session->set("referArgs", $referArgs);
    }
    return $handler->handle($request);
}

因此,在会话中,我可以存储最后一个可引用的页面,并在登录过程之后使用它来将用户重定向到他的页面。

slim slim-4
1个回答
0
投票

您可以将NoRefererMiddleware添加到要从重定向逻辑中排除的路由。 NoRefererMiddleware只是将noreferer属性设置为请求对象(如果已调用)。

<?php

use App\Middleware\NoRefererMiddleware;
use Slim\App;

return function (App $app) {
    $app->get('/', Home::class. ':home')->setName('home');
    $app->get('/login', UserAction::class. ':getLogin')->setName('login')->add(NoRefererMiddleware::class);
    $app->post('/login', UserAction::class. ':postLogin');
};

文件:src / Middleware / NoRefererMiddleware.php

<?php

namespace App\Middleware;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

final class NoRefererMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $request = $request->withAttribute('noreferer', true);

        return $handler->handle($request);
    }
}

用法

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
    $noReferer = $request->getAttribute('noreferer');

    if ($noReferer !== true) {
        $routeContext = RouteContext::fromRequest($request);
        $route = $routeContext->getRoute();
        if ($route !== null) {
            $referName = $routeContext->getRoute()->getName();
            $referArgs = $routeContext->getRoute()->getArguments();
            $this->session->set('referName', $referName);
            $this->session->set('referArgs', $referArgs);
        }
    }

    return $handler->handle($request);
}
© www.soinside.com 2019 - 2024. All rights reserved.