Как отправить массив в несопоставленное поле формы в Symfony 4 - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь отправить массив со значениями в поле формы Symfony 4, но проверка не проходит.

Я в процессе обновления моего приложения с Symfony 2.7 до Symfony 4. Проблема заключается в том, чточто форма, которую я использовал сейчас, всегда не проходит проверку из-за изменений в формах Symfony.

Форма Symfony имеет следующее поле

$builder->add('contactData', null, ['mapped' => false])

В Symfony 2.7 я всегда буду отправлять POSTзапрос со значениями массива в поле contactData и, поскольку он не отображается, он просто установит данные для объекта поля в процессе отправки, и значения будут доступны в обработчике.Пример запроса:

{
    "name": {
        "aField": "aValue",
        "contactData": {
             "something": "value"
         }
    }
}

Однако в Symfony 4 теперь добавлена ​​проверка проверки в \Symfony\Component\Form\Form классе

} elseif (\is_array($submittedData) && !$this->config->getCompound() && !$this->config->hasOption('multiple')) {

, которая приводит к сбою проверки при отправке данных в contactData поле, так как submitData действительно является массивом.Я просматривал весь интернет и читал документацию Symfony, но я не могу найти способ вызвать такое же поведение, как в Symfony 2.7.

Я был бы очень признателен за любой совет, яЯ застрял на этом некоторое время

1 Ответ

0 голосов
/ 17 апреля 2019

Symfony изменился с v2.7 до 4.0, изменилось много значений по умолчанию;

Я столкнулся с той же проблемой, и через 2 часа исследований я добавил атрибуты compound иallow_extra_field.

Итак, это должно решить вашу проблему:

$builder->add('contactData', null, [
    'mapped' => false,
    'compound' => true,
    'allow_extra_fields' => true,
])

РЕДАКТИРОВАТЬ :

Это не сработало, как ожидалось, яВ результате в качестве отправленных данных не было ошибок и содержимого, поэтому я создал новый тип для динамического добавления полей в событие предварительной отправки:

UnstructuredType.php

<?php

namespace ASTechSolutions\Bundle\DynamicFormBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;

/**
 * Class UnstructuredType.
 *
 * This class is created to resolve the change of form's behaviour introduced in https://github.com/symfony/symfony/pull/29307
 * From v3.4.21, v4.1.10 and v 4.2.2, Symfony requires defining fields and don't accept arrays on a TextType for ex.
 * TODO: this is a temporary solution and needs refactoring by declaring explicitly what fields we define, and then accept on requests
 *
 */
class UnstructuredType extends AbstractType
{
    /**
     * {@inheritDoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
            $this->addChildren($event->getForm(), $event->getData());
        });
    }

    /**
     * @param FormInterface $form
     * @param $data
     */
    public function addChildren(FormInterface $form, $data)
    {
        if (is_array($data)) {
            foreach ($data as $name => $value) {
                if (!is_array($value)) {
                    $form->add($name);
                } else {
                    $form->add($name, null, [
                        'compound' => true
                    ]);

                    $this->addChildren($form->get($name), $value);
                }
            }
        } else {
            $form->add($data, null, [
                'compound' => false,
            ]);
        }
    }
}

...