Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Контроллеры и действия

Контроллер — класс, который принимает запрос и возвращает ответ. Его публичные методы с окончанием 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 в маршрутеМетод контроллера
indexindexAction()
viewviewAction()
addaddAction()

Действие с параметром

Маршрут 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.