在非对象错误symfony2上调用成员函数

时间:2013-11-20 01:46:36

标签: forms events object symfony

这是一个奇怪的。我有这个方法,即Symfony2中表单的EventSubscriber中FormEvents::POST_SET_DATA事件的回调:

public function preSetData(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();

        $resource_provider = $data->getResourceProvider();
        $type = $resource_provider->getType(); //PROBLEM HERE

        \Doctrine\Common\Util\Debug::dump(is_object($resource_provider));
}

它有更多代码,但错误是在注释PROBLEM HERE的行中触发。

问题是那里的转储打印bool(true),因此它是一个对象,并且内部有数据,但是试图调用getType(),这个错误会出现此错误:

Error: Call to a member function getType() on a non-object

为了增加更多的混淆,如果我转储$resource_provider->getType()我会收到预期的内容,但错误仍然存​​在。

有人知道或了解这里可能发生的事情吗?

修改

不敢相信!我找到了答案,但根本没有意义!我不得不用这样的条件包装有问题的代码:

if(is_a($resource_provider, 'My\Bundle\Path\Entity\ResourceProvider')){}

它有效!如果有人能告诉我这是什么意思,我会乐意选择他/她的答案是正确的。

1 个答案:

答案 0 :(得分:0)

问题是$ resource_provider可能为null,因为错误说$ resource_provider不是对象。

当打印$ resource_provider的值并跳过脚本时,它会显示类'My \ Bundle \ Path \ Entity \ ResourceProvider'的正确对象:

echo get_class($resource_provider); exit; // Display My\Bundle\Path\Entity\ResourceProvider and skip the script

当添加条件进行测试时,对象属于预期的类,脚本不再崩溃:

if(is_a($resource_provider, 'My\Bundle\Path\Entity\ResourceProvider')){}

此外,当脚本不是对象时跳过脚本,$ resource_provider为null并跳过脚本:

if(is_a($resource_provider, 'My\Bundle\Path\Entity\ResourceProvider')){

} else {
   var_dump($resource_provider); exit;
}

$ resource_provider是一个对象,在脚本的相同“执行”中为null。

因此,我们可以推断出EventSubcriber被加载了多次,可能是在表单绑定之前和表单绑定之后,例如第一次使用预期对象,第二次(或更多)时间没有值,如null,可能是因为在提交表单或其他内容时未填充$ resource_provider。