首页 > 解决方案 > 为什么 Symfony 表单不使用约束注释验证我的 DTO?

问题描述

所以我有一个 DTO,如下所示:

namespace App\DTO;

use Symfony\Component\Validator\Constraints as Assert;

class Task
{
    /**
     * @Assert\Type("string")
     * @Assert\NotBlank
     */
    public $title;
}

和一个表单类型:

namespace App\Form;

use App\DTO\Task;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class TaskFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
        ;
    }

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

就像这样TypeTestCase

namespace App\Tests\Entity;

use App\DTO\Task;
use App\Form\TaskFormType;
use Symfony\Component\Form\Test\TypeTestCase;

class TaskTest extends TypeTestCase
{
    public function testValidation()
    {
        $task = new Task;

        $form = $this->factory->create(TaskFormType::class, $task);
        $form->submit([]); // empty data should trigger a validation error

        dump(
            $form->isValid(),
            $form->getErrors(true)->getChildren(),
            $task
        );
    }
}

转储显示表单被认为是有效的,没有错误,并且显示$tasktitle属性设置为null。这不应该被认为是有效的,因为我说它不允许为空白。

当然,我在这里展示了一个简化的示例。在我的实际代码中,我正在验证更多属性,但所有这些都被忽略了。似乎Form完全忽略了基于注释的验证。知道为什么吗?

标签: phpsymfony

解决方案


您没有向我们展示您的framework.yml配置,所以我猜您可能缺少一些配置:

framework:
    validation:
        enabled: true
        enable_annotations: true

你能检查一下吗?希望这是问题,否则您将不得不向我们提供某种堆栈跟踪,而不是说“表单有效”。对配置进行任何更改后,不要忘记清除缓存。


推荐阅读