Работа с формами в Symfony 2

В этом тренинге мы рассмотрим два примера использования форм в Symfony 2. Сначала мы разместим форму элементов в Veiw файл и затем обработаем её в контроллере вручную. Далее, мы используем Symfony, чтобы представить исходную форму объективно-ориентированным способом, сохраняя значения.

Мы будем работать на простой установке базовой версии Symfony. Возможно вы знаете, что эта версия поставляется стандартной связкой, называемой AcmeDemoBundle, ей мы и будем пользоваться, чтобы проиллюстрировать всю работу с формами.

Не самый лучший способ.

Первый пример, который мы рассмотрим, содержит в себе информацию о том, как обрабатывать формы, объявленные обычными HTML-элементами внутри Symfony View файла. Здесь три шага, предпринятых нами для иллюстрирования этого:

  1. Мы создадим View файл,содержащий HTML форму;
  2. Мы создадим новый метод контроллера в WelcomeController(находящемся в классе form1Action), который будет обрабатывать наши бизнес-логики (визуализации представления, обработки, формы и др.);
  3. Далее мы создадим простую запись маршрута к верному URL-адресу, что ж теперь можно просмотреть полученную форму в браузере, и теперь вы знаете как её подать.

Давайте сначала создадим View файл, с целью посмотреть нашу заявку и представленные начальные значения. Для файла с именем form1.html.twig, находящегося в src/Acme/DemoBundle/Resources/views/Welcome(в соответствующую папку Welcome контроллер класса Symfony поставляется по умолчанию) у меня есть следующие:

Выше, я продлил макет по умолчанию в DemoBundle, хотя это необязательно. А остальное довольно просто: создаём HTML форму и показываем значения только текстового поля, находящегося выше формы(которая будет передаваться из контроллера после обработки в переменной с именем name).

Теперь давайте объявим метод контроллёра, который будет отвечать за отображение этого View файла, и обработаем форму внутри него. В WelcomeController делаю следующее:

  1. Я использую класс Request в Symfony, который поможет нам легко добраться до представленных значений.

    Выше указанно объявление класса(путь к данному классу).

  2. Дальше я использую следующий метод:

В этом методе я использую createFormGlobals(), находящейся в объекте $request, собравшем в себе суперглобальные переменные PHP (включая $_POST значения).Далее я проверяю: содержат ли представленные значения submit( работает как наша кнопка «отправить»), и если они всё-таки содержат, тогда я извлекаю значения элемента name и размещаю их в View, который мы создали ранее.

Наконец-то давайте определим правила маршрутизации для сопоставления URL-адреса, то есть путь к этому методу контроллера. В файл routing.yml, находящемся в src/Acme/DemoBundle/Resources/config, я добавил следующее правило:

Этот кусочек в результате предоставит путь к файлу form1/ через новый метод контроллера. Вот и всё, теперь можете попробовать сделать это самостоятельно. Но вы должны знать, что это не самый лучший способ обработки форм при работе с юридическими лицами или любым видом контента для вашего сайта. Symfony содержит несколько хороших классов, которые облегчат вам работу. Далее мы посмотрим, как действует один из них.

Сущность и формы Symfony

Забегаю вперёд, скажу, что сейчас мы будем смотреть на то, как представлять и обрабатывать Symfony формы Article.

Я проиллюстрирую простые способы, как показать формы, которые в дальнейшем будут сохранены в новой базе данных Article, использую Symfony. В основном мы будем работать с 5 файлами: файл класса контроллер, где мы добавим 2 новых метода для демонстрирования формы и просто страницы подтверждения; файл routing.yml, который понадобится нам для сопоставления URL-адресов; два Veiw файла для демонстрации формы и её подтверждения; и файл ArticleType.php, именно в нём мы будем создавать форму.

Начнём с последнего. Хотя вы можете создать форму непосредственно также внутри контроллера, но использование отдельного Типа файла придаёт данному методу многоразовость, так что мы будем делать именно это. Внутри нашего src/Acme/DemoBundle/Form, у нас есть файл с именем ArticleType со следующим содержанием:

Выше я продлил Symfony по умолчанию в классе создания, чтобы определить собственную форму. Метод buildForm() отвечает за создание формы. Внутри я добавил в объекту $builder различные элементы формы, которые подойдут к нашему Article и имеют такие же названия, как и свойства.

Метод getName() просто возвращает имя формы, в то время как сам тип с методом setDefaultOptions() мы указываем как класс сущностей, которые мы используем в этой форме (в качестве ключевого значения для data_class ). И всё, теперь мы имеем представление нашей формы, теперь давайте преобразуем её внутри контроллера и выставим получившуюся форму на всеобщее обозрение.

Ещё в класс WelcomeController я включил две ссылки для содержания и формы типа Article.

Далее я добавил следующие два метода:

Метод form2Action() отвечает за показ и обработку форму для создания нового Article. Сначала ведётся создание нового пустого объекта. Затем создаётся новая форма, используя типы форм, о которых мы говорили ранее. Дальше этот кусок программы будет обрабатывать форму, если она представлена, а если нет, тогда применяется вид form2.html-код.twig и форма преобразуется в HTML-формат. Давайте создадим этот файл сейчас, а затем вернёмся и посмотрим какие изменения произошли с уже обработанным файлом.

Здесь способ создания form1.html.twig :

Проще и быть не может! Он просто переделывает форму, которую мы туда зальём. Также давайте быстренько добавим следующий путь к нашему файлу routing.yml, что ж теперь мы можем увидеть все преобразование в браузере :

Сейчас мы можем указать в браузере путь к form2/ и увидеть простую(и ещё некрасивую) форму. О сейчас об обработке.

Как мы видели раннее метод form2Action() имеет передаваемые ему параметры объекта $request. Поэтому, когда мы обращаемся к этой форме, она использует метод handleRequest() объекта $form, который мы построили, чтобы увидеть, если форма была отправлена (если ее значения существуют в суперглобальных переменных $request ). Если это было сделано, тогда форма проходит стандартную проверку и сохраняется, как новый объект в базе данных(тот экземпляр, который мы изначально создали, будет автоматически заполнен формой значения). Наконец, сохраняется один запрос быстрого сообщения и перенаправляется на другую страницу, путь строится на основе другого маршрута:

Маршрут запускает метод form2savedAction(), (мы объявили его в классе WelcomeControlle), который принимает вид form2saved.html.twig View. И в этот View, всё, что я делаю сейчас – это просматриваю, есть ли сообщение в flashBag и распечатываю его:

Вот и всё. Теперь вы можете обновить форму и отправить её в браузер. Вы должны будете перенаправлены на простую страницу, которая показывает сообщение с подтверждением. И если вы проверите базу данных, то вы увидите новые записи Article, которые должны быть сохранены к этому времени.

Заключение.

В этой статье мы увидели очень простой способ применения системы Symfony 2 в работе с формами. Во-первых, мы узнали, как обрабатывать формы с помощью обычных HTML-элементов, напечатанных в View. Во-вторых, мы увидели, как использовать возможности Symfony, чтобы определять код формы для обработки и сохранения её содержания.

Каждому из этих способов есть применение на деле. Если вы выполняете CRUD операции на данных или контенте, тогда лучше использовать вторую опцию. Symfony является очень мощным средством, когда дело доходит до абстракции данных, и он отлично упрощает операцию создания форм. Если, однако, вы нуждаетесь в некоторых быстрых обработках формы, то вас не спасает ничего, можно только построить форму прямо в представление, а затем найти представленные значения в контроллер.

Если у вас есть какие-то вопросы, комментарии или же вы хотите знать больше, то дайте нам знать!

Теги: Создание форм в Symfony 2, обработка форм в Symfony 2, CRUD операции, операция создания форм, абстракция данных