Antwort
Die Antwort ist tatsächlich ein support\Response
-Objekt, und um dieses Objekt bequem zu erstellen, bietet webman einige Hilfsfunktionen.
Rückgabe einer beliebigen Antwort
Beispiel
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response('Hallo webman');
}
}
Die Implementierung der Funktion response
ist wie folgt:
function response($body = '', $status = 200, $headers = array())
{
return new Response($status, $headers, $body);
}
Sie können auch zunächst ein leeres response
-Objekt erstellen und dann an geeigneter Stelle mit $response->cookie()
, $response->header()
, $response->withHeaders()
, $response->withBody()
den Rückgabewert festlegen.
public function hello(Request $request)
{
// Objekt erstellen
$response = response();
// .... Geschäftslogik ausgelassen
// Cookie setzen
$response->cookie('foo', 'Wert');
// .... Geschäftslogik ausgelassen
// HTTP-Header setzen
$response->header('Content-Type', 'application/json');
$response->withHeaders([
'X-Header-One' => 'Wert des Headers 1',
'X-Header-Tow' => 'Wert des Headers 2',
]);
// .... Geschäftslogik ausgelassen
// Festlegen der zurückzugebenden Daten
$response->withBody('Return-Daten');
return $response;
}
Rückgabe von JSON
Beispiel
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return json(['code' => 0, 'msg' => 'ok']);
}
}
Die Implementierung der Funktion json
lautet wie folgt:
function json($data, $options = JSON_UNESCAPED_UNICODE)
{
return new Response(200, ['Content-Type' => 'application/json'], json_encode($data, $options));
}
Rückgabe von XML
Beispiel
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
$xml = <<<XML
<?xml version='1.0' standalone='yes'?>
<values>
<truevalue>1</truevalue>
<falsevalue>0</falsevalue>
</values>
XML;
return xml($xml);
}
}
Die Implementierung der Funktion xml
lautet wie folgt:
function xml($xml)
{
if ($xml instanceof SimpleXMLElement) {
$xml = $xml->asXML();
}
return new Response(200, ['Content-Type' => 'text/xml'], $xml);
}
Rückgabe von Ansichten
Erstellen Sie eine neue Datei app/controller/FooController.php
wie folgt:
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return view('foo/hello', ['name' => 'webman']);
}
}
Erstellen Sie eine neue Datei app/view/foo/hello.html
wie folgt:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>
Weiterleitung
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return redirect('/user');
}
}
Die Implementierung der Funktion redirect
lautet wie folgt:
function redirect($location, $status = 302, $headers = [])
{
$response = new Response($status, ['Location' => $location]);
if (!empty($headers)) {
$response->withHeaders($headers);
}
return $response;
}
Header setzen
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response('Hallo webman', 200, [
'Content-Type' => 'application/json',
'X-Header-One' => 'Header-Wert'
]);
}
}
Sie können auch die Methoden header
und withHeaders
verwenden, um einzelne oder mehrere Header zu setzen.
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response('Hallo webman')
->header('Content-Type', 'application/json')
->withHeaders([
'X-Header-One' => 'Header Wert 1',
'X-Header-Tow' => 'Header Wert 2',
]);
}
}
Sie können auch Header im Voraus festlegen und zuletzt die zurückzugebenden Daten festlegen.
public function hello(Request $request)
{
// Objekt erstellen
$response = response();
// .... Geschäftslogik ausgelassen
// HTTP-Header setzen
$response->header('Content-Type', 'application/json');
$response->withHeaders([
'X-Header-One' => 'Header Wert 1',
'X-Header-Tow' => 'Header Wert 2',
]);
// .... Geschäftslogik ausgelassen
// Festlegen der zurückzugebenden Daten
$response->withBody('Return-Daten');
return $response;
}
Cookie setzten
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response('Hallo webman')
->cookie('foo', 'Wert');
}
}
Sie können auch Cookies im Voraus setzen und zuletzt die zurückzugebenden Daten festlegen.
public function hello(Request $request)
{
// Objekt erstellen
$response = response();
// .... Geschäftslogik ausgelassen
// Cookie setzen
$response->cookie('foo', 'Wert');
// .... Geschäftslogik ausgelassen
// Festlegen der zurückzugebenden Daten
$response->withBody('Return-Daten');
return $response;
}
Die kompletten Parameter der Methode cookie
sind wie folgt:
cookie($name, $value = '', $max_age = 0, $path = '', $domain = '', $secure = false, $http_only = false)
Rückgabe von Datei-Streaming
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response()->file(public_path() . '/favicon.ico');
}
}
- webman unterstützt den Versand von sehr großen Dateien
- Für große Dateien (über 2 MByte) liest webman die gesamte Datei nicht in den Speicher, sondern liest die Datei in geeigneten Intervallen und sendet sie
- Webman optimiert die Lese- und Sendegeschwindigkeit der Datei je nach der Geschwindigkeit, mit der der Client Daten empfängt, um sicherzustellen, dass die Datei so schnell wie möglich gesendet wird und dabei der Speicherverbrauch minimiert wird
- Die Datenübertragung ist nicht blockierend und beeinträchtigt nicht die Verarbeitung anderer Anfragen
- Die Methode
file
fügt automatisch denif-modified-since
-Header hinzu und überprüft diesen Header bei der nächsten Anfrage. Wenn die Datei unverändert ist, wird direkt ein 304-Statuscode zurückgegeben, um Bandbreite zu sparen - Die zu sendende Datei wird automatisch mit dem richtigen
Content-Type
-Header an den Browser gesendet - Wenn die Datei nicht existiert, wird automatisch eine 404-Antwort erstellt
Datei herunterladen
<?php
namespace app\controller;
use support\Request;
class FooController
{
public function hello(Request $request)
{
return response()->download(public_path() . '/favicon.ico', 'Dateiname.ico');
}
}
Die Methode download
ist im Wesentlichen identisch mit der Methode file
, der Unterschied besteht darin, dass
- nach dem Setzen des herunterladbaren Dateinamens die Datei heruntergeladen wird und nicht im Browser angezeigt wird
- die Methode
download
überprüft denif-modified-since
-Header nichtOutput abrufen
Einige Bibliotheken geben den Dateiinhalt direkt auf die Standardausgabe aus, was bedeutet, dass die Daten in der Befehlszeilenoberfläche gedruckt werden und nicht an den Browser gesendet werden. In solchen Fällen müssen wir die Daten in eine Variable erfassen und dann an den Browser senden, indem wir
ob_start();
undob_get_clean();
verwenden, zum Beispiel:
<?php
namespace app\controller;
use support\Request;
class ImageController
{
public function get(Request $request)
{
// Bild erstellen
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'Ein einfacher Textstring', $text_color);
// Output abrufen
ob_start();
// Bild ausgeben
imagejpeg($im);
// Bildinhalt abrufen
$image = ob_get_clean();
// Bild senden
return response($image)->header('Content-Type', 'image/jpeg');
}
}