2015-10-21 1 views
2

Je voudrais ajouter les userId et username, fournis par FOSUserBundle, à mon Logger (Monolog). J'ai suivi this tutorial pour pouvoir enregistrer l'IP, ça marche.Symfony/Monolog: processeur personnalisé avec FOSUserBundle données

Mon code ci-dessous pauses, parce que $this->tokenStorage->getToken() est NULL, même si je suis connecté.

services.yml

monolog.processor.user: 
    class: AppBundle\Log\UserProcessor 
    arguments: [ "@request_stack", "@security.token_storage" ] 
    tags: 
     - { name: monolog.processor } 

AppBundle/Log/UserProcessor.php

use Symfony\Component\HttpFoundation\RequestStack; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 
use AppBundle\Entity\User; 

class UserProcessor 
{ 
    private $requestStack; 
    private $tokenStorage; 

    public function __construct(RequestStack $requestStack, TokenStorageInterface $tokenStorage) 
    { 
     $this->requestStack = $requestStack; 
     $this->tokenStorage = $tokenStorage; 
    } 

    public function __invoke(array $record) 
    { 
     $username = ''; 
     $userId = 0; 
     $user  = $this->tokenStorage->getToken()->getUser(); 

     // !!! ERROR !!! 
     // $this->tokenStorage->getToken() is NULL 

     if ($user instanceof User) { 
      $username = $user->getUsername(); 
      $userId = $user->getId(); 
     } 

     $record['extra']['user_id'] = $userId; 
     $record['extra']['username'] = $username; 

     return $record; 
    } 
} 

Des idées? Merci d'avance!

+0

Je dirais que le problème est probablement que le processeur est appelé à enregistrer quelque chose avant que la sécurité ait pu agir et obtenir l'utilisateur actuel. Il y a très peu de choses que vous pouvez faire si c'est le cas, il suffit de vérifier si le jeton existe et s'il ne se connecte pas à l'utilisateur –

+0

@CarlosGranados On dirait que vous avez raison. Logique! J'ai testé avec succès le processeur avec un gestionnaire/canal personnalisé que j'ai appelé dans les contrôleurs (où la sécurité est accessible). Postez juste votre commentaire comme réponse et je l'accepterai. Merci! –

Répondre

2

Le problème est que le processeur est appelé pour enregistrer quelque chose avant que la sécurité ait pu agir et obtenir l'utilisateur actuel. Il suffit de vérifier si le jeton existe et s'il ne se connecte pas utilisateur