@Flying

Best practicies валидации Entity properties в Symfony 2

В процессе изучения Symfony 2 появился вопрос о том как лучше организовать валидацию элементов Doctrine entities. Например меня есть entity User, в ней есть свойство $email и я хочу быть уверен что это свойство является валидным email.
class User 
{
  /**
   * @var string
   * @ORM\Column(type="string")
   */
  protected $email;

  /**
   * @return string
   */
  public function getEmail() 
  {
     return $this->email;
  }

  /**
   * @param string $email
   * @return $this
   */ 
  public function setEmail($email) 
  {
    // Вот здесь по-идее должен быть код проверки
    $this->email = $email;
    return $this;
  }

}


Ранее, при использовании Doctrine совместно с ZF1 я просто в методе сеттера использовал соответствующий валидатор и кидал exception в случае некорректного значения. Однако в Symfony я не могу получить DI container из entity, а следовательно не могу корректно получить сервис валидатора. Можно было бы попробовать использовать классы валидаторов непосредственно, но они похоже для этого не предназначены.

Альтернативно, как я понимаю, можно использовать @Assert\xxxx аннотации и производить валидацию извне, но на первый взгляд метод выглядит не совсем подходящим, или это только так кажется?

Чтение документации и поиск в Google однозначного ответа не дал, поэтому прошу помощи уважаемого хабрасообщества: как в Symfony предполагается решать задачу валидации свойств Entity классов? Объяснения, ссылки на статьи и / или примеры кода для дальнейшего изучения будут приняты с благодарностью.
  • Вопрос задан
  • 4136 просмотров
Решения вопроса 1
slimus
@slimus
Symfony, Golang
Вам нужно начать с этого мануала: symfony.com/doc/current/book/validation.html
Коментарий выше описал еще один варианнт валидации. Тут все на любителя: мне не понравились аннотации и я все конфиги пишу в yml, в том числе и валидатор.
Пока более конкретного на Ваш вопрос ответить нельзя потому что вопроса то и нет. В мануале написаны все случаи которые Вам могут пригодится на первом этапе, если будут вопросы — задавайте в этой ветке, постараюсь ответить
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@scard
About me
Однако вполне логично методы проверки свойств объекта упрятать в сам объект и проверку проводить соответствующим методом. Мне нравится для этого использовать такой паттерн

есть свойство скажем referalUserId
Объект класса правильный, если скажем этот самый referalUserId содержится/не содержится с какой-либо табличке какой-то базы данных - все проверки делаем в методе класса

public function isReferalUserIdLegal(){
// наш проверяющий на валидность код
return true/false в зависимости от итогов проверки
}

ну а в валидаторе.yml указуем на класс и метод чека
# src/Acme/MyBundle/Resources/config/validation.yml
Acme\MyBundle\Entity\Myclass:
getters:
ReferalUserIdLegal:
- "True": { message: "Реферал может быть только очень реферальным!" }

Вуаля
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы