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

时间:2019-06-26 10:55:04

标签: php doctrine 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);

1 个答案:

答案 0 :(得分:1)

您可能想重新阅读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之后从请求中抓住用户并将其注入到Audit模块中。