[Symfony Validator] 在验证之前初始化对象
这是一个不常见的功能,用于在对象验证之前做某种操作,例如更新对象、读取对象元数据(metadata
)。要使用此功能,只需实现 ObjectInitializerInterface 接口即可,下面是一个使用示例。
一个包含了 email
和 username
属性的对象,我们称它为 AcmeUser
:
class AcmeUser { /** * @Assert\NotBlank() * @Assert\Email() */ private $email; /** * @Assert\NotBlank() */ private $username; // ... }
只设置 email
属性并提交验证,username
字段违反了验证规则:
$entity = new AcmeUser(); $entity->setEmail('[email protected]'); $violationList = $validator->validate($entity); var_dump((string) $violationList); // string(118) "Object(App\Entity\AcmeUser).username: // This value should not be blank. (code c1051bb4-d103-4f74-8988-acbcafc7fdc3) // "
实现 ObjectInitializerInterface 接口,在验证之前改变 username
:
// src/Validator/AcmeUserInitializer.php use App\Entity\AcmeUser; use Symfony\Component\Validator\ObjectInitializerInterface; class AcmeUserInitializer implements ObjectInitializerInterface { public function initialize($object) { if (!$object instanceof AcmeUser) { return; } list($username, $host) = explode('@', $object->getEmail()); $object->setUsername($username); } }
再次验证时 username
属性已通过验证规则:
$entity = new AcmeUser(); $entity->setEmail('[email protected]'); $violationList = $validator->validate($entity); if (count($violationList) > 0) { var_dump((string) $violationList); exit; } var_dump($entity); exit; // object(App\Entity\AcmeUser)#368 (2) { // ["email":"App\Entity\AcmeUser":private]=> // string(20) "[email protected]" // ["username":"App\Entity\AcmeUser":private]=> // string(10) "siganushka" // }
得益于自动配置 (autoconfigure) 选项,默认情况下你并不需要手动注册标签,但如果你在 services.yaml
里关闭了自动配置,或者你正在编写一个公开的第三方的 Bundle 系统,则需要手动为它打上标签:
# config/services.yaml services: App\Validator\AcmeUserInitializer tags: [ 'validator.initializer' ]
相关推荐
xcguoyu 2020-02-26
samtrue 2019-12-26
宋大人 2014-06-10
清风徐来水波不兴 2019-12-25
CoderLiu 2019-11-19
luadenis0 2014-06-05
klarclm 2013-07-05
tianyin 2019-07-21
wangdianyong 2019-07-21
duanshui 2019-06-30
ahxxx 2019-06-30
宋大人 2014-06-10
爱自由 2019-06-29
爱自由 2019-06-29
shana0 2019-06-28
liuwendao 2016-10-19
爱自由 2019-06-28
CsdnGame 2015-07-03