Symfony2:事件变为监听器

时间:2014-04-25 13:52:53

标签: php events symfony listener

我的“CustomEvent(.php)”类在我的“CustomListeren(.php)”中设置为$ event属性。

在kernel.terminate上,$ event属性从“CustomEvent”更改为“CustomListener”(空对象)。

# CustomEvent.php
namespace Stackoverflow\AwesomeBundle\Event;

use Symfony\Component\EventDispatcher\Event;

class CustomEvent extends Event {

  protected $data;

  /**
   * @param Data $data
   */
  public function __construct(Data $data) {
    $this->data = $data;
  }

  /**
   * @return Data
   */
  public function getdata() {
    return $this->data;
  }
}

# CustomListener.php
namespace Stackoverflow\AwesomeBundle\Event;

class CustomListener {
  /**
   * @var CustomEvent
   */
  protected $event;

  /**
   * @param CustomEvent $event
   */
  public function firstTrigger(CustomEvent $event) {
    // indeed instanceof CustomEvent
    $this->event = $event;
  }

  public function secondTrigger() {
    // $this->event is now instanceof CustomListener instead of CustomEvent

    if ($this->event instanceof CustomEvent) {
      // ... code logic
    }
  }
}

我的控制器

# CustomController
namespace Stackoverflow\AwesomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Stackoverflow\AwesomeBundle\Data;
use Stackoverflow\AwesomeBundle\Event\CustomEvent;

class CustomController extends Controller {
  public function customAction(Request $request) {
   // ... code

   $data = new Data();

   $this->get('event_dispatcher')->dispatch(
     'nameIsNotImportant',
     new CustomEvent($data)
   );

   // ... code
  }
}

我的捆绑服务.yml

parameters:
  custom.listener.class: Stackoverflow\AwesomeBundle\Event\CustomListener

services:
  custom_listener:
    class: %custom.listener.class%
    tags:
      - { name: kernel.event_listener, event: nameIsNotImportant, method: firsTrigger }
      - { name: kernel.event_listener, event: kernel.terminate, method: secondTrigger }

我在CustomListener :: secondTrigger()中做了一个get_class($ this->事件) 日志显示$ this->事件已更改为CustomListener

[2014-04-25 15:20:16] app.DEBUG: Pointer\Revlect\SecurityBundle\Event\ResetTokenEvent [] []
...
[2014-04-25 15:20:16] app.DEBUG: Pointer\Revlect\SecurityBundle\Event\ResetTokenListener [] []
[2014-04-25 15:20:16] event.DEBUG: Notified event "kernel.terminate" to listener "Stackoverflow\AwesomeBundle\Event\CustomListener::secondTrigger". [] []

在CustomListener :: secondTrigger()中,$ this->事件必须是instanceof Customofvent。 我想念一个拼图吗?

2 个答案:

答案 0 :(得分:0)

我已经从" sendMail"更改了我的方法名称进入"发送邮件" ..

因此,如果遇到此类问题,请尝试更改方法名称。

答案 1 :(得分:0)

最好使用两个具有一个操作的侦听器而不是具有两个操作的侦听器。这应该解决这个问题。

您在一个监听器中使用了两个不同的事件类,而在SecondTrigger()中,您没有定义它将收到的$event,因此$this->event未正确定义。

最佳选择是为两个事件使用两个侦听器,但如果您只想使用一个侦听器,则应在$event定义您正在等待的secondTrigger()