Запросы и ответы
Запрос — то, что браузер прислал сайту: адрес, параметры, поля формы. Ответ — то, что сайт отправляет обратно. В контроллере запрос доступен как $this->request, ответ — как $this->response. Создавать их не нужно: оба объекта достаются от BaseController.
Параметры адреса
Параметры после знака вопроса читает метод getGet():
// app/Controllers/Posts.php
public function search(): string
{
$query = $this->request->getGet('q');
return 'Вы искали: ' . esc($query);
}Добавьте маршрут $routes->get('search', 'Posts::search'); и откройте /search?q=php — страница покажет «Вы искали: php». Если параметра нет, getGet() вернёт null. Функция esc() делает текст безопасным для вывода; о ней — в уроке о шаблонах.
Поля формы
Данные, отправленные формой методом POST, читает getPost():
public function create(): string
{
$title = $this->request->getPost('title');
return 'Получен заголовок: ' . esc($title);
}Без аргумента getPost() возвращает массив всех полей.
Другие методы запроса
| Метод | Что возвращает |
|---|---|
getGet('q') | Параметр адреса |
getPost('title') | Поле формы |
getJSON(true) | Тело запроса JSON в виде массива |
getMethod() | Метод запроса: GET, POST |
is('post') | true, если запрос отправлен методом POST |
getIPAddress() | Адрес посетителя |
Перенаправление
После сохранения формы посетителя отправляют на другую страницу:
public function create()
{
// здесь данные сохраняются
return redirect()->to('/posts');
}Браузер сам откроет /posts. Есть и другие варианты:
return redirect()->route('posts.show', [5]); // по имени маршрута
return redirect()->back(); // на предыдущую страницуОтвет JSON
JSON — текстовый формат данных, который понимают программы на JavaScript и мобильные приложения:
public function status()
{
return $this->response->setJSON(['status' => 'ok', 'posts' => 12]);
}Браузер получит строку вида {"status":"ok","posts":12} и заголовок с типом application/json.
Код состояния
Код состояния сообщает, чем закончился запрос: 200 — успех, 404 — не найдено. Его задаёт setStatusCode():
return $this->response->setStatusCode(404)->setBody('Статья не найдена');Частая ошибка
Вызов redirect()->to('/posts'); без слова return ничего не делает: функция только создаёт объект ответа, а отправляет его фреймворк, получив из метода. Метод продолжит работу, и посетитель останется на пустой странице. Перед redirect() всегда пишите return.