我目前正在使用Symfony 3.4作为无状态API,将Doctrine作为ORM。我的控制器从数据库加载一些对象,用它做一些事情,然后返回一个响应。我为kernel.terminate
事件注册了一个EventListener,以便在发送响应后进行后处理 - 发送电子邮件等。我希望有一种机制来共享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)将对象存储在会话中,然后在我完成会话时清除会话。
有更好的解决方案吗?
答案 0 :(得分:1)
向事件侦听器类添加属性和setter方法:
// EventListener.php
private $bar;
public function setBar($bar)
{
$this->bar = $bar;
}
public function onKernelTerminate($event)
{
$bar = $this->bar;
// post-processing, send emails, etc.
}
然后从你的控制器调用setter:
// 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();
}