Symfony在闭包中添加EventListener并获取NULL

时间:2013-10-24 11:49:42

标签: php forms exception symfony event-listener

我收到错误“在非对象上调用成员函数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);
        }
    );
}

$事件 - >的getData();是NULL,我var_dumped $ event,它是一个非常大的对象。

目的是在选择字段中选择代理实体后动态生成表单,在本例中为描述字段。

任何人都可以建议我如何处理此错误或为什么getData()= NULL ??

编辑:

这样做的主要目的是用户可以添加/禁用/更新代理。主要思想是只显示一个选择或下拉字段和一个“添加代理”按钮。如果用户从选择字段中选择一个名称,则代理实体的表单将填充其数据。这就是为什么要有一个EventListener来检测select字段中的任何选择,然后根据用户选择显示数据的原因。希望这能澄清一点目标。

1 个答案:

答案 0 :(得分:2)

创建表单类型以显示所有代理。

// AgentsType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
  $builder
    ->add('agents', 'entity', array(
       'class' => 'MyBundle:Agent',
       'query_builder' => function(EntityRepository $rep) {
         // some query for agents
       };
       'attr' => array('onselect' => 'loadAgentForm(this);')
     )
  );
}

你需要一些javascript来对另一个返回页面的控制器进行异步调用,该控制器包含AgentType表单(不是AgentsType)。

function loadAgentForm(sender) {
  // if you use jquery:
  $("div#form-container").load(
    ("http://myurl.com/agent/editform?id=" + sender.value)
  );
}

如果还有其他问题请随时询问!!!