gpt4 book ai didi

Symfony getData 事件订阅者为 null

转载 作者:行者123 更新时间:2023-12-02 10:49:55 27 4
gpt4 key购买 nike

我知道这个问题已经被问过几次了,但还没有一个答案真正帮助我解决我的问题。

我为三个下拉菜单设置了三个事件订阅者,它们相互依赖。

所以在我的 FormType 中我说:

  public function buildForm(FormBuilderInterface $builder, array $options)
{
// solution showmethecode
$pathToAgencies = 'agencies';
//
$builder
->addEventSubscriber(new AddChannel1Subscriber($pathToAgencies))
->addEventSubscriber(new AddChannel3Subscriber($pathToAgencies))
->addEventSubscriber(new AddAgencySubscriber($pathToAgencies));

}

我的一个事件订阅者看起来像这样:

    ...
...

public static function getSubscribedEvents() {
return array(
FormEvents::PRE_SET_DATA => 'preSetData',
FormEvents::PRE_SUBMIT => 'preSubmit'
);
}

private function addChannel1Form($form, $channel1s = null) {
$formOptions = array(
'class' => 'AppBundle:Channel1',
'property' => 'name',
'label' => 'label.channel1s',
'empty_value' => 'label.select_channel1s',
'mapped' => false,
'expanded' => false,
'translation_domain' => 'UploadProfile',
'multiple' => true,
'required' => false,
'attr' => array(
'class' => 'channel1s'
),
);

if ($channel1s){
$formOptions['data'] = $channel1s;
}
$form->add('channel1s', 'entity', $formOptions);
}

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

if (null === $data) {
return;
}

$accessor = PropertyAccess::createPropertyAccessor();
$agency = $accessor->getValue($data, $this->pathToAgency);
$channel1s = ($agency) ? $agency->getChannel3s()->getChannel1s() : null;
$this->addChannel1Form($form, $channel1s);
}

public function preSubmit(FormEvent $event) {
$form = $event->getForm();
$this->addChannel1Form($form);
}
...

现在我收到错误“尝试调用类“Doctrine\Common\Collections\ArrayCollection”的名为“getChannel3s”的未定义方法。” (我认为)这是因为我的 preSetData 中的 $data 是 NULL,但我不知道为什么它是 null。我是否看错了地方或者我的错误在哪里?

最佳答案

preSetData 在原始数据(如果给定则应修改)绑定(bind)到表单(然后存储在 $options[' 中)之前执行数据'])。

preSetData 中的“数据”是您提供给 createForm($type, $data = null, array $options = array()) 的数据。

所以在设置之前 -> 表单显然没有任何数据,并且事件数据也没有设置。这就是为什么在监听器的 onPreSetData 方法中 $datanull 的原因。

您使用了错误的事件。使用 preSubmit 并围绕用户提交的数据构建逻辑 ($event->getData())。这将解决您的问题。

快速概述:

  • 预提交时:
    • $form->get('someButton')->isClicked() 返回 false
    • $event->getForm()->getData() 返回 $options['data'](如果有)或 $options['empty_data']
    • $event->getData 返回提交的数据(数组)
    • 您可以使用setData()
    • 您可以添加/删除字段
  • 提交时:
    • 此处不能使用 setData(),因为数据已绑定(bind)到表单
    • $form->isSubscribed() 仍然返回 false
    • $form->get('someButton')->isClicked() 返回 true
    • 您仍然可以添加/删除字段
  • 提交后:
    • $form->isSubscribed() 返回 true
    • “您无法从提交的表单中删除子项”
    • “您无法将子项添加到提交的表单中”
    • $form->get('someButton')->isClicked() 返回 true

关于Symfony getData 事件订阅者为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45861175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com