为什么Symfony表单不使用约束注释验证我的DTO



所以我有一个DTO,就像这样:

namespace AppDTO;
use SymfonyComponentValidatorConstraints as Assert;
class Task
{
/**
* @AssertType("string")
* @AssertNotBlank
*/
public $title;
}

和一个FormType:

namespace AppForm;
use AppDTOTask;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
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 AppTestsEntity;
use AppDTOTask;
use AppFormTaskFormType;
use SymfonyComponentFormTestTypeTestCase;
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似乎完全忽略了基于注释的验证。知道为什么吗?

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

framework:
validation:
enabled: true
enable_annotations: true

你能查一下吗?希望这就是问题所在,否则你将不得不向我们提供某种堆叠竞争,而不是说"表格有效"。另外,在对配置进行任何更改后,不要忘记清除缓存。

最新更新