2016-04-28 3 views
1

Это первый раз, когда я работаю над созданием настраиваемого диспетчера событий и подписчика, поэтому я пытаюсь обвести вокруг него голову, и я не могу понять, почему мое настраиваемое событие не отправляется ,Symfony - Событие не отправлено

Я следую за documentation, и в моем случае мне нужно отправить мероприятие, как только кто-то зарегистрируется на сайте.

так внутри моего registerAction() Я пытаюсь послать событие, как этот

$dispatcher = new EventDispatcher(); 
$event = new RegistrationEvent($user); 
$dispatcher->dispatch(RegistrationEvent::NAME, $event); 

Это мой RegistrationEvent класс

namespace AppBundle\Event; 
use AppBundle\Entity\User; 
use Symfony\Component\EventDispatcher\Event; 

class RegistrationEvent extends Event 
{ 
    const NAME = 'registration.complete'; 

    protected $user; 

    public function __construct(User $user) 
    { 
     $this->user = $user; 
    } 

    public function getUser(){ 
     return $this->user; 
    } 

} 

Это мой RegistrationSubscriber класс

namespace AppBundle\Event;  
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 

class RegistrationSubscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     return array(
      KernelEvents::RESPONSE => array(
       array('onKernelResponsePre', 10), 
       array('onKernelResponsePost', -10), 
      ), 
      RegistrationEvent::NAME => 'onRegistration' 
     ); 

    } 
    public function onKernelResponsePre(FilterResponseEvent $event) 
    { 
     // ... 
    } 

    public function onKernelResponsePost(FilterResponseEvent $event) 
    { 
     // ... 
    } 
    public function onRegistration(RegistrationEvent $event){ 

     var_dump($event); 
     die; 

    } 

} 

После выполнения это, я надеялся, что регистрация pr ocess остановился бы на функции onRegistration, но этого не произошло, затем я просмотрел вкладку «События» профилировщика, и я не вижу, чтобы мое событие также отображало их.

Что мне здесь не хватает? На самом деле будет очень полезно толчок в правильном направлении.

Update: Я думал, что мне нужно, чтобы зарегистрировать службу пользовательского события, поэтому я добавил следующий код в services.yml

app.successfull_registration_subscriber: 
    class: AppBundle\Event\RegistrationSubscriber 
    arguments: ["@doctrine.orm.entity_manager"] 
    tags: 
     - { name: kernel.event_subscriber} 

Внутри вкладки Event профайлер я вижу мое пользовательское событие быть перечислен но он все равно не отправляет.

ответ

1

Создав свой собственный экземпляр EventDispatcher, вы отправляете событие, которое никогда не может прослушиваться другими слушателями (они не привязаны к этому экземпляру диспетчера). Вы должны использовать event_dispatcher службу, чтобы уведомить всех слушателей вы с меткой kernel.event_listener и kernel.event_subscriber теги:

// ... 

class RegistrationController extends Controller 
{ 
    public function registerAction() 
    { 
     // ... 

     $this->get('event_dispatcher')->dispatch(RegistrationEvent::NAME, new RegistrationEvent($user);); 
    } 
} 
+0

Большое спасибо, что сделал это работает :) Теперь, если я понимаю правильно, каждый раз, когда мне нужно направить пользовательское событие мне нужно физически писать код много раз в разных действиях контроллера или в службах, если ответ на это да, то как я могу сделать это событие автоматически доступным для всех слушателей, а не вручную его отправлять? Надеюсь, мой вопрос имеет смысл. – Saadia

+0

Ну, вопрос в том, как ваши слушатели должны знать, что произошло, если вы его не отправили? Хотя то, что вам не нужно делать, - это всегда получать диспетчер событий от контроллера. Например, при настройке ваших сервисов вы можете просто вставить диспетчер событий в него, как вы используете для ввода других зависимостей. – xabbuh

Смежные вопросы