简体   繁体   English

Symfony2:事件变为监听器

[英]Symfony2: event changes into listener

My "CustomEvent(.php)" class that's set in my "CustomListeren(.php)" as $event property. 在我的“ CustomListeren(.php)”中将我的“ CustomEvent(.php)”类设置为$ event属性。

On kernel.terminate the $event property changes from "CustomEvent" to "CustomListener" (empty object). 在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;
  }
}

and

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

my controller 我的控制器

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

my bundle services.yml 我的捆绑软件services.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 }

I did a get_class($this->event) in CustomListener::secondTrigger() The logs show that $this->event changed into CustomListener 我在CustomListener :: secondTrigger()中做了一个get_class($ this-> event),日志显示$ this-> event变成了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". [] []

In CustomListener::secondTrigger() $this->event must be instanceof CustomEvent. 在CustomListener :: secondTrigger()中,$ this-> event必须是CustomEvent的实例。 Do I miss a puzzle piece??? 我想念一块拼图吗???

I've changed my method-name from "sendMail" into "sendsMail".. 我已将方法名称从“ sendMail”更改为“ sendsMail”。

So if you encounter such issue try changing your method name. 因此,如果遇到此类问题,请尝试更改您的方法名称。

It would be better to use two listeners with one action instead of that listener with two actions. 最好是使用两个侦听器执行一个动作,而不是使用该侦听器执行两个动作。 That should fix this. 那应该解决这个问题。

You are using two different Event classes in one single Listener, and in SecondTrigger() you are not defining the $event it will receive, so $this->event is not defined correctly. 您在一个侦听器中使用了两个不同的Event类,并且在SecondTrigger()您没有定义它将接收的$event ,因此未正确定义$this->event

Best option is to use two listeners for two events, but if you want to use only one listener after all, you should define the $event you're waiting for at secondTrigger() . 最好的选择是对两个事件使用两个侦听器,但是如果毕竟只想使用一个侦听器,则应该在secondTrigger()处定义要等待的$event

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM