如何从苗条的中间件获取属性



当我尝试在 Slim 4 的先前中间件中获取属性集时,我遇到了问题。

我在应用程序/中间件中使用中间件.php
我使用 JwtAuthentication 中间件来检查令牌,我想将解码的令牌传递给下一个中间件:CheckTokenInDatabaseMiddleware。

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

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

我有一个纤细的骨架并使用这个:

应用/中间件.php

declare(strict_types=1);
use AppApplicationMiddlewareCheckTokenInDatabaseMiddleware;
use AppApplicationMiddlewareSessionMiddleware;
use PsrHttpMessageResponseInterface as Response;
use PsrHttpMessageServerRequestInterface as Request;
use SlimApp;
use TuupolaMiddlewareJwtAuthentication;
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);
};

app/application/Middleware/CheckTokenInDatabaseMiddleware.php

declare(strict_types=1);
namespace AppApplicationMiddleware;
use AppDomainUserUserRepository;
use PsrHttpMessageResponseInterface as Response;
use PsrHttpMessageServerRequestInterface as Request;
use PsrHttpServerMiddlewareInterface as Middleware;
use PsrHttpServerRequestHandlerInterface 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);
};

最新更新