首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么断言不能验证我的Symfony表单?

问为什么断言不能验证我的Symfony表单?
EN

Stack Overflow用户
提问于 2020-09-23 07:46:59
回答 1查看 183关注 0票数 0

我想要创建一个带有绑定DTO的表单。我断言DTO的三个属性:

  • $firstName
  • $lastName
  • $image

只有当我创建一个新对象时,才应该声明。其余两项应始终予以申明。

DTO

代码语言:javascript
复制
class MyDTO
{
    /**
     * @Assert\NotBlank()
     */
    private ?string $firstName;

    /**
     * @Assert\NotBlank()
     */
    private ?string $lastName;

    /**
     * @Assert\Image()
     * @Assert\NotBlank(groups={MyFormType::VALIDATION_NEW})
     */
    private ?UploadedFile $image;
...

FormType

代码语言:javascript
复制
class MyFormType extends AbstractType
{
    const VALIDATION_NEW = "new";

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        //TODO: Assertion doesnt work
        $builder->
            add('firstName', TextType::class, [
                'required' => false
            ])
            ->add('lastName', TextType::class, [
                'required' => false
            ])
            ->add('image', FileType::class, [
                'required' => false,
            ]);
    }

控制器

代码语言:javascript
复制
/**
     * @Route(path="/{myData}/edit", name="app.data.update")
     */
    public function edit(MyData $myData, Request $request)
    {
        $dtoData = MyDTO::fromEntity($myData);
        $form = $this->createForm(
            MyFormType::class,
            $dtoData,
            [
                'validation_groups' => [
                    MyFormType::VALIDATION_NEW
                ],
            ]
        );
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()){
            $this->repositoryClass->persist($dtoData->toEntity($myData));
            return $this->redirectToRoute('app.data.show');
        }

        return $this->render('app.edit.html.twig',
        [
            'myDataForm' => $form->createView()
        ]);

但是,即使我将所有字段保持为空,也没有关于验证的消息。该表单允许我保存一个空表单。我查看了一下文档,但似乎找不到答案。为什么断言不能验证我的表单?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-23 12:54:26

我不确定,但是在验证组中添加“默认”可以解决这个问题。

代码语言:javascript
复制
/**
 * @Route(path="/{myData}/edit", name="app.data.update")
 */
public function edit(MyData $myData, Request $request)
{
    $dtoData = MyDTO::fromEntity($myData);
    $form = $this->createForm(
        MyFormType::class,
        $dtoData,
        [
            'validation_groups' => [
                MyFormType::VALIDATION_NEW,
                'Default'
            ],
        ]
    );
    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid()){
        $this->repositoryClass->persist($dtoData->toEntity($myData));
        return $this->redirectToRoute('app.data.show');
    }

    return $this->render('app.edit.html.twig',
    [
        'myDataForm' => $form->createView()
    ]);

通过添加此选项,Validator应该考虑到实体中指定的断言

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64023305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档