2017-01-19 4 views
0

Ich benutze Symfony 2.8 und FOSUser Bundle 2.0 für meine Benutzerverwaltung. Ich versuche, einen benutzerdefinierten Validator für das Telefonnummernfeld ohne Erfolg zu erstellen.Symfony2 FOSUser benutzerdefinierte Validierung funktioniert nicht

Dies ist mein Code:

UserBundle/Ressourcen/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-Definition

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

Auf meinem Formulartyp

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

Meine benutzerdefinierte Konst Raint

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

    public function validatedBy() 
    { 
     return "acme.constraint_phonenumber"; 
    } 
} 

Und Validator

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

Diese Konfiguration ist für mich nicht nie aufgerufen wird, in meinem benutzerdefinierten Validator seit Validate-Methode arbeiten.

+0

Haben Sie den Cache ordnungsgemäß gelöscht? Änderungen an "validation.xml" müssen im Allgemeinen neu kompiliert werden, um Effekte zu erzielen. –

+0

Ja, mehrere Male: D – 3ND

Antwort

0

ich es geschafft, das Problem zu beheben, indem Validierungsgruppen in Create Factory-Methode in überschriebene editAction Methode der Profile Angabe .

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

Einstellung Validierungsgruppen in Config oder benutzerdefinierte Formtype nicht helfen entweder da ich zwingende FOS Fabrik und Profile editAction.

1

In Ihrer Service-Definition ist Ihr Tag-Name falsch, er sollte validator.constraint_validator sein, um als Validator registriert zu werden.

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

Und Ihre Einschränkung konfiguriert werden sollte, die id Ihrer Validator Service, hierfür:

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

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

Sie haben Recht mit dem Tag. Das behebt das Problem mit dem Validator. – 3ND

Verwandte Themen