2017-09-13 2 views
1

J'essaie de valider mon entité via un rappel statique.Rappel de validation Symfony

J'ai été capable de le faire fonctionner après le Symfony guide mais quelque chose n'est pas clair pour moi.

public static function validate($object, ExecutionContextInterface $context, $payload) 
{ 
    // somehow you have an array of "fake names" 
    $fakeNames = array(/* ... */); 

    // check if the name is actually a fake name 
    if (in_array($object->getFirstName(), $fakeNames)) { 
     $context->buildViolation('This name sounds totally fake!') 
      ->atPath('firstName') 
      ->addViolation() 
     ; 
    } 
} 

Il fonctionne très bien quand je remplir mon tableau $fakeNames mais si je veux le rendre « dynamique »? Disons que je veux choisir ce tableau à partir des paramètres ou de la base de données ou ailleurs. Comment suis-je supposé passer des choses (par exemple le conteneur ou entityManager) à cette classe à partir du moment où le constructeur ne fonctionne pas et doit être nécessairement statique?

Bien sûr, mon approche peut être complètement erronée, mais je n'utilise que l'exemple symfony et quelques autres problèmes similaires trouvés sur Internet que j'essaie d'adapter à mon cas.

Répondre

1

Merci à c'est la solution que j'ai pu trouver à la fin. Cela fonctionne bien et j'espère que cela peut être utile pour quelqu'un d'autre.

J'ai mis la contrainte sur mon validation.yml

User\UserBundle\Entity\Group: 
    constraints: 
     - User\UserBundle\Validator\Constraints\Roles\RolesConstraint: ~ 

Voici ma classe RolesConstraint

namespace User\UserBundle\Validator\Constraints\Roles; 

use Symfony\Component\Validator\Constraint; 

class RolesConstraint extends Constraint 
{ 
    /** @var string $message */ 
    public $message = 'The role "{{ role }}" is not recognised.'; 

    public function getTargets() 
    { 
     return self::CLASS_CONSTRAINT; 
    } 
} 

et voici ma classe RolesConstraintValidator

<?php 

namespace User\UserBundle\Validator\Constraints\Roles; 

use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\Validator\Constraint; 
use Symfony\Component\Validator\ConstraintValidator; 

class RolesConstraintValidator extends ConstraintValidator 
{ 
    /** @var ContainerInterface */ 
    private $containerInterface; 

    /** 
    * @param ContainerInterface $containerInterface 
    */ 
    public function __construct(ContainerInterface $containerInterface) 
    { 
     $this->containerInterface = $containerInterface; 
    } 

    /** 
    * @param \User\UserBundle\Entity\Group $object 
    * @param Constraint $constraint 
    */ 
    public function validate($object, Constraint $constraint) 
    { 
     if (!in_array($object->getRole(), $this->containerInterface->getParameter('roles'))) { 
      $this->context 
       ->buildViolation($constraint->message) 
       ->setParameter('{{ role }}', $object->getRole()) 
       ->addViolation(); 
     } 
    } 
} 

Essentiellement, je mis en place une contrainte qui, chaque fois qu'un nouvel utilisateur est enregistré avec le rôle, t Le rôle de chapeau doit être parmi ceux définis dans les paramètres. Sinon, cela crée une violation.