2017-09-12 1 views
0

J'ai un champ de choix (déroulant) que je veux valider par rapport à une table DB.symfony 3 choix validation problème

Essentiellement, si la valeur est dans les résultats de la requête, elle est valide.

Ce n'est pas clair pour moi comment le rappel indiqué dans le guide Symfony fonctionne :(

Cependant, je dispose d'un fichier validation.yml:

User\UserBundle\Entity\Group: 
    properties: 
     role: 
      - Choice: 
       groups: [signUp] 
       callback: [User\UserBundle\Entity\Group, getRoles] 

L'entité Group.php

class Group 
{ 
    /** @var int */ 
    private $id; 

    //... 

    public static function GetRoles() 
    { 
     return ['admin', 'user']; 
    } 
} 

Cet exemple fonctionne correctement mais mon problème survient lorsque j'essaie d'obtenir ces valeurs à partir du référentiel de groupe GroupRepository.php

class GroupRepository extends EntityRepository 
{ 
    public function getRoles() 
    { 
     return $this->createQueryBuilder('r') 
      ->getQuery() 
      ->getResult(); 
    } 
} 

Que dois-je faire à ce stade? L'approche que j'ai utilisée est-elle correcte ou dois-je appeler le référentiel de groupe directement dans le validation.yml? Ou suis-je totalement absent?

+0

Il me semble que vous voulez utiliser le EntityType (voir http://symfony.com/doc/current/reference/forms/types/entity.html) qui permet de remplir vos choix basé sur des données de base de données. – xabbuh

+0

Vous devez créer une classe de validation personnalisée. Et parce que vous devez accéder à la base de données à l'intérieur du validateur, il doit être déclaré en tant que service et injecter l'ORM https://symfony.com/doc/current/validation/custom_constraint.html#constraint-validators-with-dependencies. – sdespont

Répondre

1

Si je comprends bien que vous essayez d'obtenir ces options du référentiel comme:

... 
callback: [User\UserBundle\Repository\GroupRepository, getRoles] 

Cela ne fonctionnera pas comme le référentiel doit être initialisé par le service Doctrine ORM.

Je suppose que vous devez créer une classe Constraint personnalisée et ConstraintValidator où la dernière est configurée en tant que service et obtient le gestionnaire d'entités passé en argument.

Voir http://symfony.com/doc/current/validation/custom_constraint.html