2013-08-28 15 views
9

Burada verilen örneğe göre basit bir etkinlik aboneliği oluşturmaya çalışıyorum - http://symfony.com/doc/master/components/event_dispatcher/introduction.html. İşteSymfony2 olay abonesi dinleyicileri çağırmıyor

namespace CookBook\InheritanceBundle\Event; 

use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\EventDispatcher\Event; 

class Subscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     var_dump('here'); 
     return array(
       'event.sample' => array(
         array('sampleMethod1', 10), 
         array('sampleMethod2', 5) 
       )); 
    } 

    public function sampleMethod1(Event $event) 
    { 
     var_dump('Method 1'); 
    } 

    public function sampleMethod2(Event $event) 
    { 
     var_dump('Method 2'); 
    } 
} 

services.yml config var:

namespace CookBook\InheritanceBundle\Event; 

final class EventStore 
{ 
    const EVENT_SAMPLE = 'event.sample'; 
} 

İşte benim olay abone var:

İşte benim olay mağazası

kernel.subscriber.subscriber: 
    class: CookBook\InheritanceBundle\Event\Subscriber 
    tags: 
     - {name:kernel.event_subscriber} 

Ve burada olay yükseltmek nasıl :

use Symfony\Component\EventDispatcher\EventDispatcher; 
use CookBook\InheritanceBundle\Event\EventStore; 
$dispatcher = new EventDispatcher(); 
$dispatcher->dispatch(EventStore::EVENT_SAMPLE); 

Beklenen çıkışı:

string 'here' (length=4) 
string 'Method 1' (length=8) 
string 'Method 2' (length=8) 

Gerçek çıkışı: Nedense

string 'here' (length=4) 

, dinleyici yöntemleri diye almıyoruz. Bu kodun nesi yanlış bilen var mı? Teşekkürler.

cevap

7

Sen yerleştirmeyi deneyebilir yapılandırılmış EventDispatcher (@event_dispatcher) yerine yenisini (new EventDispatcher)

instanciating arasında sadece Symfony'nin hala bu yeni oluşturulan EventDispatcher nesnesine hiçbir başvurusu olan bir olay dinleyicisi oluşturun ve eklerseniz ve kullanmayacaksın.

Eğer ContainerAware uzanan bir denetleyici içinde ise:

ben hem soruların bağlam farklı olsa this question's answer cevabım sayesinde adapte ettik
use Symfony\Component\EventDispatcher\EventDispatcher; 
use CookBook\InheritanceBundle\Event\EventStore; 

... 

$dispatcher = $this->getContainer()->get('event_dispatcher'); 
$dispatcher->dispatch(EventStore::EVENT_SAMPLE); 

, cevap hâlâ geçerlidir.

+0

Alkış, Tristan: bunu yaparsanız

Sizin örnek beklendiği gibi çalışır. Symfony'de bağımlılık enjeksiyonu anlayışımı tekrar gözden geçirmeliyim. – Prathap

+3

Size daha çok veya daha az görüyorum sadece kopyala yapıştırılmış cevabım [burada] (http://stackoverflow.com/questions/17671825/how-to-take-advantage-of-kernel-terminate-inside-an-event-listener) burada referans vermeden kendi sorunuza - bir dahaki sefere orijinal cevaplayıcıya biraz kredi veriniz :) – nifr

+0

Tamamen ben bağlantıyı farklı olduğu için bağlantı kurmamıştım, benim için zaten bir dinleyicideydim, o yüzden korktum şeyleri karıştırırdı. Ama cevabınız bu soru için tamamen geçerli. –

8

@Tristan ne dedi. Hizmetler dosyanızdaki etiketler bölümü Symfony Bundle'ın bir parçasıdır ve yalnızca dağıtıcıyı kapsayıcıdan çıkarırsanız işlenir.

$dispatcher = new EventDispatcher(); 
$dispatcher->addSubscriber(new Subscriber()); 
$dispatcher->dispatch(EventStore::EVENT_SAMPLE); 
+0

Şerefe, Cerad. Özellikle Tristan'ın sunduğu şey olan config dosyasından enjeksiyon arıyordum. – Prathap

+2

Tamamen anlıyorum. @Tristan krediyi hak ediyor. Bu, yayınlanan kodunuzun karşısına neden kaptan çalıştığını belgelemek için daha fazla oldu. – Cerad