Запросы и ответы
Запрос — то, что прислал браузер: параметры адреса, поля формы, заголовки. Ответ — то, что сайт отправляет обратно. В Yii за них отвечают два компонента: Yii::$app->request и Yii::$app->response. Отдельных файлов для них нет — ими пользуются внутри действий контроллера.
Чтение параметров
Добавьте в controllers/PostController.php действие поиска:
// controllers/PostController.php
use Yii;
public function actionSearch(): string
{
$q = Yii::$app->request->get('q', '');
return "Вы искали: $q";
}Адрес /post/search?q=yii покажет «Вы искали: yii». Второй аргумент get() — значение по умолчанию на случай, когда параметра нет.
Методы запроса
| Вызов | Что возвращает |
|---|---|
$request->get('q') | Параметр адреса |
$request->post('title') | Поле отправленной формы |
$request->post() | Все поля формы массивом |
$request->isPost | true, если метод запроса POST |
$request->isAjax | true, если запрос отправлен скриптом |
$request->userIP | Адрес посетителя |
$request->headers->get('User-Agent') | Заголовок запроса |
Здесь $request — это Yii::$app->request.
Перенаправление
После сохранения данных посетителя отправляют на другую страницу методом контроллера redirect():
public function actionRandom()
{
return $this->redirect(['post/view', 'id' => 5]);
}Адрес задаётся так же, как в Url::to(): маршрут и параметры. Браузер, открыв /post/random, окажется на /posts/5. Есть и короткие варианты: $this->goHome() ведёт на главную, $this->refresh() заново открывает текущую страницу.
Ответ в формате JSON
JSON — текстовый формат обмена данными между программами. Метод asJson() превращает массив в такой ответ:
public function actionStatus()
{
return $this->asJson(['status' => 'ok', 'posts' => 12]);
}Страница /post/status выведет {"status":"ok","posts":12} и отправит заголовок Content-Type: application/json.
Ошибка 404
Чтобы ответить «страница не найдена», бросают исключение:
use yii\web\NotFoundHttpException;
public function actionView(int $id): string
{
if ($id > 100) {
throw new NotFoundHttpException('Статья не найдена.');
}
return "Статья номер $id";
}Адрес /posts/500 покажет стандартную страницу ошибки с кодом 404 и вашим текстом. Для других кодов есть похожие классы: ForbiddenHttpException (403), BadRequestHttpException (400).
Отправка файла
public function actionDownload()
{
return Yii::$app->response->sendFile(Yii::getAlias('@app/files/price.pdf'));
}Браузер предложит сохранить файл. Запись @app — псевдоним пути, он означает папку проекта.
Частая ошибка
redirect() не останавливает действие сам — он лишь возвращает объект ответа. Без return код продолжит выполняться, и перенаправления не будет. Всегда пишите return $this->redirect(...).