2015-02-23 9 views
5

Ho un'entità, una delle quali mi piacerebbe convalidare in base a una query del database. Ce l'ho definito come un metodo nel mio repository, per esempio:Symfony2 - vincolo di scelta usando il repository Doctrine

class EntryRepository extends EntityRepository { 

    /** 
    * Gets valid entries for validation 
    */ 
    public function getValidEntries() { 
     return $this->createQueryBuilder('s') 
      ->where('s.isAvailable = :isAvailable') 
      ->setParameter('isAvailable', true) 
      ->getQuery() 
      ->getResult(); 
    } 

    ... 
} 

Come posso usare questo per fornire scelte disponibili per il vincolo di scelta? Potrei definirlo nella mia classe di entità simile a questo:

use Symfony\Component\Validator\Constraints as Assert; 

class SomeEntity { 

    /** 
    * @Assert\Choice(callback = {"Acme\MyBundle\Entity\EntryRepository", "getValidEntries"}) 
    * ... 
    */ 
    private $entry; 

    ... 

    } 

Tuttavia, questo mi richiederebbe di rendere questo metodo statico nel repository, che non è un buon modo per definire i metodi di repository.

C'è un modo per farlo correttamente? O forse sto cercando di reinventare la ruota e c'è un modo migliore per fare ciò che sto cercando di fare qui?

+2

Penso che la soluzione migliore sarebbe creare il proprio vincolo e iniettare il repository come dipendenza. http://symfony.com/doc/current/cookbook/validation/custom_constraint.html#constraint-validators-with-dependencies – Cerad

risposta

2

Bene, ho pensato di creare un vincolo di convalida personalizzato, come suggerito da Cerad, ma mi è venuto in mente qualcosa di più semplice: Callback constraint.

use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Validator\Context\ExecutionContextInterface; 
use Acme\MyBundle\Entity\Entry; 

class SomeEntity { 

    /** 
    * @var Entry 
    */ 
    private $entry; 

    ... 

    /** 
    * @Assert\Callback 
    */ 
    public function validate(ExecutionContextInterface $context) { 
     if (!$this->entry->isAvailable()) { 
      $context 
      ->buildViolation('Entry is not available') 
      ->addViolation(); 
     } 
    } 

}