Encodera

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

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

Оглавление

Запрос и ответ

Запрос — всё, что прислал браузер: адрес, параметры, поля формы. Ответ — то, что сайт отправляет обратно: страница, перенаправление или данные. В контроллере они доступны как $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(...).

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

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