Повний посібник (v2) Відповіді - Українська спільнота Yii Framework

Коли програма закінчує обробку запиту, вона генерує об'єкт відповіді та надсилає його користувачеві. Об'єкт відповіді містить такі дані, як HTTP-код стану, HTTP-заголовки та тіло відповіді. Кінцева мета розробки Web-програми полягає у створенні об'єктів відповіді різні запити.

У більшості випадків вам доведеться мати справу з компонентом програми response, який за умовчанням є екземпляром класу yii\web\Response. Однак Yii також дозволяє вам створювати власні об'єкти відповіді та надсилати їх користувачам. Це буде розглянуто нижче.

У цьому розділі ми опишемо, як складати відповіді та надсилати їх користувачам.

Код стану #

Перше, що ви робите під час побудови відповіді, — визначаєте, чи було успішно опрацьовано запит. Це реалізується завданням властивості yii\web\Response::statusCode значення, яке може бути одним із валідних HTTP-кодів стану. Наприклад, щоб показати, що запит був успішно оброблений, ви можете встановити значення коду стану 200:

Однак у більшості випадків явна установка не потрібна, оскільки значення yii\web\Response::statusCode за замовчуванням дорівнює 200. Якщо ж вам потрібно показати, що запит не вдався, ви можете викинути відповідне HTTP-виключення:

Коли обробник помилок упіймає виняток, він витягне код стану з винятку і призначить його відповіді. Виняток yii\web\NotFoundHttpException у коді вище представляє HTTP-код стану 404. У Yii визначено такі HTTP-виключення:

Якщо у наведеному вище списку немає винятку, який ви хочете викинути, ви можете створити його, розширивши клас yii\web\HttpException, або викинути його безпосередньо з кодом стану, наприклад:

HTTP-заголовки #

Ви можете надсилати HTTP-заголовки, працюючи з колекцією заголовків компонента response :

Info: назви заголовків не чутливі до регістру символів. Заново зареєстровані заголовки не надсилаються користувачеві до виклику yii\web\Response::send().

Тіло відповіді #

Більшість відповідей повинні мати тіло, яке містить те, що ви хочете показати користувачам.

Якщо у вас вже є відформатований рядок для тіла, ви можете надати його властивості yii\web\Response::content об'єкта запиту:

Якщо ваші дані перед надсиланням кінцевим користувачам потрібно привести до певного формату, вам слід встановити значення двох властивостей: format та data. Властивість format визначає, у якому форматі слід повертати дані із data. Наприклад:

Yii з коробки має підтримку наступних форматів, кожен із яких реалізований класом форматтера. Ви можете налаштувати ці форматтери або додати нові через властивість yii\web\Response::formatters.

Хоча тіло запиту може бути явно встановлено наведеним вище способом, у більшості випадків ви можете задавати його неявно через значення методів дій, що повертається. Типовий приклад використання:

Дія index у коді вище повертає результат рендерингу подання index. Значення, що повертається, буде взято компонентом response , відформатовано і потім відправлено користувачам.

Оскільки за промовчанням форматом відповіді є HTML, у методі дії слід повернути рядок. Якщо ви бажаєте використати інший формат відповіді, необхідно налаштувати його перед відправкою даних:

Як уже було сказано, крім використання стандартного компонента програми response ви також можете створювати свої об'єкти відповіді та надсилати їх кінцевим користувачам. Ви можете зробити це, повертаючи такий об'єкт уметод дії:

Note: створюючи власні об'єкти відповідей, ви не зможете скористатися конфігурацією компонента response, налаштованої вами в конфігурації програми. Тим не менш, ви можете скористатися впровадженням залежності, щоб застосувати загальну конфігурацію до нових об'єктів відповіді.

Перенаправлення браузера #

Перенаправлення браузера базується на надсиланні заголовка HTTP Location . Так як ця можливість широко застосовується, Yii має кошти на її використання.

У наведеному вище коді метод дії повертає результат redirect(). Як говорилося вище, об'єкт відповіді, що повертається методом дії, використовуватиметься як відповідь кінцевим користувачам.

У коді, що знаходиться поза методами дій, слід використовувати yii\web\Response::redirect() і безпосередньо після нього метод yii\web\Response::send(). Так можна бути впевненим, що до відповіді не буде додано небажаний вміст.

Надсилання файлів #

Як і перенаправлення браузера, відправлення файлів є ще однією можливістю, що базується на певних HTTP-заголовках. Yii надає набір методів для вирішення різноманітних завдань щодо відправлення файлів. Усі вони підтримують HTTP-заголовок range.

  • yii\web\Response::sendFile(): надсилає клієнту існуючий файл.
  • yii\web\Response::sendContentAsFile(): надсилає клієнтові рядок як файл.
  • yii\web\Response::sendStreamAsFile(): надсилає клієнту існуючий файловий потік як файл.

Ці методи мають однакову сигнатуру та повертають об'єкт відповіді. Якщо файл, що відправляється, дуже великий, слід використовувати yii\web\Response::sendStreamAsFile(), так як він більш ефективно використовує оперативну пам'ять. Наступний приклад показує, яквідправити файл у дії контролера:

При викликі методу надсилання файлу поза методами дій щоб бути впевненим, що до відповіді не буде додано ніякого небажаного вмісту, слід викликати відразу після нього yii\web\Response::send().

Деякі Web-сервери підтримують особливий режим надсилання файлів, який називається X-Sendfile. Ідея в тому, щоб перенаправити запит файлу Web-серверу, який віддасть файл користувачеві самостійно. В результаті Web-програма може завершитися раніше, поки Web-сервер ще пересилає файл. Щоб скористатися цією можливістю, скористайтеся методом yii\web\Response::xSendFile(). Далі наведено посилання на те, як увімкнути X-Sendfile для популярних Web-серверів:

Надсилання відповіді #

Вміст відповіді не надсилається користувачеві до виклику методу yii\web\Response::send(). За замовчуванням він викликається автоматично наприкінці методу yii\base\Application::run(). Однак, щоб відповідь була надіслана негайно, ви можете викликати цей метод явно.

Для надсилання відповіді метод yii\web\Response::send() виконує такі кроки:

Повторний виклик yii\web\Response::send() ігнорується. Це означає, що якщо відповідь вже надіслано, то до неї вже нічого не додати.

Як видно, метод yii\web\Response::send() ініціює кілька корисних подій. Реагуючи на ці події можна налаштовувати або декорувати відповідь.