Symfony2 FOSUser 自定义验证不起作用
Symfony2 FOSUser custom validation not working
我正在使用 Symfony 2.8 和 FOSUser bundle 2.0 进行用户管理。
我正在尝试为 phone 数字字段创建自定义验证器但没有成功。
这是我的代码:
UserBundle/Resources/config/validation.xml
<class name="Acme\UserBundle\Entity\User">
<property name="phoneNumber">
<constraint name="Acme\UserBundle\Validator\Constraint\IsConfirmedPhonenumber">
<option name="groups">
<value>Acme</value>
</option>
</constraint>
</property>
</class>
服务定义
<service class="Acme\UserBundle\Validator\Constraint\IsConfirmedPhonenumberValidator" id="acme_user.validator.is_confirmed_phonenumber_validator">
<argument id="doctrine.orm.default_entity_manager" type="service"/>
<tag name="acme.constraint_phonenumber"/>
</service>
在我的表单类型上
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\UserBundle\Entity\User',
'intention' => 'profile',
));
}
我的自定义约束
class IsConfirmedPhonenumber extends Constraint
{
public $message = 'The phonenumber "%phonenumber%" is not verified.';
public function validatedBy()
{
return "acme.constraint_phonenumber";
}
}
和验证者
class IsConfirmedPhonenumberValidator extends ConstraintValidator
{
/**
* @var EntityManager
*/
private $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
/**
* Checks if the passed value is valid.
*
* @param mixed $value The value that should be validated
* @param Constraint $constraint The constraint for the validation
*/
public function validate($value, Constraint $constraint)
{
$phoneVerificationRepo = $this->em->getRepository('AcmeCoreBundle:PhoneVerification');
$phoneVerificationRepo->findBy(array('phoneNumber' => $value, 'verified' => true));
if(!$phoneVerificationRepo)
{
$this->context->buildViolation($constraint->message)
->setParameter('%phonenumber%', $value)
->addViolation();
}
return;
}
}
此配置对我不起作用,因为我的自定义验证器中的验证方法从未被调用。
在你的服务定义中,你的标签名称是错误的,应该是validator.constraint_validator
才能注册为Validator
。
<service class="Acme\UserBundle\Validator\Constraint\IsConfirmedPhonenumberValidator" id="acme_user.validator.is_confirmed_phonenumber_validator">
<argument id="doctrine.orm.default_entity_manager" type="service"/>
<tag name="validator.constraint_validator" />
</service>
并且您的约束应该使用验证器服务的 id
配置,因此:
class IsConfirmedPhonenumber extends Constraint
{
public $message = 'The phonenumber "%phonenumber%" is not verified.';
public function validatedBy()
{
return "acme_user.validator.is_confirmed_phonenumber_validator";
}
}
我设法通过在 ProfileController 的重写 editAction 方法中的 createForm 工厂方法中指定验证组来解决问题。
$form = $formFactory->createForm(['validation_groups' => array('AcmeProfile', 'Profile')]);
在配置或自定义 FormType 中设置验证组也无济于事,因为我覆盖了 FOS 工厂和 ProfileController editAction。
我正在使用 Symfony 2.8 和 FOSUser bundle 2.0 进行用户管理。 我正在尝试为 phone 数字字段创建自定义验证器但没有成功。
这是我的代码:
UserBundle/Resources/config/validation.xml
<class name="Acme\UserBundle\Entity\User">
<property name="phoneNumber">
<constraint name="Acme\UserBundle\Validator\Constraint\IsConfirmedPhonenumber">
<option name="groups">
<value>Acme</value>
</option>
</constraint>
</property>
</class>
服务定义
<service class="Acme\UserBundle\Validator\Constraint\IsConfirmedPhonenumberValidator" id="acme_user.validator.is_confirmed_phonenumber_validator">
<argument id="doctrine.orm.default_entity_manager" type="service"/>
<tag name="acme.constraint_phonenumber"/>
</service>
在我的表单类型上
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\UserBundle\Entity\User',
'intention' => 'profile',
));
}
我的自定义约束
class IsConfirmedPhonenumber extends Constraint
{
public $message = 'The phonenumber "%phonenumber%" is not verified.';
public function validatedBy()
{
return "acme.constraint_phonenumber";
}
}
和验证者
class IsConfirmedPhonenumberValidator extends ConstraintValidator
{
/**
* @var EntityManager
*/
private $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
/**
* Checks if the passed value is valid.
*
* @param mixed $value The value that should be validated
* @param Constraint $constraint The constraint for the validation
*/
public function validate($value, Constraint $constraint)
{
$phoneVerificationRepo = $this->em->getRepository('AcmeCoreBundle:PhoneVerification');
$phoneVerificationRepo->findBy(array('phoneNumber' => $value, 'verified' => true));
if(!$phoneVerificationRepo)
{
$this->context->buildViolation($constraint->message)
->setParameter('%phonenumber%', $value)
->addViolation();
}
return;
}
}
此配置对我不起作用,因为我的自定义验证器中的验证方法从未被调用。
在你的服务定义中,你的标签名称是错误的,应该是validator.constraint_validator
才能注册为Validator
。
<service class="Acme\UserBundle\Validator\Constraint\IsConfirmedPhonenumberValidator" id="acme_user.validator.is_confirmed_phonenumber_validator">
<argument id="doctrine.orm.default_entity_manager" type="service"/>
<tag name="validator.constraint_validator" />
</service>
并且您的约束应该使用验证器服务的 id
配置,因此:
class IsConfirmedPhonenumber extends Constraint
{
public $message = 'The phonenumber "%phonenumber%" is not verified.';
public function validatedBy()
{
return "acme_user.validator.is_confirmed_phonenumber_validator";
}
}
我设法通过在 ProfileController 的重写 editAction 方法中的 createForm 工厂方法中指定验证组来解决问题。
$form = $formFactory->createForm(['validation_groups' => array('AcmeProfile', 'Profile')]);
在配置或自定义 FormType 中设置验证组也无济于事,因为我覆盖了 FOS 工厂和 ProfileController editAction。