Запрос и ответ
Запрос — всё, что прислал браузер: адрес, параметры, поля формы. Ответ — то, что сайт отправляет обратно: страница, перенаправление или данные. В контроллере они доступны как $this->request и $this->response, создавать их не нужно.
Параметры адреса
// src/Controller/ArticlesController.php
public function index(): void
{
$search = $this->request->getQuery('q');
$this->set('search', $search);
}getQuery() читает параметр после знака вопроса. Для адреса /articles?q=php переменная $search получит строку php, а если параметра нет — null.
Значение по умолчанию
$page = (int) $this->request->getQuery('page', 1);Второй аргумент возвращается, когда параметра в адресе нет. Значения из адреса всегда приходят строками, поэтому число приводят явно.
Поля формы
public function add(): void
{
if ($this->request->is('post')) {
$title = $this->request->getData('title');
$all = $this->request->getData();
}
}is('post') проверяет, что форма отправлена. getData('title') возвращает одно поле, getData() без аргументов — массив всех полей.
Что ещё есть в запросе
| Вызов | Что возвращает |
|---|---|
getQuery('q') | Параметр адреса |
getData('title') | Поле формы |
getParam('controller') | Часть маршрута: контроллер, действие |
is('post'), is('ajax') | Проверка вида запроса |
getHeaderLine('User-Agent') | Заголовок запроса |
clientIp() | Адрес посетителя |
Перенаправление
public function old()
{
return $this->redirect(['action' => 'index']);
}redirect() отправляет браузер на другую страницу. Адрес задают массивом, как в маршрутах: здесь посетитель с /articles/old попадёт на /articles. Можно передать и строку: $this->redirect('/').
Ответ JSON
public function count()
{
$data = ['count' => 3];
return $this->response
->withType('application/json')
->withStringBody(json_encode($data));
}Если действие возвращает ответ, шаблон не выводится. По адресу /articles/count браузер покажет {"count":3}. Код состояния меняют методом withStatus(404).
Ограничение метода
public function delete(int $id)
{
$this->request->allowMethod(['post', 'delete']);
// удаление записи
return $this->redirect(['action' => 'index']);
}allowMethod() отклоняет запрос любым другим методом с ошибкой 405. Так действие, меняющее данные, нельзя вызвать простой ссылкой.
Частая ошибка
$this->redirect(...) без слова return не останавливает действие: код ниже продолжит выполняться, и запись может сохраниться или удалиться, хотя посетителя уже отправили на другую страницу. Всегда пишите return $this->redirect(...).