Encodera

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

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

Оглавление

Ответ

Ответ — то, что сервер отправляет браузеру: код состояния, заголовки и тело. Обычно действие возвращает 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().

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

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