Я изучаю Symfony и пытаюсь использовать Компонент Dispatch Event.
Я понимаю, что есть
Я создал простой пример в моем маршруте
/**
* @Route("/evento", name="evento")
*/
public function eventoAction()
{
$dispatcher = new EventDispatcher();
$listener = new StoreListener($this->get('mailer'));
$dispatcher->addListener(StoreEvents::STORE_ORDER,array($listener,'onFooAction'),25);
$order = new Ordini();
$order->setName('ordine nuovo -'.rand(0,100));
$em = $this->getDoctrine()->getManager();
$em->persist($order);
$em->flush();
$event = new FilterOrderEvent($order);
$dispatcher->dispatch(StoreEvents::STORE_ORDER,$event);
return $this->render('::event.html.twig');
}
StoreEvent с контейнером Const
namespace AppBundle\Events;final class StoreEvents
{
/**
* The store.order event is thrown each time an order is created
* in the system.
*
* The event listener receives an
* Acme\StoreBundle\Event\FilterOrderEvent instance.
*
* @var string
*/
const STORE_ORDER = 'store.order';
}
Событие, которое я передаю Слушателю
<?php
namespace AppBundle\Events;
use AppBundle\Entity\Ordini;
use Symfony\Component\EventDispatcher\Event;
class FilterOrderEvent extends Event
{
protected $order;
public function __construct(Ordini $order)
{
$this->order = $order;
}
/**
* @return Ordini
*/
public function getOrder()
{
return $this->order;
}
}
И слушатель
<?php
namespace AppBundle\Events;use Symfony\Component\EventDispatcher\Event;
class StoreListener
{
protected $mail;
/**
* StoreListener constructor.
* @param $mail
*/
public function __construct($mail)
{
$this->mail = $mail;
}public function onFooAction(Event $event)
{
var_dump($event);
var_dump($event->getOrder());
echo "fooAction";
$message = \Swift_Message::newInstance()
->setSubject($event->getOrder()->getName())
->setFrom('[email protected]')
->setTo('[email protected])
->setBody('Test')
;
$this->mail->send($message);
}
}
Все эти вещи работают, но я хочу понять, где я должен объявить диспетчера.
Я должен объявить для каждого контроллера?
$dispatcher = new EventDispatcher();
даже добавить слушатель (или addSubscriber)
$dispatcher->addListener(StoreEvents::STORE_ORDER,array($listener,'onFooAction'),25);
Я не думаю, что это лучший способ объявлять каждый раз новый диспетчер
или новый addListener
ОБНОВИТЬ
Я создал еще одно действие
/**
* @Route("/evento2", name="evento2")
*/
public function evento2Action()
{
$order = new Ordini();
$order->setName('ordine nuovo -'.rand(0,100));
$em = $this->getDoctrine()->getManager();
$em->persist($order);
$em->flush();
$event = new FilterOrderEvent($order);
$this->get('event_dispatcher')->dispatch(StoreEvents::STORE_ORDER,$event);
return $this->render('::event.html.twig');
}
И создать мой сервис:
Сервисы:
create_order_listener:
class: AppBundle\Events\StoreListener
arguments: ["@swiftmailer.mailer"]
tags:
- { name: kernel.event_listener, event: store.order, method: onFooAction
все работают. Но теперь я хотел бы узнать лучшие практики или когда создать слушателя по службе и когда мне нужно использовать addListener
или же addSubscriber
Задача ещё не решена.
Других решений пока нет …