Php 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()

我正在发送一个插入Symfony 2中一个简单侦听器的简单事件

事件

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(“这使我
    疯狂!);

  • 通过访问对象,您可以使用相同的引用并查看 已更改对象

我确信没有魔法。这是如何解释这种行为的呢?我已经补充了一些说明。仍然不清楚。文档变量永远不会传回事件。您可以在MyListener中写入$aaa,而不是$document,这仍然会给出相同的结果。。。这不是它。它是同一个对象,不管你如何命名变量:)你可以用函数验证它。在你代码的不同部分尝试一下,你会得到相同的哈希值。如果这是一个bug,它与我在过去9年中所做的一切完全相反p(如果你只看控制器…)