Symfony表单事件:ChoiceType字段意外返回null

时间:2017-06-10 23:31:23

标签: php forms symfony symfony-forms symfony-3.1

我正在处理symfony表单,我在字段中使用select2作为ajax请求,我听取PRE_SUBMIT事件以获取选项列表并提供choices选项< / p>

$opts = $config->getOptions();
$opts['choices'] = $listImages; //array of Image object

但是在var_dump中的PRE_SUBMIT事件中,我在表单中获取所选值,并在闭包中使用它,并且当持久化时,字段具有空值,因此我在执行var_dump POST_SUBMIT事件该字段实际上为null值。而且我也不知道我错过了什么

我的FormType如下:

class ArticleType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('image', ChoiceType::class, array(
            'expanded' => false,
            'multiple' => false))
        //other field
        ;

       $formModifier = function (FormInterface $form, $image) use ($options) {
        $listImages = $options['em']->getRepository('AlmotivAppBundle:Image')->findBy(array(
            'id' => $image
        ));

        if (!$listImages) {
            $form->add('image')->addError(new FormError(
                'Nous n\'avons pas p trouver l\'image, veuiller choisir une autre'
            ));
        }
        //die(var_dump($listImages)); //array of Image object


        $config = $form->get('image')->getConfig();
        $opts = $config->getOptions();
        $opts['choices'] = $listImages;
        $typeName = get_class($config->getType()->getInnerType());
        $form->add('image', $typeName, $opts);
        //die(var_dump($form->get('image')->getConfig()->getData())); //return null
    };

    $builder->get('image')->addEventListener(
        FormEvents::PRE_SUBMIT,
        function (FormEvent $event) use ($formModifier) {
            $image = $event->getData();
            //die(var_dump($image)); //return 10
            $formModifier($event->getForm()->getParent(), $image);
        }
    );

我正在使用框架的v3.1。 如果您需要更多,请询问。

1 个答案:

答案 0 :(得分:1)

这似乎是在那个时间点返回的完全有效的值。

PRE_SUBMIT您获得父表单并将其传递给$formModifier时,这是正常的。但是,该修饰符执行以下操作:

$typeName = get_class($config->getType()->getInnerType());
$form->add('image', $typeName, $opts);

您的表单中已经有一个名为image的字段,但重新添加它会覆盖其上下文(包括数据)。在你看一眼Form.php时,你会看到:

Form.php第873行

$this->children[$child->getName()] = $child;

也就是说,一旦与表单字段重叠,就无法检索数据。

为什么在重新添加字段后需要检索数据?