При создании сущностей в Symfony, а точнее, в yml-файле конфигурации можно задать различные свойства для полей, на основе которые потом будет строиться форма (а следовательно, клиентская валидация) и создаваться таблица в базе данных. Так, например, сущность Category имеет следующие поля:
App\MyBundle\Entity\Category:
type: entity
repositoryClass: App\MyBundle\Repository\CategoriesRepository
table: categories
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
name:
type: string
length: 255
unique: true
Двух пока достаточно. На основе этой конфигурации, поле для ввода имени (name) будет input[type=»text»] с ограничением 255 символов и обязательным для ввода. Что касается таблицы в базе данных, то там для name будет поле типа string, длиной 255 символов, причем имя должно быть уникальным.
Если на этом и остановиться, то в дальнейшем будет неизбежная проблема (даже если будет работать клиентская валидация, что, конечно, бывает не всегда) — при попытке создать категории с одинаковым именем вылетит ошибка базы данных — поле то уникальное!
Раньше я эту проблему решала типичным клешневым способом: до записи в базу данных проверяла принудительно — есть ли строка с таким полем или нет. Но потом я узнала про встроенную в symfony валидацию… (Конечно, я знала про нее и раньше, но не знала, что она настолько крута.)
Есть два способа использовать эту валидацию — через аннотации в php-файлах сущностей и в yml-файле, одном для всех сущностей бандла. Мне больше нравится второй — все в одном месте. Для того, чтобы воспользоваться валидацией, надо:
- проверить, что в файле app/config/config.yml эта самая валидация разрешена
validation: { enabled: true, enable_annotations: true }
- создать в файл MyBundle/Resources/config/validation.yml
- написать там сами правила (подробнее про встроенные правила валидации http://symfony.com/doc/current/reference/constraints.html), например:
App\MyBundle\Entity\Category: constraints: - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: # проверка уникальности fields: [name] message: "Название категории должно быть уникальным" # cообщение, которое будет выведенно в форме при отправке невалидных данных properties: name: - NotBlank: # проверка, что имя заполнено, если не работает клиентская валидация message: "Введите название категории"
Теперь, при отправке невалидных данных, после процедуры $form->handleRequest($request)
в форму будут переданы все данные об ошибках, а узнать об этом в контроллере можно с помощью $form->isValid()
. При выводе формы в шаблоне все ошибки будут отображены рядом со своим полем.
Вот и все!
ПС.: Вывод формы, ее ошибок можно (и нужно) кастомизовать, но это тема уже другой статьи.