Symfony手动$form->submit();使用多维数组

ttvkxqim  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(149)

我在Symfony 5.1.7和$form->submit()中挣扎了10个小时;
我的目标是创建一个JSON API,将数据转换为类似的数组。我已经调试并找到了以下部分。
有人能告诉我我做错了什么吗?
为了测试它,我手动创建了一个PHP数组来提交。

我在Controller中的代码

$form = $this->createForm(AddCommentFormType::class);

        $test = [
            'content' => 'Test',
            'media' => [
                [
                    'path' => '1.png',
                ],
                [
                    'path' => '2.png',
                ],
            ],
            '_token' => '3bF4qkiUPjKNuGnbY-ySdO6B2sCLzKcS4ar7auX3Dek',
        ];

        $form->submit($test);

AddCommentFormType

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('content', TextareaType::class, [
                'constraints' => [
                    new NotBlank(),
                    new Length([
                        'max' => 10000,
                    ]),
                ],
            ])
            ->add('media', CollectionType::class, [
                'entry_type' => MediaFormType::class,
                'constraints' => [
                    new Count([
                        'min' => 1,
                        'max' => 5,
                    ]),
                ],
            ])
            ->add('_token', HiddenType::class, [
                'mapped' => false,
                'constraints' => [
                    new NotBlank(),
                ],
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'csrf_protection' => false,
        ]);
    }

MediaFormType

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('path', TextType::class, [
                'constraints' => [
                    new NotBlank(),
                ],
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Media::class,
        ]);
    }

Validator Result

children[media].data
This collection should contain 1 element or more.   
[]

children[media]
This form should not contain extra fields.  
[▼
  [▼
    "path" => "1.png"
  ]
  [▼
    "path" => "2.png"
  ]
]
svdrlsy4

svdrlsy41#

您的表单没有默认数据,因为您使用

$form = $this->createForm(AddCommentFormType::class);

Form可以为默认数据带一个额外的参数。这本身不一定是一个问题,默认值是表单的数组(或者非常类似的东西,可能是空字符串而不是null)

[
    'content' => null, 
    'media' => [], 
    '_token' => null,
]

但是,CollectionType默认情况下不允许添加或删除元素。设置它的选项allow_add(如果您设置了默认值,还可以选择allow_remove)将改变这一点。
所以最小的变化是:

->add('media', CollectionType::class, [
                'allow_add' => true,                  // <-- this is new
                'entry_type' => MediaFormType::class,
                'constraints' => [
                    new Count([
                        'min' => 1,
                        'max' => 5,
                    ]),
                ],
            ])
kqqjbcuj

kqqjbcuj2#

如果你的类型是AddCommentFormType,表单默认情况下期望数据在add_comment_form键中,比如:

$test = [
       ‘add_comment_form’ => [
           'content' => 'Test',
        'media' => [
            [
                'path' => '1.png',
            ],
            [
                'path' => '2.png',
            ],
        ],
        '_token' => '3bF4qkiUPjKNuGnbY-ySdO6B2sCLzKcS4ar7auX3Dek',
       ]
    ];

相关问题