Symfony2 FOSUser自定义验证无效

时间:2017-01-19 11:14:56

标签: symfony fosuserbundle

我使用Symfony 2.8和FOSUser bundle 2.0进行用户管理。 我试图为电话号码字段创建自定义验证器但没有成功。

这是我的代码:

UserBundle /资源/配置/ 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;
    }
} 

这个配置对我来说不起作用,因为我的自定义验证器中的验证方法永远不会被调用。

2 个答案:

答案 0 :(得分:1)

在您的服务定义中,您的代码名称有误,应将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";
    }
}

答案 1 :(得分:0)

我设法通过在重写的ProfileController的editAction方法中的createForm工厂方法中指定验证组来解决此问题。

$form = $formFactory->createForm(['validation_groups' => array('AcmeProfile', 'Profile')]);

在配置或自定义FormType中设置验证组也无济于事,因为我正在覆盖FOS工厂和ProfileController editAction。