Mostrando usuario actual en el registro de
-
26-12-2019 - |
Pregunta
Estoy tratando de crear una personalizada monolog procesador para adjuntar el usuario actual a un error mailer.
Cuando se declara un servicio así:
monolog.processor.mail:
class: MyVendor\Monolog\Processor\MailProcessor
arguments:
- @mailer
- @security.context
tags:
- { name: monolog.processor, method: processRecord }
Puedo obtener una referencia circular:
[Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException]
Circular reference detected for service "monolog.processor.mail",
path: "router -> monolog.logger.router -> monolog.processor.mail
-> security.context -> security.authentication.manager
-> fos_user.user_provider.username_email-> fos_user.user_manager
-> doctrine.orm.default_entity_manager -> doctrine.dbal.default_connection
-> doctrine.dbal.logger -> monolog.logger.doctrine".
¿Cuál sería el la mejor práctica solución aquí?
Una relacionada con el hilo del foro:http://forum.symfony-project.org/viewtopic.php?t=40306&p=131081#p131143
Este hilo demuestra que:
- Setter de inyección no soluciona el problema (he probado esta así)
- Inyectar el contenedor causas del infinitivo recursividad (esto no he confirmado)
También trató este script http://pastebin.com/AuvFgTY3 para conseguir que el usuario de la sesión.
if ($this->session !== null) {
if ($this->session->has($this->securityKey)) {
$token = unserialize($this->session->get($this->securityKey));
$this->currentUser = $token->getUser();
}
}
Esto dio el siguiente error:
Warning: ini_set(): A session is active. You cannot change the session module's ini settings at this time in
C:\inetpub\symfony23\vendor\symfony\symfony\src\Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeFileSessionHandler.php
on line 56
Entiendo que los de seguridad.contexto aún no ha sido construido por los servicios que solicitar al registrador de muy temprano.Para mi clase no es un problema, ya que va a definir el usuario undefined
.Así que lo ideal de la security.context
sería setter inyectado DESPUÉS de la security.context
el servicio ha sido creado.Sin embargo, no podemos cambiar la prioridad de que el registrador se construye muy tarde porque es necesario temprano en.Así que tal vez la pregunta, resuelve:cómo volver a crear de nuevo el servicio después de seguridad.el contexto ha sido inicializado?No se si alcance prototipo podría ayudar aquí??
Solución
Controlador de crear en el kernel de solicitud y extracto de usuario:
// src/AppBundle/Monolog/UserProcessor.php
namespace AppBundle\Monolog;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class UserProcessor
{
private $tokenStorage;
private $user;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
public function __invoke(array $record)
{
if (null !== $this->user) {
$record['extra']['user'] = $this->user->getUsername();
}
return $record;
}
public function onKernelRequest(GetResponseEvent $event)
{
if (null === $token = $this->tokenStorage->getToken()) {
return;
}
if (!is_object($user = $token->getUser())) {
// e.g. anonymous authentication
return;
}
$this->user = $user;
}
}
Registrar nuevo procesador:
# app/config/services.yml
services:
monolog.processor.user:
class: AppBundle\Monolog\UserProcessor
arguments: ["@security.token_storage"]
tags:
- { name: monolog.processor }
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
Symfony Documentación problema