Відповіді
Flight допомагає генерувати частину заголовків відповіді для вас, але ви контролюєте більшу частину того, що ви повертаєте користувачу. Іноді ви можете безпосередньо отримати доступ до об'єкта Response
, але зазвичай ви будете використовувати екземпляр Flight
, щоб надіслати відповідь.
Відправка базової відповіді
Flight використовує ob_start() для буферизації виходу. Це означає, що ви можете використовувати echo
або print
, щоб надіслати відповідь користувачу, а Flight захопить її і надішле назад користувачу з відповідними заголовками.
// Це надішле "Hello, World!" до браузера користувача
Flight::route('/', function() {
echo "Hello, World!";
});
// HTTP/1.1 200 OK
// Content-Type: text/html
//
// Hello, World!
Як альтернатива, ви можете викликати метод write()
, щоб додати до тіла також.
// Це надішле "Hello, World!" до браузера користувача
Flight::route('/', function() {
// докладно, але робить свою справу, коли вам це потрібно
Flight::response()->write("Hello, World!");
// якщо ви хочете отримати тіло, яке ви встановили на цей момент
// ви можете зробити це так
$body = Flight::response()->getBody();
});
Коди статусу
Ви можете встановити код статусу відповіді, використовуючи метод status
:
Flight::route('/@id', function($id) {
if($id == 123) {
Flight::response()->status(200);
echo "Hello, World!";
} else {
Flight::response()->status(403);
echo "Заборонено";
}
});
Якщо ви хочете отримати поточний код статусу, ви можете використовувати метод status
без аргументів:
Flight::response()->status(); // 200
Встановлення тіла відповіді
Ви можете встановити тіло відповіді, використовуючи метод write
, однак, якщо ви щось echo або print,
воно буде захоплено і надіслано як тіло відповіді через буферизацію виходу.
Flight::route('/', function() {
Flight::response()->write("Hello, World!");
});
// те ж саме, що
Flight::route('/', function() {
echo "Hello, World!";
});
Очиснення тіла відповіді
Якщо ви хочете очистити тіло відповіді, ви можете використовувати метод clearBody
:
Flight::route('/', function() {
if($someCondition) {
Flight::response()->write("Hello, World!");
} else {
Flight::response()->clearBody();
}
});
Виконання колбеку на тілі відповіді
Ви можете виконати колбек на тілі відповіді, використовуючи метод addResponseBodyCallback
:
Flight::route('/users', function() {
$db = Flight::db();
$users = $db->fetchAll("SELECT * FROM users");
Flight::render('users_table', ['users' => $users]);
});
// Це стисне всі відповіді для будь-якого маршруту
Flight::response()->addResponseBodyCallback(function($body) {
return gzencode($body, 9);
});
Ви можете додати кілька колбеків, і вони будуть виконані в порядку, в якому були додані. Оскільки це може приймати будь-який викликаний, він може приймати масив класу [ $class, 'method' ]
, замикання $strReplace = function($body) { str_replace('hi', 'there', $body); };
, або ім'я функції 'minify'
, якщо у вас є функція для мінімізації вашого коду html, наприклад.
Примітка: Колбеки маршрутів не працюватимуть, якщо ви використовуєте параметр конфігурації flight.v2.output_buffering
.
Колбек для конкретного маршруту
Якщо ви хочете, щоб це застосовувалось лише до конкретного маршруту, ви можете додати колбек безпосередньо в маршрут:
Flight::route('/users', function() {
$db = Flight::db();
$users = $db->fetchAll("SELECT * FROM users");
Flight::render('users_table', ['users' => $users]);
// Це стисне лише відповідь для цього маршруту
Flight::response()->addResponseBodyCallback(function($body) {
return gzencode($body, 9);
});
});
Опція Middleware
Ви також можете використовувати middleware, щоб застосувати колбек до всіх маршрутів через middleware:
// MinifyMiddleware.php
class MinifyMiddleware {
public function before() {
// Застосуйте колбек тут на об'єкті response().
Flight::response()->addResponseBodyCallback(function($body) {
return $this->minify($body);
});
}
protected function minify(string $body): string {
// мінімізуйте тіло якимось чином
return $body;
}
}
// index.php
Flight::group('/users', function() {
Flight::route('', function() { /* ... */ });
Flight::route('/@id', function($id) { /* ... */ });
}, [ new MinifyMiddleware() ]);
Встановлення заголовка відповіді
Ви можете встановити заголовок, наприклад, тип вмісту відповіді, використовуючи метод header
:
// Це надішле "Hello, World!" до браузера користувача у простому тексті
Flight::route('/', function() {
Flight::response()->header('Content-Type', 'text/plain');
// або
Flight::response()->setHeader('Content-Type', 'text/plain');
echo "Hello, World!";
});
JSON
Flight надає підтримку для надсилання JSON та JSONP відповідей. Щоб надіслати JSON відповідь, ви передаєте деякі дані для JSON кодування:
Flight::json(['id' => 123]);
Примітка: За замовчуванням Flight надішле заголовок
Content-Type: application/json
з відповіддю. Він також використовуватиме константиJSON_THROW_ON_ERROR
іJSON_UNESCAPED_SLASHES
під час кодування JSON.
JSON з кодом статусу
Ви також можете передати код статусу як другий аргумент:
Flight::json(['id' => 123], 201);
JSON з гарною розміткою
Ви також можете передати аргумент до останньої позиції, щоб увімкнути гарну розмітку:
Flight::json(['id' => 123], 200, true, 'utf-8', JSON_PRETTY_PRINT);
Якщо ви змінюєте параметри, передані в Flight::json()
, і хочете простішу синтаксис:
Flight::map('json', function($data, $code = 200, $options = 0) {
Flight::_json($data, $code, true, 'utf-8', $options);
}
// І тепер це можна використовувати так
Flight::json(['id' => 123], 200, JSON_PRETTY_PRINT);
JSON і зупинка виконання (v3.10.0)
Якщо ви хочете надіслати JSON відповідь і зупинити виконання, ви можете використовувати метод jsonHalt
. Це корисно для випадків, коли ви перевіряєте авторизацію, і якщо
користувач не авторизований, ви можете миттєво надіслати JSON відповідь, очистити вміст тіла і зупинити виконання.
Flight::route('/users', function() {
$authorized = деякаПеревіркаАвторизації();
// Перевірте, чи користувач авторизований
if($authorized === false) {
Flight::jsonHalt(['error' => 'Неавторизований'], 401);
}
// Продовжте з рештою маршруту
});
До версії v3.10.0 вам потрібно було зробити щось подібне:
Flight::route('/users', function() {
$authorized = деякаПеревіркаАвторизації();
// Перевірте, чи користувач авторизований
if($authorized === false) {
Flight::halt(401, json_encode(['error' => 'Неавторизований']));
}
// Продовжте з рештою маршруту
});
JSONP
Для запитів JSONP ви можете необов'язково передати параметр запиту, який ви використовуєте, щоб визначити вашу функцію колбеку:
Flight::jsonp(['id' => 123], 'q');
Отже, коли ви здійснюєте GET запит, використовуючи ?q=my_func
, ви повинні отримати вихід:
my_func({"id":123});
Якщо ви не передасте параметр запиту, він за замовчуванням буде jsonp
.
Перенаправлення на іншу URL-адресу
Ви можете перенаправити поточний запит, використовуючи метод redirect()
і передаючи
нову URL-адресу:
Flight::redirect('/new/location');
За замовчуванням Flight надсилає HTTP код статусу 303 ("See Other"). Ви можете необов'язково встановити кастомний код:
Flight::redirect('/new/location', 401);
Зупинка
Ви можете зупинити фреймворк в будь-який момент, викликавши метод halt
:
Flight::halt();
Ви також можете вказати необов'язковий HTTP
код статусу і повідомлення:
Flight::halt(200, 'Давайте повернемося...');
Виклик halt
знищить будь-який контент відповіді до цього моменту. Якщо ви хочете зупинити
фреймворк і вивести поточну відповідь, використовуйте метод stop
:
Flight::stop();
Очищення даних відповіді
Ви можете очистити тіло відповіді та заголовки, використовуючи метод clear()
. Це очистить
будь-які заголовки, призначені відповіді, очистить тіло відповіді і встановить код статусу 200
.
Flight::response()->clear();
Очищення тіла відповіді тільки
Якщо ви хочете очистити лише тіло відповіді, ви можете використовувати метод clearBody()
:
// Це все ще зберігатиме будь-які заголовки, встановлені на об'єкті response().
Flight::response()->clearBody();
HTTP кешування
Flight надає вбудовану підтримку для кешування на рівні HTTP. Якщо умова кешування
виконана, Flight поверне HTTP 304 Not Modified
відповідь. Наступного разу, коли
клієнт запитає той же ресурс, йому буде запропоновано використовувати їх локально
закешовану версію.
Кешування на рівні маршруту
Якщо ви хочете кешувати вашу всю відповідь, ви можете використовувати метод cache()
і передати час для кешування.
// Це кешуватиме відповідь на 5 хвилин
Flight::route('/news', function () {
Flight::response()->cache(time() + 300);
echo 'Цей контент буде кешовано.';
});
// Альтернативно, ви можете використовувати рядок, який передали б
// методу strtotime()
Flight::route('/news', function () {
Flight::response()->cache('+5 minutes');
echo 'Цей контент буде кешовано.';
});
Останнє змінено
Ви можете використовувати метод lastModified
і передати UNIX-мітку часу, щоб встановити дату
і час, коли сторінка востаннє була змінена. Клієнт продовжуватиме використовувати свій кеш, поки
значення останнього змінення не зміниться.
Flight::route('/news', function () {
Flight::lastModified(1234567890);
echo 'Цей контент буде кешовано.';
});
ETag
Кешування ETag
подібне до Last-Modified
, за винятком того, що ви можете вказати будь-який ідентифікатор, який
ви хочете для ресурсу:
Flight::route('/news', function () {
Flight::etag('my-unique-id');
echo 'Цей контент буде кешовано.';
});
Пам'ятайте, що виклик або lastModified
, або etag
і обидва встановлять і перевірять
значення кешу. Якщо значення кешу однакове між запитами, Flight негайно
надішле відповідь HTTP 304
і зупинить обробку.
Завантаження файлу (v3.12.0)
Існує допоміжний метод для завантаження файлу. Ви можете використовувати метод download
і передати шлях.
Flight::route('/download', function () {
Flight::download('/path/to/file.txt');
});