I have an entity, one of which properties I would like to validate based on a database query. I have it defined as a method in my repository, for example:
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();
    }
    ...
}
How can I use this to provide available choices for the choice constraint? I could define it in my entity class like this:
use Symfony\Component\Validator\Constraints as Assert;
class SomeEntity {
    /**
     * @Assert\Choice(callback = {"Acme\MyBundle\Entity\EntryRepository", "getValidEntries"})
     * ...
     */
    private $entry;
    ...
    }
However, this would require me to make this method static in the repository, which isn't a good way to define repository methods.
Is there a way to do it properly? Or maybe I'm trying to reinvent the wheel and there is a better way to do what I'm trying to do here?
Well, I contemplated creating a custom validation constraint, as Cerad suggested, but I've come up with something a little simpler - 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();
        }
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With