Контроллеры и действия
Контроллер — класс, который принимает запрос и возвращает ответ. Его публичные методы с окончанием Action называются действиями: одно действие — одна страница. Контроллеры модуля лежат в папке module/<Модуль>/src/Controller.
Создание контроллера
Команды для этого нет. Создайте папку module/Blog/src/Controller и в ней файл PostController.php:
// module/Blog/src/Controller/PostController.php
namespace Blog\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
class PostController extends AbstractActionController
{
public function indexAction()
{
$response = $this->getResponse();
$response->setContent('Список статей');
return $response;
}
}Класс наследует AbstractActionController — от него контроллер получает метод getResponse() и другие инструменты. Действие записывает текст в объект ответа и возвращает его.
Регистрация
Laminas не создаёт контроллер, пока не узнает, как это сделать. Добавьте в module/Blog/config/module.config.php раздел controllers — рядом с разделом router:
// module/Blog/config/module.config.php
// в начале файла: use Laminas\ServiceManager\Factory\InvokableFactory;
'controllers' => [
'factories' => [
Controller\PostController::class => InvokableFactory::class,
],
],Слева — класс контроллера, справа — фабрика, то есть класс, который умеет его создать. InvokableFactory — самая простая фабрика: она вызывает new PostController() без аргументов.
Откройте http://localhost:8080/blog — на странице появится текст «Список статей».
Имя действия
Маршрут называет действие коротким именем, а метод получает окончание Action:
Значение action в маршруте | Метод контроллера |
|---|---|
index | indexAction() |
view | viewAction() |
add | addAction() |
Действие с параметром
Маршрут blog/view передаёт параметр id. Добавьте в контроллер второе действие:
public function viewAction()
{
$id = (int) $this->params()->fromRoute('id');
$response = $this->getResponse();
$response->setContent("Статья $id");
return $response;
}Метод $this->params()->fromRoute('id') возвращает значение параметра из адреса. По адресу /blog/5 страница покажет «Статья 5».
Что возвращает действие
Возвращать готовый ответ с текстом удобно только для проверки. Обычно действие возвращает объект ViewModel с данными, а HTML собирает шаблон — этому посвящён следующий урок.
Частая ошибка
Контроллер, указанный в маршруте, но не добавленный в controllers.factories, Laminas создать не может. Сайт ответит ошибкой 404 с пояснением, что контроллер не удалось сопоставить с существующим классом. Каждый новый контроллер — это новая строка в разделе controllers.