簡體   English   中英

如何從苗條的中間件獲取屬性

[英]How to getAttribute from middleware in slim

當我嘗試在 Slim 4 的先前中間件中獲取屬性集時遇到問題。

我在 app/middleware.php 中使用中間件
我使用 JwtAuthentication 中間件來檢查令牌,我想將解碼后的令牌傳遞給下一個中間件:CheckTokenInDatabaseMiddleware。

我用解碼后的令牌返回了 $request : return $response->withAttribute("decoded", $arguments['decoded']);

在 CheckTokenInDatabaseMiddleware 中, $request->getAttribute('decoded') 返回 NULL

我有一個苗條的骨架並使用這個:

應用程序/中間件.php

declare(strict_types=1);

use App\Application\Middleware\CheckTokenInDatabaseMiddleware;
use App\Application\Middleware\SessionMiddleware;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\App;
use Tuupola\Middleware\JwtAuthentication;

return function (App $app) {
    $app->add(SessionMiddleware::class);
    $app->add(new JwtAuthentication([
        "ignore" => ['/auth/signin', '/auth/signout'],
        'path' => ['/auth/me'],
        'secret' => getenv('JWT_SECRET'),
        "before" => function (Request $request, $arguments) {
            return $request->withAttribute("decoded", $arguments["decoded"]);
        }
    ]));
    $app->add(CheckTokenInDatabaseMiddleware::class);
};

應用程序/應用程序/中間件/CheckTokenInDatabaseMiddleware.php

declare(strict_types=1);

namespace App\Application\Middleware;

use App\Domain\User\UserRepository;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\MiddlewareInterface as Middleware;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;

class CheckTokenInDatabaseMiddleware implements Middleware
{
    protected $userRepository;

    /**
     * {@inheritdoc}
     */
    public function process(Request $request, RequestHandler $handler): Response
    {
        $token = $request->getAttribute('decoded');

        var_dump($token); // returns NULL
        die();

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

    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }
}

我找到了答案。
在超薄中間件中,您必須記住它是 FILO。 因此,如果要將屬性從中間件 A 傳遞給中間件 B,則必須將它們按相反順序放置,即:

應用程序/中間件.php

...
return function (App $app) {
    $app->add(BMiddleware::class);
    $app->add(AMiddleware::class);
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM