Ответ
Ответ — то, что сервер отправляет браузеру: код состояния, заголовки и тело. Обычно действие возвращает ViewModel, и ответом становится HTML-страница. Но иногда нужно другое: отправить посетителя на другой адрес, сообщить, что страницы нет, или отдать данные для JavaScript.
Перенаправление
После сохранения или удаления посетителя переводят на другую страницу. Это делает помощник redirect():
// module/Blog/src/Controller/PostController.php
public function deleteAction()
{
// здесь статья будет удаляться
return $this->redirect()->toRoute('blog');
}Откройте /blog/delete/5 — браузер сразу окажется на /blog. Результат redirect() обязательно возвращают из действия.
| Вызов | Куда ведёт |
|---|---|
toRoute('blog') | На маршрут по имени |
toRoute('blog/view', ['id' => 5]) | На маршрут с параметрами |
toUrl('https://example.com') | На произвольный адрес |
refresh() | На ту же страницу |
Ошибка 404
Маршрут /blog/999 существует, а статьи с таким номером может не быть. Тогда действие сообщает, что страница не найдена:
public function viewAction()
{
$id = (int) $this->params()->fromRoute('id');
if ($id > 100) {
return $this->notFoundAction();
}
return new ViewModel(['id' => $id]);
}notFoundAction() ставит код 404 и показывает шаблон module/Application/view/error/404.phtml. Условие с числом 100 временное: когда появится база данных, здесь будет проверка, нашлась ли статья.
Код состояния и заголовки
Код и заголовки меняют через объект ответа:
$response = $this->getResponse();
$response->setStatusCode(403);
$response->getHeaders()->addHeaderLine('X-Robots-Tag', 'noindex');После этого действие может вернуть обычный ViewModel — страница отправится с кодом 403.
Ответ JSON
JSON — текстовый формат данных, который понимает JavaScript. Сначала включите стратегию вывода JSON в config/autoload/global.php:
// config/autoload/global.php
return [
'view_manager' => [
'strategies' => ['ViewJsonStrategy'],
],
];Если в файле уже есть другие разделы, добавьте view_manager рядом с ними. Теперь действие может вернуть JsonModel:
use Laminas\View\Model\JsonModel;
public function statusAction()
{
return new JsonModel([
'status' => 'ok',
'posts' => 2,
]);
}Добавьте для действия status маршрут и откройте его: браузер покажет {"status":"ok","posts":2}, а заголовок ответа Content-Type будет равен application/json. Шаблон и макет для JsonModel не нужны.
Частая ошибка
Вызов $this->redirect()->toRoute('blog'); без return ничего не прерывает: действие выполняется дальше, а Laminas потом ищет шаблон и может показать страницу вместо перехода. Всегда пишите return $this->redirect()->... — то же относится к notFoundAction().