2015-10-21 4 views
2

Я хотел бы добавить userId и username, предоставленный FOSUserBundle, в мой регистратор (монолог). Я следовал this tutorial, чтобы иметь возможность регистрировать IP-адрес, он работает.Symfony/Monolog: Пользовательский процессор с данными FOSUserBundle

Мой код ниже перерывов, потому что $this->tokenStorage->getToken() является NULL, даже если я вошел в систему.

services.yml

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

AppBundle/Журнал/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; 
    } 
} 

Любые идеи? Спасибо заранее!

+0

Я бы сказал, что проблема, вероятно, в том, что процессор вызывается для регистрации чего-либо, прежде чем безопасность сможет действовать и получить текущего пользователя. Существует очень мало, что вы можете сделать, если это так, просто проверьте, существует ли токен, и если он не регистрирует пользователя –

+0

@CarlosGranados Похоже, вы правы. Имеет смысл! Я успешно протестировал процессор с помощью настраиваемого обработчика/канала, который я вызывал в контроллерах (где безопасность доступна). Просто отправьте свой комментарий в качестве ответа, и я приму его. Благодаря! –

ответ

2

Проблема в том, что процессор вызывается для регистрации чего-либо, прежде чем безопасность сможет действовать и получить текущего пользователя. Просто проверьте, существует ли токен, и если он не регистрирует пользователя