Symfony getData事件订阅者为null

时间:2017-08-24 12:05:44

标签: symfony events subscriber preset

我知道这个问题已经被问了几次,但实际上还没有一个答案帮我解决了我的问题。

我有三个EventSubscribers为三个相互依赖的下拉列表。

所以在我的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));

}

我的一个EventSubscribers看起来像这样:

    ...
...

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

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

2 个答案:

答案 0 :(得分:1)

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

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

所以在此之前设置 - >表单显然没有任何数据,也没有设置事件数据。这就是为什么$data在你的听众的null方法中是onPreSetData的原因。

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

快速概述:

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

答案 1 :(得分:0)

在preSetData声明中,你得到了坏类。试试这个:

public function preSetData(GenericEvent $event)

添加下一个用途:

use Symfony\Component\EventDispatcher\GenericEvent;