2016-10-17 7 views
2

新しいPlasmid Entityを登録するときに、自動名(p0001、p0002、p0003など)を指定したい場合、データベースで最後のPlasmidエンティティを選択する必要があります特定のUser、そのautoNameを取得し、この前の名前を使用して新しい名前を定義します。Doctrine EventListenerでユーザーを取得する

しかし、私はリスナーにtoken_storageを注入すると、トークンはnullです...コントローラでは、私はそのユーザーを持つことができます、それは仕事です。

service.yml

app.event_listener.plasmid: 
    class: AppBundle\EventListener\PlasmidListener 
    arguments: ["@security.token_storage"] 
    tags: 
     - { name: doctrine.event_listener, event: prePersist } 

そして、PlasmidListener

class PlasmidListener 
{ 
private $user; 

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

public function prePersist(LifecycleEventArgs $args) 
{ 
    $entity = $args->getEntity(); 

    // If the entity is not a Plasmid, return 
    if (!$entity instanceof Plasmid) { 
     return; 
    } 

    // Else, we have a Plasmid, get the entity manager 
    $em = $args->getEntityManager(); 

    // Get the last plasmid Name 
    $lastPlasmid = $em->getRepository('AppBundle:Plasmid')->findLastPlasmid($this->user); 

    // Do something with the last plasmid in the database 
} 
} 

私は教義リスナーの実際のユーザーを取得することができますなぜ誰かが知っている場合は?

おかげ

答えて

2

私はあなたがあなたのサービスの代わりに、ユーザーオブジェクトにtokenStorageクラスへのポインタ格納すべきだと思う:

class PlasmidListener 
{ 
    private $tokenStorage; 

    public function __construct(TokenStorage $tokenStorage) 
    { 
     $this->tokenStorage = $tokenStorage; 
    } 

    public function prePersist(LifecycleEventArgs $args) 
    { 
     $user = $this->tokenStorage->getToken()->getUser(); 
     //... 
    } 
} 
+0

おかげで多くのことを、それは動作しますが、TokenStorageである理由あなたのアイデアを持っていますコンストラクタで空であり、prePersist関数に何かが含まれていますか? – mpiot

+0

サービスは開始時に初期化され、ユーザーはまだ認証されません。ユーザーとトークンでもリクエスト中に変更できますが、サービスはありませんが、静的なプロパティを持つ静的クラスに似ています。それは私の考えです:) – malcolm

関連する問題