Antworten
Flight hilft Ihnen, einen Teil der Antwort-Header zu generieren, aber Sie haben die meiste Kontrolle darüber, was Sie an den Benutzer zurücksenden. Manchmal können Sie das Response
-Objekt direkt aufrufen, aber meistens verwenden Sie die Flight
-Instanz, um eine Antwort zu senden.
Senden einer einfachen Antwort
Flight verwendet ob_start(), um die Ausgabe zu puffern. Das bedeutet, dass Sie echo
oder print
verwenden können, um eine Antwort an den Benutzer zu senden, und Flight wird sie erfassen und mit den entsprechenden Headern zurücksenden.
// Dies wird "Hallo, Welt!" an den Browser des Benutzers senden
Flight::route('/', function() {
echo "Hallo, Welt!";
});
// HTTP/1.1 200 OK
// Content-Type: text/html
//
// Hallo, Welt!
Alternativ können Sie die Methode write()
aufrufen, um den Body zu ergänzen.
// Dies wird "Hallo, Welt!" an den Browser des Benutzers senden
Flight::route('/', function() {
// ausführlich, aber manchmal notwendig, wenn Sie es brauchen
Flight::response()->write("Hallo, Welt!");
// wenn Sie den Body abrufen möchten, den Sie an diesem Punkt festgelegt haben
// können Sie dies so tun
$body = Flight::response()->getBody();
});
Statuscodes
Sie können den Statuscode der Antwort festlegen, indem Sie die Methode status
verwenden:
Flight::route('/@id', function($id) {
if($id == 123) {
Flight::response()->status(200);
echo "Hallo, Welt!";
} else {
Flight::response()->status(403);
echo "Verboten";
}
});
Wenn Sie den aktuellen Statuscode abrufen möchten, können Sie die Methode status
ohne Argumente verwenden:
Flight::response()->status(); // 200
Festlegen eines Antwort-Body
Sie können den Antwort-Body mit der Methode write
festlegen. Wenn Sie jedoch etwas ausgeben (echo oder print),
wird es erfasst und als Antwort-Body über die Ausgabe-Pufferung gesendet.
Flight::route('/', function() {
Flight::response()->write("Hallo, Welt!");
});
// gleichwertig mit
Flight::route('/', function() {
echo "Hallo, Welt!";
});
Löschen eines Antwort-Bodys
Wenn Sie den Antwort-Body löschen möchten, können Sie die Methode clearBody
verwenden:
Flight::route('/', function() {
if($someCondition) {
Flight::response()->write("Hallo, Welt!");
} else {
Flight::response()->clearBody();
}
});
Ausführen eines Callbacks auf dem Antwort-Body
Sie können einen Callback auf dem Antwort-Body mit der Methode addResponseBodyCallback
ausführen:
Flight::route('/users', function() {
$db = Flight::db();
$users = $db->fetchAll("SELECT * FROM users");
Flight::render('users_table', ['users' => $users]);
});
// Dies wird alle Antworten für jede Route gzippen
Flight::response()->addResponseBodyCallback(function($body) {
return gzencode($body, 9);
});
Sie können mehrere Callbacks hinzufügen, und sie werden in der Reihenfolge ausgeführt, in der sie hinzugefügt wurden. Da dies jede aufrufbare Funktion akzeptieren kann, kann es ein Klassenarray [ $class, 'method' ]
, eine Closure $strReplace = function($body) { str_replace('hi', 'there', $body); };
oder einen Funktionsnamen 'minify'
akzeptieren, wenn Sie beispielsweise eine Funktion hätten, um Ihren HTML-Code zu minimieren.
Hinweis: Route-Callbacks funktionieren nicht, wenn Sie die Konfigurationsoption flight.v2.output_buffering
verwenden.
Spezifischer Routen-Callback
Wenn Sie möchten, dass dies nur für eine bestimmte Route gilt, können Sie den Callback in der Route selbst hinzufügen:
Flight::route('/users', function() {
$db = Flight::db();
$users = $db->fetchAll("SELECT * FROM users");
Flight::render('users_table', ['users' => $users]);
// Dies wird nur die Antwort für diese Route gzippen
Flight::response()->addResponseBodyCallback(function($body) {
return gzencode($body, 9);
});
});
Middleware-Option
Sie können auch Middleware verwenden, um den Callback auf alle Routen anzuwenden:
// MinifyMiddleware.php
class MinifyMiddleware {
public function before() {
// Wenden Sie den Callback hier auf das response() Objekt an.
Flight::response()->addResponseBodyCallback(function($body) {
return $this->minify($body);
});
}
protected function minify(string $body): string {
// Minimieren Sie den Body auf irgendeine Weise
return $body;
}
}
// index.php
Flight::group('/users', function() {
Flight::route('', function() { /* ... */ });
Flight::route('/@id', function($id) { /* ... */ });
}, [ new MinifyMiddleware() ]);
Festlegen eines Antwort-Headers
Sie können einen Header wie den Inhaltstyp der Antwort festlegen, indem Sie die Methode header
verwenden:
// Dies wird "Hallo, Welt!" im Klartext an den Browser des Benutzers senden
Flight::route('/', function() {
Flight::response()->header('Content-Type', 'text/plain');
// oder
Flight::response()->setHeader('Content-Type', 'text/plain');
echo "Hallo, Welt!";
});
JSON
Flight bietet Unterstützung für das Senden von JSON- und JSONP-Antworten. Um eine JSON-Antwort zu senden, geben Sie einige Daten an, die JSON-codiert werden sollen:
Flight::json(['id' => 123]);
Hinweis: Standardmäßig sendet Flight einen
Content-Type: application/json
Header mit der Antwort. Er wird auch die KonstantenJSON_THROW_ON_ERROR
undJSON_UNESCAPED_SLASHES
beim Codieren des JSON verwenden.
JSON mit Statuscode
Sie können auch einen Statuscode als zweiten Parameter übergeben:
Flight::json(['id' => 123], 201);
JSON mit schöner Ausgabe
Sie können auch ein Argument in der letzten Position übergeben, um eine schöne Ausgabe zu aktivieren:
Flight::json(['id' => 123], 200, true, 'utf-8', JSON_PRETTY_PRINT);
Wenn Sie die Optionen, die Sie an Flight::json()
übergeben, ändern und eine einfachere Syntax wünschen, können Sie die JSON-Methode einfach umbenennen:
Flight::map('json', function($data, $code = 200, $options = 0) {
Flight::_json($data, $code, true, 'utf-8', $options);
}
// Und jetzt kann es so verwendet werden
Flight::json(['id' => 123], 200, JSON_PRETTY_PRINT);
JSON und Ausführung anhalten (v3.10.0)
Wenn Sie eine JSON-Antwort senden und die Ausführung anhalten möchten, können Sie die Methode jsonHalt
verwenden.
Dies ist nützlich für Fälle, in denen Sie möglicherweise eine Art von Autorisierung überprüfen und wenn
der Benutzer nicht autorisiert ist, können Sie sofort eine JSON-Antwort senden, den vorhandenen Body-Inhalt löschen und die Ausführung anhalten.
Flight::route('/users', function() {
$authorized = someAuthorizationCheck();
// Überprüfen, ob der Benutzer autorisiert ist
if($authorized === false) {
Flight::jsonHalt(['error' => 'Nicht autorisiert'], 401);
}
// Fahren Sie mit dem Rest der Route fort
});
Vor v3.10.0 müssten Sie etwas in dieser Art tun:
Flight::route('/users', function() {
$authorized = someAuthorizationCheck();
// Überprüfen, ob der Benutzer autorisiert ist
if($authorized === false) {
Flight::halt(401, json_encode(['error' => 'Nicht autorisiert']));
}
// Fahren Sie mit dem Rest der Route fort
});
JSONP
Für JSONP-Anfragen können Sie optional den Abfrageparameternamen übergeben, den Sie verwenden, um Ihre Callback-Funktion zu definieren:
Flight::jsonp(['id' => 123], 'q');
Wenn Sie also eine GET-Anfrage mit ?q=my_func
durchführen, sollten Sie die Ausgabe erhalten:
my_func({"id":123});
Wenn Sie keinen Abfrageparameternamen übergeben, wird standardmäßig jsonp
verwendet.
Weiterleitung zu einer anderen URL
Sie können die aktuelle Anfrage umleiten, indem Sie die Methode redirect()
verwenden und
eine neue URL übergeben:
Flight::redirect('/new/location');
Standardmäßig sendet Flight einen HTTP 303 ("See Other") Statuscode. Sie können optional einen maßgeschneiderten Code festlegen:
Flight::redirect('/new/location', 401);
Stopp
Sie können das Framework jederzeit stoppen, indem Sie die Methode halt
aufrufen:
Flight::halt();
Sie können auch einen optionalen HTTP
-Statuscode und eine Nachricht angeben:
Flight::halt(200, 'Gleich zurück...');
Wenn Sie halt
aufrufen, werden alle Antwortinhalte bis zu diesem Punkt verworfen. Wenn Sie das Framework stoppen und die aktuelle Antwort ausgeben möchten, verwenden Sie die Methode stop
:
Flight::stop();
Antworten-Daten löschen
Sie können den Antwort-Body und die Header löschen, indem Sie die Methode clear()
verwenden. Dies wird alle Header, die der Antwort zugeordnet sind, löschen, den Antwort-Body löschen und den Statuscode auf 200
setzen.
Flight::response()->clear();
Nur den Antwort-Body löschen
Wenn Sie nur den Antwort-Body löschen möchten, können Sie die Methode clearBody()
verwenden:
// Dies wird weiterhin alle Header beibehalten, die im response() Objekt festgelegt sind.
Flight::response()->clearBody();
HTTP-Caching
Flight bietet integrierte Unterstützung für HTTP-Level-Caching. Wenn die Cache-Bedingung erfüllt ist, gibt Flight eine HTTP 304 Not Modified
Antwort zurück. Beim nächsten Mal, wenn der Client dieselbe Ressource anfordert, wird er aufgefordert, seine lokal zwischengespeicherte Version zu verwenden.
Routing-Level-Caching
Wenn Sie Ihre gesamte Antwort zwischenspeichern möchten, können Sie die Methode cache()
verwenden und die Cache-Zeit übergeben.
// Dies wird die Antwort für 5 Minuten zwischenspeichern
Flight::route('/news', function () {
Flight::response()->cache(time() + 300);
echo 'Dieser Inhalt wird zwischengespeichert.';
});
// Alternativ können Sie einen String verwenden, den Sie
// an die Methode strtotime() übergeben würden
Flight::route('/news', function () {
Flight::response()->cache('+5 Minuten');
echo 'Dieser Inhalt wird zwischengespeichert.';
});
Last-Modified
Sie können die Methode lastModified
verwenden und einen UNIX-Zeitstempel übergeben, um das Datum und die Uhrzeit festzulegen, an dem eine Seite zuletzt geändert wurde. Der Client wird weiterhin seinen Cache verwenden, bis der Wert der letzten Änderung geändert wird.
Flight::route('/news', function () {
Flight::lastModified(1234567890);
echo 'Dieser Inhalt wird zwischengespeichert.';
});
ETag
Caching mit ETag
ähnelt Last-Modified
, mit dem Unterschied, dass Sie jede ID angeben können, die Sie für die Ressource möchten:
Flight::route('/news', function () {
Flight::etag('my-unique-id');
echo 'Dieser Inhalt wird zwischengespeichert.';
});
Beachten Sie, dass das Aufrufen von lastModified
oder etag
den Cache-Wert sowohl festlegt als auch überprüft. Wenn der Cache-Wert bei den Anfragen gleich ist, sendet Flight sofort eine HTTP 304
Antwort und stoppt die Verarbeitung.
Eine Datei herunterladen (v3.12.0)
Es gibt eine Hilfsmethode, um eine Datei herunterzuladen. Sie können die Methode download
verwenden und den Pfad übergeben.
Flight::route('/download', function () {
Flight::download('/path/to/file.txt');
});