0

我目前使用 Symfony 3.4 作为无状态 API,Doctrine 作为 ORM。我的控制器从数据库中加载一些对象,对其进行处理,然后返回一个响应。我为事件注册了一个 EventListener 以在kernel.terminate发送响应后进行后处理 - 发送电子邮件等。我希望有一种机制来共享由 加载的对象ControllerEventListener这样我就不必做中的额外数据库查找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)将对象存储在会话中,然后在我完成后清除会话。

有更好的解决方案吗?

4

1 回答 1

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.
}

然后从您的控制器调用设置器:

// 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();
}
于 2018-04-11T04:58:33.560 回答