2016-04-26 11 views
11

in Symfony 2.8/3.0, con i nostri nuovi componenti di sicurezza di fantasia, come faccio ad ottenere attualmente connesso User (cioè FOSUser) oggetto in un servizio senza iniettare l'intero contenitore?Come ottenere il currrent login utente in un servizio

È persino possibile in un modo non hacking ?

PS: non consideriamo "passarlo alla funzione di servizio come parametro" per essere banalmente ovvio. Inoltre, sporco.

risposta

2

se classe estendere di controller

$this->get('security.context')->getToken()->getUser(); 

Oppure, se hai accesso all'elemento contenitore ..

$container = $this->configurationPool->getContainer(); 
$user = $container->get('security.context')->getToken()->getUser(); 

http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

+2

La classe è un servizio, non un controllore (tecnicamente, si * può * essere entrambi, ma è raro e brutto). Inoltre, ho chiesto esplicitamente di non iniettare il controller. Quindi, la tua risposta, sebbene * kinda * corretta, viola entrambe le pre-condizioni quindi è tecnicamente non valida. Grazie comunque. – xDaizu

5

Usando l'iniezione costruttore di dipendenza, si può fare in questo modo:

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 

class A 
{ 
    private $user; 

    public function __construct(TokenStorageInterface $tokenStorage) 
    { 
     $this->user = $tokenStorage->getToken()->getUser(); 
    } 

    public function foo() 
    { 
     dump($this->user); 
    } 
} 
+1

Perché dici che è solo per Symfony 3.3+? Quale parte del tuo codice non funziona nelle versioni precedenti di Symfony? –

+0

Per qualche motivo, pensavo che l'iniezione della dipendenza del costruttore non fosse supportata prima, ma non è vero. Grazie per il tuo commento. – Mateusz

1

Symfony fa in Symfony \ Bundle \ FrameworkBundle \ ControllerControllerTrait

protected function getUser() 
{ 
    if (!$this->container->has('security.token_storage')) { 
     throw new \LogicException('The SecurityBundle is not registered in your application.'); 
    } 

    if (null === $token = $this->container->get('security.token_storage')->getToken()) { 
     return; 
    } 

    if (!is_object($user = $token->getUser())) { 
     // e.g. anonymous authentication 
     return; 
    } 

    return $user; 
} 

Quindi, se si semplicemente iniettare e sostituire security.token_storage, sei a posto.

Problemi correlati