2012-01-11 25 views
9

Veri dinleyicisine veritabanı bilgisine erişmemiz gerekiyor. Biz service.yml dinleyici de dinleyici yapılandırmak gibidir:Symfony'de dinleyici veritabanına erişim 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) 
{ 
... 

nasıl onKernelRequest işlevine de doktrin erişebilir ?

ben denetleyicisi uzanan çalıştı ve yapın:

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

ve ama bu kötü bir uygulama olduğunu düşünüyorum çalışır.

+0

teşekkür ederiz. Hepsi iyi seçenekler. – Santi

cevap

27

Servis kabını yalnızca enjekte edebilirsiniz.

use Doctrine\ORM\EntityManager; 

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

Ve ertesi yapılandırmak için servis: Öncelikle bir EntityManager almak için yapıcı değiştirmek sadece olayları dinlemek için olduğu gibi

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

Teşekkürler, iyi bir seçenek – Santi

+3

Bu en iyi seçenektir. –

+0

Bir kez ekledim teşekkürler "Symfony \ Component \ DependencyInjection \ ContainerInterface;" – someuser

2

Eğer dinleyici içine servis kabı enjekte ediyorlar gibi görünüyor, bu yüzden bu şekilde Doctrine erişebilirsiniz: Hala Symfony'de bir acemi sayılırım

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

, ancak geçen denedi Servis kapsayıcısı yerine dinleyicinize doctrine servisi?

Alternatif olarak, hizmet kapsayıcısını zaten geçiriyorsunuz, bu nedenle
$this->container->get('doctrine')'u çağırmak kadar basit olmalıdır. Ayrıca, IRC'de bir süre önce servis kabını geçmenin genellikle kötü bir uygulama olduğu düşünülüyordu. İhtiyacınız olan bireysel hizmetleri geçmek daha iyidir.

+0

Teşekkürler, iyi bir seçenek – Santi

0

Ben dinleyici iş mantığı koymak değildir. Ve öğretiyi kullanarak dinleyicinin testlerini nasıl yazardınız?

Doktrinlerin farklı bir sınıfa erişmesini ve ardından dinleyiciye çağırmasını isterim.

2

Kullanım durumunuz size LifecycleEventArgs itibaren Varlık Yöneticisi alabilirsiniz bir Doktrin Etkinlik İşleyici'yi directely

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

kullanmanıza izin veriyorsa: tüm yorumlara

<?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(); 
     } 
    } 
}