2013-04-05 17 views
5

İki paket içeren bir programım var. Bunlardan biri (CommonBundle) bir olayı "common.add_channel" gönderirken, diğerinde (FetcherBundle) bir servisin onu dinlemesi gerekiyordu. Profilleyicide, "Called Listeners" bölümünde common.add_channel olayını görebiliyorum. Symfony neden dinleyicimi kaydetmediğini anlamıyorum. Neden symfony2 olay dinleyicileri çağırmıyor?

Bu

benim aksiyon, CommonBundle\Controller\ChannelController::createAction içindedir:

$dispatcher = new EventDispatcher(); 
$event = new AddChannelEvent($entity);   
$dispatcher->dispatch("common.add_channel", $event); 

Bu benim AddChannelEvent:

<?php 

namespace Naroga\Reader\FetcherBundle\Service; 

class FetcherService { 

    public function onAddChannel(AddChannelEvent $event) { 
     die("It's here!");  
    } 
} 
: Bu benim dinleyici (FetcherService.php) olması gerekiyordu

<?php 

namespace Naroga\Reader\CommonBundle\Event; 

use Symfony\Component\EventDispatcher\Event; 
use Naroga\Reader\CommonBundle\Entity\Channel; 

class AddChannelEvent extends Event { 

    protected $_channel; 

    public function __construct(Channel $channel) { 
     $this->_channel = $channel; 
    } 

    public function getChannel() { 
     return $this->_channel; 
    } 

} 

Ve işte dinleyicimi kaydediyorum (services.yml):

kernel.listener.add_channel: 
    class: Naroga\Reader\FetcherBundle\Service\FetcherService 
    tags: 
     - { name: kernel.event_listener, event: common.add_channel, method: onAddChannel } 

Neyi yanlış yapıyorum? Common.add_channel'i gönderdiğimde neden etkinlik dinleyicisini çağırıyor?

+0

Standart symfony soru: Eğer services.yml içinde dinleyicisi ekledikten sonra önbelleği temizlendi mi var? –

+0

Evet. Her bir pagehit'de app_dev.php kullanıyorsanız, ihtiyaç duyduğu şey değil, services.yml'deki herhangi bir değişiklik önbelleğe yeniden derlenir. Yine de birçok kez temizledim. –

cevap

12

Yeni etkinlik görevlisi, başka bir dağıtıcıda ayarlanan dinleyiciler hakkında hiçbir şey bilmiyor.

Denetleyicinizde, event_dispatcher hizmetine erişmeniz gerekir. Framework Bundle'un bir Derleyici Kartı, tüm dinleyicileri bu görevlilere ekledi. hizmet almak için, Controller#get() kısayolunu kullanın:

// ... 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class ChannelController extends Controller 
{ 
    public function createAction() 
    { 
     $dispatcher = $this->get('event_dispatcher'); 
     // ... 
    } 
} 
+0

O kadardı. Teşekkür ederiz :) –

+0

Teşekkür ederim, bana da yardımcı oldu –

+0

Bu hala Symfony 2.3.4'te çalışıyor mu? veya bu değişti mi? – Chausser

İlgili konular