2015-02-23 14 views
5

Ich habe eine Entität, von denen ich Eigenschaften basierend auf einer Datenbankabfrage validieren möchte. Ich habe es definiert als Methode in meinem Repository, zum Beispiel:Symfony2 - Wahlbeschränkung mit Doctrine-Repository

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

    ... 
} 

Wie kann ich diese Wahlmöglichkeiten für die Wahl Einschränkung zur Verfügung zu stellen? Ich konnte es in meiner Einheit Klasse wie folgt definieren:

use Symfony\Component\Validator\Constraints as Assert; 

class SomeEntity { 

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

    ... 

    } 

Dies würde jedoch erfordern mir diese Methode statisch im Repository zu machen, was kein guter Weg ist, um Repository Methoden zu definieren.

Gibt es eine Möglichkeit, es richtig zu machen? Oder vielleicht versuche ich das Rad neu zu erfinden und es gibt einen besseren Weg zu tun, was ich hier versuche?

+2

Ich denke, Ihre beste Wette wäre, Ihre eigene Einschränkung zu erstellen und das Repository als Abhängigkeit zu injizieren. http://symfony.com/doc/current/cookbook/validation/custom_constraint.html#constraint-validators-with-dependencies – Cerad

Antwort

2

Nun, ich habe überlegt, eine benutzerdefinierte Validierungsbeschränkung zu erstellen, wie Cerad vorgeschlagen hat, aber ich habe mir etwas etwas Einfacheres einfallen lassen - 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(); 
     } 
    } 

}