Формы
Форма в Laminas — объект. В его классе перечислены поля, а шаблон выводит их готовыми помощниками. Контроллер передаёт форме присланные данные и забирает их обратно уже разобранными. За это отвечает пакет laminas-form; классы форм лежат в module/<Модуль>/src/Form.
Установка
composer require laminas/laminas-formУстановщик предложит вписать в config/modules.config.php модуль Laminas\Form и несколько связанных с ним — согласитесь на все.
Класс формы
Создайте файл вручную:
// module/Blog/src/Form/PostForm.php
namespace Blog\Form;
use Laminas\Form\Element;
use Laminas\Form\Form;
class PostForm extends Form
{
public function __construct()
{
parent::__construct('post');
$this->add([
'name' => 'title',
'type' => Element\Text::class,
'options' => ['label' => 'Заголовок'],
]);
$this->add([
'name' => 'body',
'type' => Element\Textarea::class,
'options' => ['label' => 'Текст'],
]);
$this->add([
'name' => 'submit',
'type' => Element\Submit::class,
'attributes' => ['value' => 'Сохранить'],
]);
}
}Каждый вызов add() добавляет одно поле: name — имя поля, type — класс элемента, options.label — подпись, attributes — атрибуты HTML.
| Элемент | Что выводит |
|---|---|
Element\Text | Однострочное поле |
Element\Textarea | Многострочное поле |
Element\Email, Element\Password | Поля почты и пароля |
Element\Select | Выпадающий список |
Element\Checkbox | Флажок |
Element\Submit | Кнопку отправки |
Показ формы
Действие создаёт форму и передаёт её в шаблон:
// module/Blog/src/Controller/PostController.php
use Blog\Form\PostForm;
public function addAction()
{
$form = new PostForm();
return new ViewModel(['form' => $form]);
}Шаблон выводит форму по частям:
<!-- module/Blog/view/blog/post/add.phtml -->
<h1>Новая статья</h1>
<?php $form = $this->form; ?>
<?php $form->prepare(); ?>
<?= $this->form()->openTag($form) ?>
<?= $this->formRow($form->get('title')) ?>
<?= $this->formRow($form->get('body')) ?>
<?= $this->formSubmit($form->get('submit')) ?>
<?= $this->form()->closeTag() ?>openTag() выводит открывающий тег form с методом POST, formRow() — подпись, поле и ошибки к нему. Откройте /blog/add — на странице два поля и кнопка.
Обработка
Дополните действие: при отправке форма получает данные, проверяет их и отдаёт обратно.
use Blog\Model\Post;
public function addAction()
{
$form = new PostForm();
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->getPost());
if ($form->isValid()) {
$post = new Post();
$post->exchangeArray($form->getData());
$this->posts->save($post);
return $this->redirect()->toRoute('blog/view', ['id' => $post->id]);
}
}
return new ViewModel(['form' => $form]);
}Заполните форму и нажмите «Сохранить»: статья попадёт в таблицу posts, а браузер откроет её страницу. Пока правил проверки нет, isValid() принимает любые данные — правила добавит следующий урок.
Изменение статьи
В действии edit форму сначала заполняют значениями из базы:
$form->setData(['title' => $post->title, 'body' => $post->body]);Поля появятся уже с текстом статьи. При отправке порядок тот же: setData(), isValid(), getData(), save().
Частая ошибка
Метод getData() можно вызывать только после isValid(). Если вызвать его раньше, Laminas выбросит исключение о том, что форма ещё не проверена. Порядок всегда один: setData(), затем isValid(), затем getData().