Symfony - 在Controller和EventListener之间共享数据

时间:2018-04-11 02:58:13

标签: php symfony symfony3.x

我目前正在使用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)将对象存储在会话中,然后在我完成会话时清除会话。

有更好的解决方案吗?

1 个答案:

答案 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();
}