Question

Je suis en train de créer un personnalisé monolog processeur de joindre l'utilisateur actuel à une erreur mailer.

Lors de la déclaration de services comme:

monolog.processor.mail:
        class: MyVendor\Monolog\Processor\MailProcessor
        arguments:
            - @mailer
            - @security.context
        tags:
            - { name: monolog.processor, method: processRecord }

Je reçois une référence circulaire:

[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".

Quel serait l' les meilleures pratiques la solution ici?

Un fil relié au forum:http://forum.symfony-project.org/viewtopic.php?t=40306&p=131081#p131143

Ce fil de discussion montre que:

  • Injection par mutateur ne résout pas le problème (j'ai essayé aussi)
  • L'injection du récipient provoque un verbe à l'infinitif récursivité (ce que je n'ai pas confirmé)

Aussi essayé ce script http://pastebin.com/AuvFgTY3 pour obtenir de l'utilisateur de la session.

if ($this->session !== null) {
    if ($this->session->has($this->securityKey)) {
        $token = unserialize($this->session->get($this->securityKey));
        $this->currentUser = $token->getUser();
    }
}

Cela a donné le message d'erreur suivant:

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

Je ne comprends que la sécurité.le contexte n'a pas encore été construire pour les services qui en font la demande, l'enregistreur de données très tôt.Pour ma classe c'est pas un problème puisque je vais le mettre à l'utilisateur de undefined.Donc, idéalement le security.context serait setter injecté APRÈS le security.context le service a été créé.Cependant je ne peux pas changer la priorité sur l'enregistreur à être construit très tard parce que c'est nécessaire dès le début.Alors peut-être la question, décide:comment recréer à nouveau le service après la sécurité.le contexte a été initialisé?Vous ne savez pas si la portée prototype serait m'aider??

Était-ce utile?

La solution

Gestionnaire de créer sur le noyau de la demande et de l'extrait de l'utilisateur:

// 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;
    }
}

Enregistrer le nouveau processeur:

# 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 }

Documentation Symfony a un problème

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top