我正在用symfony 3编写几个表单。我的表单非常类似于symfony引用中的给定示例:
http://symfony.com/doc/current/reference/constraints/Valid.html 我还有一个用户和一个嵌入式地址实体。我的配置是通过yml:
完成的父母用户:
// src/Entity/User.php
namespace App\Entity;
class User
{
protected $firstName;
protected $lastName;
protected $address;
protected $mailOptIn;
}
儿童地址:
// src/Entity/Address.php
namespace App\Entity;
class Address
{
protected $street;
protected $zipCode;
}
YML:
# config/validator/validation.yaml
App\Entity\Address:
properties:
street:
- NotBlank: { groups: [group01, group02] }
zipCode:
- NotBlank: { groups: [group01, group02] }
- Length: { min: 3, groups: [group01, group02] }
App\Entity\User:
properties:
firstName:
- NotBlank: ~
- Length:
min: 4
lastName:
- NotBlank: ~
address:
- Valid: { groups: [group01, group02] }
但在某些情况下(取决于父用户实体中的其他字段),它是 没有必要验证嵌入的地址实体。
现在我已经阅读了很多关于回调和getter-validators的内容,但我的问题是,我不知道,如何处理这个问题。使我的情况更加复杂的另一个部分是,我需要在地址实体中使用验证组(https://symfony.com/doc/current/form/validation_groups.html),因为我验证了大约20个国家,每个国家都有它自己的验证字段。
任何人都可以给我提示,如何继续?与组的地址验证工作完美,我想我只需要在父用户实体中实现一些很酷的神奇东西,对吗?
我刚刚添加了两件事:
使用有效密钥进行验证。
我现在想要实现的是,只有在用户将mailOptIn设置为true时才进行地址验证,因为只有在这种情况下,我需要地址。 请注意,我确实需要用于地址验证的组,具体取决于给定地址所在的国家/地区。
答案 0 :(得分:1)
我的解决方案是,使用MULTIPLE' validation_groups'和我的表单类中的回调函数。 我不知道每个表单可以使用多个组。
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults($this->addDefaults([
'data_class' => ContactGeneral::class,
'cascade_validation' => true,
]));
$resolver->setDefaults([
'validation_groups' => function (FormInterface $form) {
$data = $form->getData();
if ($data->getAddress()->isValidate()) {
return ['ContactGeneral', 'User', 'contactUser', 'Address', $this->alsLm->getGroupName()];
} else {
return ['ContactGeneral', 'User', 'contactUser', 'Address'];
}
},
]);
}
请参阅:
答案 1 :(得分:0)
在这种情况下,文档可能不太清楚,但您必须在其上添加Valid: ~
键,例如:
App\Entity\User:
properties:
firstName:
- NotBlank: ~
- Length:
min: 4
lastName:
- NotBlank: ~
address:
- Valid: ~
答案 2 :(得分:0)
您可以在控制器操作中执行此操作:
use Symfony\Component\Form\FormError;
class MyClass {
public function createAction(Request $request) {
// your actual code
// dynamic form validation
if($form->isSubmitted()){
$zip= $form->get('address')->get('zip')->getData();
$street= $form->get('address')->get('street')->getData();
if($zip == '1234' && count($street)>150){
$form->get('address')->get('zip')->addError(new FormError('Address cant have more than 150 char for ZIP 1234')); // add error on the ZIP field
} else if($zip == '465' && count($street) < 3) {
$form->get('address')->get('street')->addError(new FormError('Address must have more than 3 char for ZIP 456')); // add error on the address field
}
}
// your actual code
if($form->isSubmitted() && $form->isValid()){
}
}
}