2016-04-26 12 views
11

In Symfony 2.8/3.0, mit unserer Phantasie neuen Sicherheitskomponenten zu erhalten, wie bekomme ich die aktuell angemeldeten User (dh FOSUser) Objekt in einem Service ohne die ganze Injektion Container?Wie die currrent angemeldeten Benutzer in einem Service

Ist es sogar in einem non-hacky Weise möglich?

PS: Betrachten wir nicht die "übergeben Sie es an die Service-Funktion als Parameter" für trivially offensichtlich. Auch, schmutzig.

Antwort

2

wenn Sie Klasse-Controller erweitern

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

Oder wenn Sie Zugriff auf das Containerelement haben.

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

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

+2

Die Klasse ist ein Service, kein Controller (technisch, es * kann * beides sein, aber es ist selten und hässlich). Außerdem habe ich ausdrücklich darum gebeten, den Controller nicht zu injizieren. Also, Ihre Antwort, obwohl * irgendwie * korrekt, verletzt beide Bedingungen, so dass es technisch ungültig ist. Trotzdem danke. – xDaizu

5

Mit Konstruktor Dependency Injection, können Sie es auf diese Weise tun:

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

Warum sagst du, es ist nur für Symfony 3.3+? Welcher Teil deines Codes funktioniert nicht in älteren Versionen von Symfony? –

+0

Aus irgendeinem Grund dachte ich, dass die Abhängigkeitsinjektion von Konstruktoren nicht früher unterstützt wurde, aber das stimmt nicht. Danke für deinen Kommentar. – Mateusz

1

Symfony tut dies 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; 
} 

Also, wenn Sie einfach injizieren und ersetzen security.token_storage, du bist gut zu gehen.