我想要创建一个带有绑定DTO的表单。我断言DTO的三个属性:
只有当我创建一个新对象时,才应该声明。其余两项应始终予以申明。
DTO
class MyDTO
{
/**
* @Assert\NotBlank()
*/
private ?string $firstName;
/**
* @Assert\NotBlank()
*/
private ?string $lastName;
/**
* @Assert\Image()
* @Assert\NotBlank(groups={MyFormType::VALIDATION_NEW})
*/
private ?UploadedFile $image;
...FormType
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,
]);
}控制器
/**
* @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()
]);但是,即使我将所有字段保持为空,也没有关于验证的消息。该表单允许我保存一个空表单。我查看了一下文档,但似乎找不到答案。为什么断言不能验证我的表单?
发布于 2020-09-23 12:54:26
我不确定,但是在验证组中添加“默认”可以解决这个问题。
/**
* @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应该考虑到实体中指定的断言
https://stackoverflow.com/questions/64023305
复制相似问题