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();
}
Другие вопросы по тегам