这是一个奇怪的。我有这个方法,即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')){}
它有效!如果有人能告诉我这是什么意思,我会乐意选择他/她的答案是正确的。
答案 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。