Atbildes
Flight palīdz ģenerēt daļu no atbildes galvenes jums, bet jūs kontrolējat lielāko daļu no tā, ko sūtāt atpakaļ lietotājam. Dažreiz jūs varat tieši piekļūt Response
objektam, bet lielākoties jūs izmantosiet Flight
instanci, lai nosūtītu atbildi.
Sūtīšana pamata atbildes
Flight izmanto ob_start(), lai buferizētu izvadi. Tas nozīmē, ka jūs varat izmantot echo
vai print
, lai nosūtītu atbildi lietotājam, un Flight to uztvers un nosūtīs atpakaļ lietotājam ar atbilstošajām galvenēm.
// Šis nosūtīs "Hello, World!" uz lietotāja pārlūku
Flight::route('/', function() {
echo "Hello, World!";
});
// HTTP/1.1 200 OK
// Content-Type: text/html
//
// Hello, World!
Kā alternatīvu, jūs varat izsaukt write()
metodi, lai pievienotu ķermenim.
// Šis nosūtīs "Hello, World!" uz lietotāja pārlūku
Flight::route('/', function() {
// verbāli, bet dažreiz tas ir nepieciešams
Flight::response()->write("Hello, World!");
// ja jūs vēlaties izgūt ķermeni, ko esat iestatījis šajā brīdī
// jūs varat to darīt šādi
$body = Flight::response()->getBody();
});
Statusa kodi
Jūs varat iestatīt atbildes statusa kodu, izmantojot status
metodi:
Flight::route('/@id', function($id) {
if($id == 123) {
Flight::response()->status(200);
echo "Hello, World!";
} else {
Flight::response()->status(403);
echo "Forbidden";
}
});
Ja jūs vēlaties iegūt pašreizējo statusa kodu, jūs varat izmantot status
metodi bez argumentiem:
Flight::response()->status(); // 200
Iestatīšana atbildes ķermenim
Jūs varat iestatīt atbildes ķermeni, izmantojot write
metodi, tomēr, ja jūs echo vai print kaut ko,
tas tiks uztverts un nosūtīts kā atbildes ķermenis caur izvades buferizēšanu.
Flight::route('/', function() {
Flight::response()->write("Hello, World!");
});
// tas pats kā
Flight::route('/', function() {
echo "Hello, World!";
});
Notīrīšana atbildes ķermenim
Ja jūs vēlaties notīrīt atbildes ķermeni, jūs varat izmantot clearBody
metodi:
Flight::route('/', function() {
if($someCondition) {
Flight::response()->write("Hello, World!");
} else {
Flight::response()->clearBody();
}
});
Palaidiet atpakaļzvanu uz atbildes ķermeni
Jūs varat palaist atpakaļzvanu uz atbildes ķermeni, izmantojot addResponseBodyCallback
metodi:
Flight::route('/users', function() {
$db = Flight::db();
$users = $db->fetchAll("SELECT * FROM users");
Flight::render('users_table', ['users' => $users]);
});
// Šis saspiest visus atbildes visiem maršrutiem ar gzip
Flight::response()->addResponseBodyCallback(function($body) {
return gzencode($body, 9);
});
Jūs varat pievienot vairākas atpakaļzvani un tās tiks palaistas secībā, kādā tās tika pievienotas. Tā kā tas var pieņemt jebkuru aicināmu, tas var pieņemt klases masīvu [ $class, 'method' ]
, aizvērumu $strReplace = function($body) { str_replace('hi', 'there', $body); };
, vai funkcijas nosaukumu 'minify'
, ja jums ir funkcija, lai minimizētu jūsu html kodu, piemēram.
Piezīme: Maršrutu atpakaļzvani nedarbosies, ja jūs izmantojat flight.v2.output_buffering
konfigurācijas opciju.
Specifisks maršruta atpakaļzvans
Ja jūs vēlaties, lai tas attiektos tikai uz specifisku maršrutu, jūs varētu pievienot atpakaļzvanu pašā maršrutā:
Flight::route('/users', function() {
$db = Flight::db();
$users = $db->fetchAll("SELECT * FROM users");
Flight::render('users_table', ['users' => $users]);
// Šis saspiest tikai šo maršrutu ar gzip
Flight::response()->addResponseBodyCallback(function($body) {
return gzencode($body, 9);
});
});
Starpprogrammatūras opcija
Jūs varat arī izmantot starpprogrammatūru, lai piemērotu atpakaļzvanu visiem maršrutiem caur starpprogrammatūru:
// MinifyMiddleware.php
class MinifyMiddleware {
public function before() {
// Piemērojiet atpakaļzvanu šeit uz response() objektu.
Flight::response()->addResponseBodyCallback(function($body) {
return $this->minify($body);
});
}
protected function minify(string $body): string {
// kāds veids, kā minimizēt ķermeni
return $body;
}
}
// index.php
Flight::group('/users', function() {
Flight::route('', function() { /* ... */ });
Flight::route('/@id', function($id) { /* ... */ });
}, [ new MinifyMiddleware() ]);
Iestatīšana atbildes galvenei
Jūs varat iestatīt galveni, piemēram, satura tipu atbildei, izmantojot header
metodi:
// Šis nosūtīs "Hello, World!" uz lietotāja pārlūku kā vienkāršu tekstu
Flight::route('/', function() {
Flight::response()->header('Content-Type', 'text/plain');
// vai
Flight::response()->setHeader('Content-Type', 'text/plain');
echo "Hello, World!";
});
JSON
Flight nodrošina atbalstu JSON un JSONP atbildēm. Lai nosūtītu JSON atbildi, jūs nododiet datus, kas jākodē JSON:
Flight::json(['id' => 123]);
Piezīme: Pēc noklusējuma, Flight nosūtīs
Content-Type: application/json
galveni ar atbildi. Tas arī izmantos konstantesJSON_THROW_ON_ERROR
unJSON_UNESCAPED_SLASHES
, kodējot JSON.
JSON ar statusa kodu
Jūs varat arī nodot statusa kodu kā otro argumentu:
Flight::json(['id' => 123], 201);
JSON ar skaistu izdruku
Jūs varat arī nodot argumentu pēdējā pozīcijā, lai iespējotu skaistu izdruku:
Flight::json(['id' => 123], 200, true, 'utf-8', JSON_PRETTY_PRINT);
Ja jūs maināt opcijas, kas nodotas uz Flight::json()
un vēlaties vienkāršāku sintaksi, jūs varat
pārkartēt JSON metodi:
Flight::map('json', function($data, $code = 200, $options = 0) {
Flight::_json($data, $code, true, 'utf-8', $options);
}
// Un tagad to var izmantot šādi
Flight::json(['id' => 123], 200, JSON_PRETTY_PRINT);
JSON un izpildes pārtraukšana (v3.10.0)
Ja jūs vēlaties nosūtīt JSON atbildi un pārtraukt izpildi, jūs varat izmantot jsonHalt()
metodi.
Tas ir noderīgi gadījumos, kur jūs pārbaudāt, piemēram, autorizāciju un, ja lietotājs nav autorizēts, jūs varat nosūtīt JSON atbildi nekavējoties, notīrīt esošo ķermeņa saturu un pārtraukt izpildi.
Flight::route('/users', function() {
$authorized = someAuthorizationCheck();
// Pārbaudiet, vai lietotājs ir autorizēts
if($authorized === false) {
Flight::jsonHalt(['error' => 'Unauthorized'], 401);
}
// Turpiniet ar pārējo maršrutu
});
Pirms v3.10.0, jums būtu jādara kaut kas tāds:
Flight::route('/users', function() {
$authorized = someAuthorizationCheck();
// Pārbaudiet, vai lietotājs ir autorizēts
if($authorized === false) {
Flight::halt(401, json_encode(['error' => 'Unauthorized']));
}
// Turpiniet ar pārējo maršrutu
});
JSONP
For JSONP pieprasījumiem jūs, varat izvēles kārtā nodot vaicājuma parametra nosaukumu, ko jūs izmantojat, lai definētu savu atpakaļzvanu funkciju:
Flight::jsonp(['id' => 123], 'q');
Tātad, veicot GET pieprasījumu, izmantojot ?q=my_func
, jums vajadzētu saņemt izvadi:
my_func({"id":123});
Ja jūs neesat nodevis vaicājuma parametra nosaukumu, tas pēc noklusējuma būs jsonp
.
Pārvirzīšana uz citu URL
Jūs varat pārvirzīt pašreizējo pieprasījumu, izmantojot redirect()
metodi un nododot
jaunu URL:
Flight::redirect('/new/location');
Pēc noklusējuma Flight nosūta HTTP 303 ("See Other") statusa kodu. Jūs varat izvēles kārtā iestatīt pielāgotu kodu:
Flight::redirect('/new/location', 401);
Apturēšana
Jūs varat apturēt sistēmu jebkurā brīdī, izsaucot halt
metodi:
Flight::halt();
Jūs varat arī norādīt izvēles HTTP
statusa kodu un ziņojumu:
Flight::halt(200, 'Be right back...');
Izsaucot halt
tiks atbrīvots jebkurš atbildes saturs līdz šim punktam. Ja jūs vēlaties apturēt
sistēmu un izvadīt pašreizējo atbildi, izmantojiet stop
metodi:
Flight::stop($httpStatusCode = null);
Piezīme:
Flight::stop()
ir dažas dīvainas uzvedības, piemēram, tas izvadīs atbildi, bet turpinās izpildīt jūsu skriptu. Jūs varat izmantotexit
vaireturn
pēc izsaukumaFlight::stop()
, lai novērstu turpmāku izpildi, bet parasti ieteicams izmantotFlight::halt()
.
Notīrīšana atbildes datiem
Jūs varat notīrīt atbildes ķermeni un galvenes, izmantojot clear()
metodi. Tas notīrīs
jebkuras galvenes, kas piešķirtas atbildei, notīrīs atbildes ķermeni un iestatīs statusa kodu uz 200
.
Flight::response()->clear();
Notīrīšana tikai atbildes ķermenim
Ja jūs vēlaties notīrīt tikai atbildes ķermeni, jūs varat izmantot clearBody()
metodi:
// Šis joprojām saglabās jebkuras galvenes, kas iestatītas uz response() objektu.
Flight::response()->clearBody();
HTTP kešošana
Flight nodrošina iebūvētu atbalstu HTTP līmeņa kešošanai. Ja kešošanas nosacījums
ir izpildīts, Flight atgriezīs HTTP 304 Not Modified
atbildi. Nākamreiz, kad klients
pieprasa to pašu resursu, viņš tiks aicināts izmantot savu lokāli kešoto versiju.
Maršruta līmeņa kešošana
Ja jūs vēlaties kešot visu atbildi, jūs varat izmantot cache()
metodi un nodot laiku, kurā kešot.
// Šis kešos atbildi 5 minūtes
Flight::route('/news', function () {
Flight::response()->cache(time() + 300);
echo 'This content will be cached.';
});
// Alternatīvi, jūs varat izmantot virkni, ko jūs nodotu
// uz strtotime() metodi
Flight::route('/news', function () {
Flight::response()->cache('+5 minutes');
echo 'This content will be cached.';
});
Last-Modified
Jūs varat izmantot lastModified
metodi un nodot UNIX laika zīmogu, lai iestatītu datumu
un laiku, kad lapa tika pēdējo reizi modificēta. Klients turpinās izmantot savu kešu līdz
kamēr last modified vērtība ir mainījusies.
Flight::route('/news', function () {
Flight::lastModified(1234567890);
echo 'This content will be cached.';
});
ETag
ETag
kešošana ir līdzīga Last-Modified
, izņemot to, ka jūs varat norādīt jebkuru id, ko
vēlaties resursam:
Flight::route('/news', function () {
Flight::etag('my-unique-id');
echo 'This content will be cached.';
});
Ņemiet vērā, ka izsaucot vai lastModified
vai etag
iestādīs un pārbaudīs
kešošanas vērtību. Ja kešošanas vērtība ir tā pati starp pieprasījumiem, Flight nekavējoties
nosūtīs HTTP 304
atbildi un pārtrauks apstrādi.
Lejupielāde faila (v3.12.0)
Ir palīgmetode, lai lejupielādētu failu. Jūs varat izmantot download
metodi un nodot ceļu.
Flight::route('/download', function () {
Flight::download('/path/to/file.txt');
});