如何在 Zend Expressive 的 Doctrine 事件订阅者中获取用户对象

How to get User object in Doctrine event subscriber in Zend Expressive

基于 https://github.com/DamienHarper/DoctrineAuditBundle 我正在尝试为我的 Zend Expressive 应用程序开发审计模块。 但是我不知道如何在审计逻辑中获取用户数据(id)。

我看到 $user 作为请求属性传递 vendor/zendframework/zend-expressive-authentication/src/AuthenticationMiddleware.php,但这并不能通过

提供
$container->get(\Psr\Http\Message\ServerRequestInterface::class)->getAttribute(\Zend\Expressive\Authentication\UserInterface::class);

您可能想再次阅读有关 concept of middleware 的内容。简而言之,expressive 有一个中间件堆栈,根据请求,它通过特定的中间件层发送请求。

在您的示例中,请求通过 AuthenticationMiddleware。所以如果你有这个作为你的管道:

$app->pipe(AuthenticationMiddleware::class);
$app->pipe(AuditMiddleware::class);

请求首先通过 AuthenticationMiddleware,这使得 UserInterface 在请求中可用,然后通过 AuditMiddleware。

在 AuditMiddleware 和 AuthenticationMiddleware 之后的所有中间件中,您可以像这样访问 UserInterface:

function (ServerRequestInterface $request, RequestHandlerInterface $handler)
{
    $user = $request->getAttribute(UserInterface::class);

    // Do stuff here

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

因此,在您的情况下,您可能需要编写一个 AuditMiddleware 来从 AuthenticationMiddleware 之后的请求中获取用户并将其注入到您的审计模块中。