【问题标题】:Symfony adding EventListener in a closure and getting NULLSymfony 在闭包中添加 EventListener 并获得 NULL
【发布时间】: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


【解决方案1】:

创建一个表单类型来显示所有代理。

// 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)
  );
}

如果还有其他问题欢迎随时提问!!!

【讨论】:

  • 嗨,Benny,选择字段没有任何 query_builder 选项!
  • 您好,拼写错误。应该是实体类型。
  • select 那里有 onselect,这很完美,但是在选择某些东西后没有调用 javascript 函数。如果我直接在控制台浏览器中执行小代码,它就可以工作。 loadAgentForm 函数放置在我的基本 javascript 文件中,我的其他函数在该文件中正常工作。
  • 好的,它适用于“onchange” :) 如果一切正常,我会接受你的问题,你救了我的命 :) Vielen Dank Herr @Benny。
猜你喜欢
  • 2017-06-09
  • 2015-10-07
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多