Symfony - обмен данными между контроллером и EventListener
В настоящее время я использую Symfony 3.4 как API без сохранения состояния, а Doctrine - как ORM. Мой контроллер загружает некоторый объект из базы данных, что-то делает с ним и возвращает ответ. У меня есть EventListener, зарегистрированный для kernel.terminate
событие для последующей обработки после отправки ответа - отправка электронных писем и т. д. Я хотел бы иметь механизм для обмена объектами, загруженными Controller
с EventListener
так, что мне не нужно делать дополнительный поиск в базе данных в EventListener
,
Прямо сейчас это выглядит примерно так:
// Controller.php
public function fooAction(Request $request) {
$id = $request->query->get('id');
$bar = $this->databaseLookupBar($id);
// do stuff to bar ...
return new Response();
}
// EventListener.php
public function onKernelTerminate($event) {
$request = $event->getRequest();
$id = $request->query->get('id');
$bar = $this->databaseLookupBar($id);
// post-processing, send emails, etc.
}
Я могу придумать два решения:
1) Делайте так, как я сейчас (1 поиск в базе данных).
2) Сохраните объект в сеансе, затем очистите сеанс, когда я закончу с ним.
Есть ли лучшее решение?
1 ответ
Добавьте свойство и метод установки в класс прослушивателя событий:
// EventListener.php
private $bar;
public function setBar($bar)
{
$this->bar = $bar;
}
public function onKernelTerminate($event)
{
$bar = $this->bar;
// post-processing, send emails, etc.
}
Затем вызовите сеттер с вашего контроллера:
// Controller.php
use Namespace\For\EventListenerClass
public function fooAction(Request $request, EventListenerClass $eventListener)
{
$id = $request->query->get('id');
$bar = $this->databaseLookupBar($id);
// do stuff to bar ...
$eventListener->setBar($bar);
return new Response();
}