[英]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.