После создания формы, вам может потребоваться использовать её в своих целях. Для этого есть несколько вариантов.
¶Форма как контроллер
Формы могут выступать контроллерами маршрутов.
Для этого, конкретному маршруту необходимо указать свойство _form
.
Например:
foo.form:
path: '/my-custom-form'
defaults:
_form: '\Drupal\foo\Form\FooForm'
requirements:
_permission: 'access content'
¶Программный вызов формы
Формы также могут быть запрошены программно в виде рендер массива. Как вы будете использовать результат программного вызова — ложится на плечи разработчика.
Для построения формы программно используется сервис form_builder
. Он позволяет подготавливать форму несколькими способами.
¶Получение формы
Метод getForm()
позволяет получить форму по её названию или экземпляру объекта. В качестве результата вы получите готовый рендер массив готовый для рендера.
Данный способ подразумевает что вам нужна форма в том виде, в каком она объявлена.
Например:
$form = \Drupal::formBuilder()->getForm('Drupal\foo\Form\FooForm');
Вы также можете передавать дополнительные аргументы для формы. В дальнейшем они будут доступны в форме через вызов $form_state->getBuildInfo()['args']
.
Например:
$form = \Drupal::formBuilder()->getForm('Drupal\foo\Form\FooForm', 'foo', 'bar');
¶Построение формы
Метод buildForm()
является более низкоуровневым вариантом getForm()
. В действительности getForm()
является обёрткой для buildForm()
.
Основное отличие в том, что в buildForm()
вы должны самостоятельно подготовить состояние формы FormStateInterface
и передать его. При помощи данного подхода, вы можете кешировать состояние формы и собирать предыдущий вариант из кеша при необходимости.
Результатом выполнения будет также рендер массив.
Например:
$form_state = new FormState();
$form_state->set('some_value', 'Hello World');
$form = \Drupal::formBuilder()->buildForm('Drupal\foo\Form\FooForm', $form_state);
¶Ссылки
- Drupal 8: Form API что изменилось и как использовать, Niklan, 2015