【发布时间】:2013-10-24 11:49:42
【问题描述】:
我收到错误“调用非对象上的成员函数 getAgent()”。
这是我在 AgentsType.php 中的代码:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('agents', 'entity', array(
'class' => 'MyBundle:agents',
'property' => 'name',));
$formModifier = function(FormInterface $form, agents $agent) {
$description = $agent->getDescription();
$form->add('description', 'text');
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function(FormEvent $event) use ($formModifier) {
$data = $event->getData(); //ERROR HERE, returns NULL
$formModifier($event->getForm(), $data->getAgent()); // Exception HERE
}
);
$builder->get('agents')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($formModifier) {
$agent = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $agent);
}
);
}
$event->getData();是 NULL,我 var_dumped $event 并且它是一个非常大量的对象。
目的是在选择字段中选择代理实体后动态生成表单,在本例中为描述字段。
谁能告诉我如何处理这个错误或者为什么 getData() = NULL??
编辑:
这样做的主要目的是用户可以添加/禁用/更新代理。主要思想是只显示一个选择或下拉字段和一个“添加代理”按钮。如果用户从选择字段中选择一个名称,则代理实体的表单将填充其数据。这就是有一个 EventListener 的原因,它可以检测选择字段中的任何选择,然后根据用户选择显示数据。希望这能澄清一点目标。
【问题讨论】:
-
我不确定,但是“PRE_SET_DATA”事件中是否有任何数据?那么调用
getData()有什么结果吗? -
我正在关注这个文档symfony.com/doc/current/cookbook/form/…,我看到了更多示例,他们实现了这样的 PRE_SET_DATA 事件。那里应该有数据。
-
哦,我知道事件的用途了。您是否在您的控制器中设置了任何初始数据,您在其中实例化了表单?
-
是的,有一个 findAll() 方法被调用: $form = $this->createForm(new AgentsType()); return $this->render('MyBundle:agents:agents.html.twig', array('entities' => $entities, 'form' => $form->createView(), ));我在实体字段类型中显示使用该方法找到的 2 个实体名称,但是,也许这不是这样做的方法。我真的很赞同这一点。
-
findAll()将返回找到的对象的数组。如果您将findAll()的结果传递给表单创建(例如:$this->createForm(new AgentsType(), $findAllResult);也会出现此异常。正确的方法是:$this->createForm(new AgentType(), $singleAgentObject);。同样以您编写它的方式($this->createForm(new AgentType());)会有没有数据,所以->getData()将返回 null。
标签: php forms exception symfony event-listener