Symfony 2: проверка полей на уникальность и прочие валидации

При создании сущностей в Symfony, а точнее, в yml-файле конфигурации можно задать различные свойства для полей, на основе которые потом будет строиться форма (а следовательно, клиентская валидация) и создаваться таблица в базе данных. Так, например, сущность Category имеет следующие поля:

Двух пока достаточно. На основе этой конфигурации, поле для ввода имени (name) будет input[type=”text”] с ограничением 255 символов и обязательным для ввода. Что касается таблицы в базе данных, то там для name будет поле типа string, длиной 255 символов, причем имя должно быть уникальным.

Если на этом и остановиться, то в дальнейшем будет неизбежная проблема (даже если будет работать клиентская валидация, что, конечно, бывает не всегда) – при попытке создать категории с одинаковым именем вылетит ошибка базы данных – поле то уникальное!

Раньше я эту проблему решала типичным клешневым способом: до записи в базу данных проверяла принудительно – есть ли строка с таким полем или нет. Но потом я узнала про встроенную в symfony валидацию… (Конечно, я знала про нее и раньше, но не знала, что она настолько крута.)

Есть два способа использовать эту валидацию – через аннотации в php-файлах сущностей и в yml-файле, одном для всех сущностей бандла. Мне больше нравится второй – все в одном месте. Для того, чтобы воспользоваться валидацией, надо:

  • проверить, что в файле app/config/config.yml эта самая валидация разрешена
  • создать в файл MyBundle/Resources/config/validation.yml
  • написать там сами правила (подробнее про встроенные правила валидации http://symfony.com/doc/current/reference/constraints.html), например:

Теперь, при отправке невалидных данных, после процедуры $form->handleRequest($request) в форму будут переданы все данные об ошибках, а узнать об этом в контроллере можно с помощью $form->isValid(). При выводе формы в шаблоне все ошибки будут отображены рядом со своим полем.

Вот и все!

ПС.: Вывод формы, ее ошибок можно (и нужно) кастомизовать, но это тема уже другой статьи.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: