Поток события отправки в Symfony

Я изучаю 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('send@example.com')
->setTo('send@example2.com)
->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

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector