2012-01-11 16 views
9

リスナー内のデータベース情報にアクセスする必要があります。 私たちは、リスナーが似ているservice.yml でリスナーを設定します。私たちはonKernelRequest機能で教義にアクセスするにはどうすればよいSymfony 2のリスナーのデータベースへのアクセス

namespace company\MyBundle\Listener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class RequestListener 
{ 
    protected $container; 

public function __construct(ContainerInterface $container) 
{ 
    $this->container = $container; 
} 

public function onKernelRequest(GetResponseEvent $event) 
{ 
... 

私は、コントローラから延びており、実行しようとしました:

 $em = $this->getDoctrine()->getEntityManager(); 

、それは動作しますが、私はこれは悪い習慣だと思います。

+0

すべてのコメントに感謝します。すべてが良いオプションです。 – Santi

答えて

27

サービスコンテナを挿入するだけで済みます。まず、EntityManagerを取得するためのコンストラクタを変更します。

use Doctrine\ORM\EntityManager; 

class RequestListener { 
    protected $em; 
    function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 
    //... 
} 

そして、次のあなたのサービスを設定します。

#... 
services: 
    foo.requestlistener: 
     class: %foo.requestlistener.class% 
     arguments: 
      - @doctrine.orm.entity_manager 
+0

ありがとう、良いオプションです – Santi

+3

これは最適なオプションです。 –

+0

「Symfony \ Component \ DependencyInjection \ ContainerInterfaceを使用する」を追加していただきありがとうございます。 – someuser

2

リスナーにサービスコンテナを注入しているように思えるので、あなたは、このよう教義にアクセスすることができます。私はまだsymfonyので初心者のようなものだ

$doctrine = $this->container->get('doctrine'); 
1

、しかし、あなたが渡して試してみましたdoctrineサービスコンテナの代わりにリスナーにサービスを提供しますか?

サービスコンテナを既に渡しているので、
$this->container->get('doctrine')を呼び出すだけで簡単です。また、IRCでは、サービスコンテナを渡すことは、通常、悪い習慣とみなされることがありました。必要な個々のサービスに合格する方がよいでしょう。

+0

ありがとう、良いオプションです – Santi

0

インクルードイベントを聴くためだけであるように私はリスナーにビジネスロジックを入れていないだろう。 doctrineを使用してリスナーのテストを書く方法を教えてください。

私はDoctrineに別のクラスにアクセスしてリスナーで呼び出します。

2

ご利用の場合は、あなたがdirectely

#services.yml 
qis.listener.contractBundleStatusListener: 
    class: Acme\AppBundle\EventListener\MyListener 
    tags: 
     - { name: doctrine.event_listener, event: postPersist } 

あなたはLifecycleEventArgsからエンティティマネージャを取得することができます教義のイベントリスナーを使用することができます場合:

<?php 

use Doctrine\ORM\Event\LifecycleEventArgs; 

class MyListener 
{ 
    public function postPersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     if ($entity instanceof Foo) { 
      $entityManager = $args->getEntityManager(); 

      $entityManager->persist($entity); 
      $entityManager->flush(); 
     } 
    } 
} 
関連する問題