Php Symfony 2-奇数行为分派事件和全局变量
我正在发送一个插入Symfony 2中一个简单侦听器的简单事件 事件Php Symfony 2-奇数行为分派事件和全局变量,php,symfony,Php,Symfony,我正在发送一个插入Symfony 2中一个简单侦听器的简单事件 事件 class MyDocumentEvent extends Event { private $document; public function __construct(\Namespace\Document $document) { $this->document = $document; } public function getDocument()
class MyDocumentEvent extends Event {
private $document;
public function __construct(\Namespace\Document $document)
{
$this->document = $document;
}
public function getDocument()
{
return $this->document;
}
}
听众
/**
* @DI\Service("core.document.insert", public=true)
* @DI\Tag("kernel.event_listener", attributes={"event"="document.insert.event", "method"="onEventReceived"})
* NB This is equivalent to declaring a service in services.yml (DIExtraBundle is awesome by the way)
*/
class MyListener
{
public function onEventReceived(MyDocumentEvent $event)
{
$document = $event->getDocument();
// $aaa = $event->getDocument(); // is the same
// perform stuff on $document or $aaa
$document->setLabel("This makes me crazy!");
// $aaa->setLabel(); // is the same
return;
}
}
非常奇怪的是,在我的控制器中,文档实体被神奇地修改,就好像$Document
是一个全局变量一样
控制器测试代码
$dispatcher = $this->container->get('event_dispatcher');
$document = new \Namespace\Document();
$document->setLabel('unit.test.document.insert');
$event = new MyDocumentEvent($document);
$dispatcher->dispatch('document.insert.event', $event);
echo $document->getLabel(); // RETURNS "This makes me crazy!"
这真让我不安。为什么Symfony 2会有这种行为
这是正常的还是我只是犯了一个很大的建筑错误?我有点担心,我必须将侦听器中的getter和setter添加回事件,以获得修改后的实体。在PHP中,默认情况下,所有对象都是通过引用传递的()。所以Symfony的代码中没有魔法 这基本上就是你要做的:
- 创建对象(
)$document=new\Namespace\document();
- 将其引用传递给事件的构造函数(
)$event=new MyDocumentEvent($document);
- 当事件被调度时,您调用getter,它返回对的引用
您的对象(
)返回$this->document;
- 然后修改对象(
)$document->setLabel(“这使我 疯狂!);
- 通过访问对象,您可以使用相同的引用并查看 已更改对象