Это первый раз, когда я работаю над созданием настраиваемого диспетчера событий и подписчика, поэтому я пытаюсь обвести вокруг него голову, и я не могу понять, почему мое настраиваемое событие не отправляется ,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 профайлер я вижу мое пользовательское событие быть перечислен но он все равно не отправляет.
Большое спасибо, что сделал это работает :) Теперь, если я понимаю правильно, каждый раз, когда мне нужно направить пользовательское событие мне нужно физически писать код много раз в разных действиях контроллера или в службах, если ответ на это да, то как я могу сделать это событие автоматически доступным для всех слушателей, а не вручную его отправлять? Надеюсь, мой вопрос имеет смысл. – Saadia
Ну, вопрос в том, как ваши слушатели должны знать, что произошло, если вы его не отправили? Хотя то, что вам не нужно делать, - это всегда получать диспетчер событий от контроллера. Например, при настройке ваших сервисов вы можете просто вставить диспетчер событий в него, как вы используете для ввода других зависимостей. – xabbuh