2017-01-19 11 views
0

私はユーザー管理のためにSymfony 2.8とFOSUser bundle 2.0を使用しています。 電話番号フィールドのカスタムバリデーターを作成せずに作成しようとしています。Symfony2 FOSUserカスタム検証が動作しません

これは私のコードです:私のフォームタイプ

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Acme\UserBundle\Entity\User', 
     'intention' => 'profile', 
    )); 
} 

私に

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> 

カスタムconst raint

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; 
    } 
} 

この構成では、と呼ばれることは決してありません私のカスタムバリデータで検証メソッドので、私のために動作しません。

+0

キャッシュを正しくクリアしましたか? 'validation.xml'への変更は、一般に「再コンパイル」して影響を与える必要があります。 –

+0

はい、複数回:D – 3ND

答えて

0

。私はFOSの工場とProfileController editActionをオーバーライドしていますので、設定またはカスタムにformTypeでの検証グループを設定する

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

はどちらか助けていません。

1

サービス定義では、タグ名が間違っています。validator.constraint_validatorValidatorとして登録する必要があります。

<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を使用して設定する必要があり、そのために:私はProfileControllerのオーバーライドされたeditAction方法ではCreateFormファクトリメソッド内での検証グループを指定することによって、問題を解決するために管理

class IsConfirmedPhonenumber extends Constraint 
{ 
    public $message = 'The phonenumber "%phonenumber%" is not verified.'; 

    public function validatedBy() 
    { 
     return "acme_user.validator.is_confirmed_phonenumber_validator"; 
    } 
} 
+0

あなたはそのタグについて正しいです。これにより、バリデーターで問題が解決されます。 – 3ND

関連する問題