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í??

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top