Symfony. Как сделать валидацию полей формы с зависимостью от значений других полей?

Всем доброго времени суток! Столкнулся с такой проблемой, что надо сделать валидацию формы сущности Post с определенной бизнес логикой.

Что есть:

  • форма для редактирования св-в Post (публикация) которую может редактировать пользователь
  • валидация сущности Post через аннотации
  • у сущности Post есть признак публикации (published) и дата публикации (publishedAt)
  • дата публикации обязательна и должна быть больше или равно текущий дате, если выставлен признак публикации
  • если признак публикации снят, то дату публикации никак не валидируем

Вопрос! Можно ли как то сделать такую валидацию без написания собственного валидатора поля "дата публикации"?

class Post
{
  /**
     * @Assert\NotNull
     */
  public bool $published;
  
    /**
     * Как написать правила валидации для этого св-ва?
     * @Assert\DateTime
     */
  public \DateTime $publishedAt;
}

Ответы (1 шт):

Автор решения: Denis Startsev

Можно через callback

use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Constraints as Assert;
class Post
{
...

/**
 * @Assert\Callback
 */
public function validate(ExecutionContextInterface $context, $payload)
{
    if ($this->published)
    {
        if (!$this->publishedAt || $this->publishedAt < (new \Datetime()))
        {
            $context->buildViolation('Сообщение о ошибке')
               ->atPath('publishedAt ')
               ->addViolation();
        }
    }

}
...
→ Ссылка