Как получить объект User в подписчике событий Doctrine в Zend Expressive - PullRequest
0 голосов
/ 26 июня 2019

На основе 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 Ответ

1 голос
/ 27 июня 2019

Возможно, вы захотите еще раз прочитать о концепции промежуточного программного обеспечения .Вкратце, 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 и вставляет его в ваш модуль аудита.

...