Hinweis
Anfordern des Anfrageobjekts
Webman injiziert das Anfrageobjekt automatisch als erstes Argument in die Aktionsmethode, zum Beispiel
Beispiel
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$default_name = 'webman';
// Erhalten Sie den Parameter name aus der GET-Anfrage. Wenn kein name-Parameter übergeben wird, wird $default_name zurückgegeben.
$name = $request->get('name', $default_name);
// Gibt einen String an den Browser zurück
return response('hello ' . $name);
}
}
Durch das $request
Objekt können wir alle mit der Anfrage verbundenen Daten abrufen.
Manchmal möchten wir das aktuelle $request
Objekt in anderen Klassen abrufen, in diesem Fall können wir einfach die Hilfsfunktion request()
verwenden.
Abrufen von GET-Anfrageparametern
Abrufen des gesamten GET-Arrays
$request->get();
Wenn die Anfrage keine GET-Parameter hat, wird ein leeres Array zurückgegeben.
Abrufen eines bestimmten Wertes aus dem GET-Array
$request->get('name');
Wenn dieser Wert im GET-Array nicht vorhanden ist, wird null zurückgegeben.
Sie können der GET-Methode auch einen Standardwert als zweiten Parameter übergeben. Wenn im GET-Array kein entsprechender Wert gefunden wird, wird der Standardwert zurückgegeben. Zum Beispiel:
$request->get('name', 'tom');
Abrufen von POST-Anfrageparametern
Abrufen des gesamten POST-Arrays
$request->post();
Wenn die Anfrage keine POST-Parameter hat, wird ein leeres Array zurückgegeben.
Abrufen eines bestimmten Wertes aus dem POST-Array
$request->post('name');
Wenn dieser Wert im POST-Array nicht vorhanden ist, wird null zurückgegeben.
Wie bei der GET-Methode können Sie auch der POST-Methode einen Standardwert als zweiten Parameter übergeben. Wenn im POST-Array kein entsprechender Wert gefunden wird, wird der Standardwert zurückgegeben. Zum Beispiel:
$request->post('name', 'tom');
Hilfsfunktion input()
Ähnlich wie die $request->input()
Funktion, können alle Parameter abgerufen werden, die input() Hilfsfunktion hat insgesamt zwei Parameter:
- name: Der Name des abzurufenden Parameters (wenn leer, können alle Parameter als Array abgerufen werden)
- default: Standardwert (wird verwendet, wenn mit dem ersten Parameter kein Wert abgerufen werden konnte)
Beispiel
// Parameter name abrufen
$name = input('name');
// Parameter name abrufen, wenn nicht vorhanden, Standardwert verwenden
$name = input('name','张三');
// Alle Parameter abrufen
$all_params = input();
Abrufen des ursprünglichen POST-Korpus
$post = $request->rawBody();
Diese Funktion ähnelt der file_get_contents("php://input");
Operation in php-fpm
. Sie wird verwendet, um den rohen HTTP-Anfragekörper zu erhalten. Dies ist nützlich, um POST-Anfragedaten im nicht application/x-www-form-urlencoded
Format abzurufen.
Header abrufen
Abrufen des gesamten Header-Arrays
$request->header();
Wenn die Anfrage keine Header-Parameter hat, wird ein leeres Array zurückgegeben. Beachten Sie, dass alle Schlüssel in Kleinbuchstaben sind.
Abrufen eines bestimmten Wertes aus dem Header-Array
$request->header('host');
Wenn dieser Wert im Header-Array nicht vorhanden ist, wird null zurückgegeben. Beachten Sie, dass alle Schlüssel in Kleinbuchstaben sind.
Wie bei der GET-Methode können Sie der Header-Methode auch einen Standardwert als zweiten Parameter übergeben. Wenn im Header-Array kein entsprechender Wert gefunden wird, wird der Standardwert zurückgegeben. Zum Beispiel:
$request->header('host', 'localhost');
Cookies abrufen
Abrufen des gesamten Cookie-Arrays
$request->cookie();
Wenn die Anfrage keine Cookie-Parameter hat, wird ein leeres Array zurückgegeben.
Abrufen eines bestimmten Wertes aus dem Cookie-Array
$request->cookie('name');
Wenn dieser Wert im Cookie-Array nicht vorhanden ist, wird null zurückgegeben.
Wie bei der GET-Methode können Sie der Cookie-Methode auch einen Standardwert als zweiten Parameter übergeben. Wenn im Cookie-Array kein entsprechender Wert gefunden wird, wird der Standardwert zurückgegeben. Zum Beispiel:
$request->cookie('name', 'tom');
Alle Eingaben abrufen
Enthält eine Sammlung von post
und get
.
$request->all();
Abrufen eines bestimmten Eingabewertes
Werten aus den Sammlungen von post
und get
.
$request->input('name', $default_value);
Abrufen von Teildaten
Teile der Daten aus den Sammlungen von post
und get
abrufen.
// Abrufen eines Arrays bestehend aus username und password, wenn die entsprechenden Schlüssel nicht vorhanden sind, werden sie ignoriert
$only = $request->only(['username', 'password']);
// Alle Eingaben außer avatar und age abrufen
$except = $request->except(['avatar', 'age']);
Eingaben über Controller-Parameter abrufen
<?php
namespace app\controller;
use support\Response;
class UserController
{
public function create(string $name, int $age = 18): Response
{
return json(['name' => $name, 'age' => $age]);
}
}
Die Logik des Codes ähnelt
<?php
namespace app\controller;
use support\Request;
use support\Response;
class UserController
{
public function create(Request $request): Response
{
$name = $request->input('name');
$age = (int)$request->input('age', 18);
return json(['name' => $name, 'age' => $age]);
}
}
Weitere Informationen finden Sie unter Controller-Parameterbindung
Hochgeladene Dateien abrufen
Hinweis
Zum Hochladen von Dateien muss ein Formular im Formatmultipart/form-data
verwendet werden.
Abrufen des gesamten Arrays hochgeladener Dateien
$request->file();
Das Formular könnte folgendermaßen aussehen:
<form method="post" action="http://127.0.0.1:8787/upload/files" enctype="multipart/form-data" />
<input name="file1" multiple="multiple" type="file">
<input name="file2" multiple="multiple" type="file">
<input type="submit">
</form>
Das Format von $request->file()
ähnelt:
array (
'file1' => object(webman\Http\UploadFile),
'file2' => object(webman\Http\UploadFile)
)
Es handelt sich um ein Array von Instanzen des webman\Http\UploadFile
. Die Klasse webman\Http\UploadFile
erbt von der PHP-eigenen SplFileInfo
Klasse und bietet einige nützliche Methoden.
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function files(Request $request)
{
foreach ($request->file() as $key => $spl_file) {
var_export($spl_file->isValid()); // Ist die Datei gültig, z.B. true|false
var_export($spl_file->getUploadExtension()); // Hochgeladener Dateityp, z.B. 'jpg'
var_export($spl_file->getUploadMimeType()); // MIME-Typ der hochgeladenen Datei, z.B. 'image/jpeg'
var_export($spl_file->getUploadErrorCode()); // Abrufen des Hochladefehlers, z.B. UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_CANT_WRITE
var_export($spl_file->getUploadName()); // Hochgeladener Dateiname, z.B. 'my-test.jpg'
var_export($spl_file->getSize()); // Größe der Datei abrufen, z.B. 13364, in Bytes
var_export($spl_file->getPath()); // Abrufen des Hochladeverzeichnisses, z.B. '/tmp'
var_export($spl_file->getRealPath()); // Abrufen des Pfads der temporären Datei, z.B. `/tmp/workerman.upload.SRliMu`
}
return response('ok');
}
}
Hinweis:
- Nach dem Hochladen wird die Datei als temporäre Datei benannt, z.B.
/tmp/workerman.upload.SRliMu
- Die Größe der hochgeladenen Datei wird durch defaultMaxPackageSize beschränkt, standardmäßig 10 MB. Dies kann in der Datei
config/server.php
durch Ändern vonmax_package_size
geändert werden. - Nach dem Abschluss der Anfrage wird die temporäre Datei automatisch gelöscht.
- Wenn keine Datei hochgeladen wurde, gibt
$request->file()
ein leeres Array zurück. - Hochgeladene Dateien unterstützen nicht die Methode
move_uploaded_file()
, bitte verwenden Sie stattdessen die Methode$file->move()
, siehe die folgenden Beispiele.
Abrufen einer bestimmten hochgeladenen Datei
$request->file('avatar');
Wenn die Datei vorhanden ist, wird die entsprechende Instanz von webman\Http\UploadFile
zurückgegeben, andernfalls wird null zurückgegeben.
Beispiel
<?php
namespace app\controller;
use support\Request;
class UploadController
{
public function file(Request $request)
{
$file = $request->file('avatar');
if ($file && $file->isValid()) {
$file->move(public_path().'/files/myfile.'.$file->getUploadExtension());
return json(['code' => 0, 'msg' => 'upload success']);
}
return json(['code' => 1, 'msg' => 'file not found']);
}
}
Abrufen des Hosts
Abrufen der Host-Informationen der Anfrage.
$request->host();
Wenn die angeforderte Adresse keinen Standardport (80 oder 443) hat, kann die Host-Information den Port enthalten, z.B. example.com:8080
. Wenn der Port nicht benötigt wird, kann der erste Parameter auf true
gesetzt werden.
$request->host(true);
Abrufen der Anfrage-Methode
$request->method();
Der Rückgabewert kann GET
、POST
、PUT
、DELETE
、OPTIONS
、HEAD
sein.
Abrufen der Anfrage-URI
$request->uri();
Gibt die URI der Anfrage zurück, einschließlich des path und des queryString Teils.
Abrufen des Anfrage-Pfades
$request->path();
Gibt den path Teil der Anfrage zurück.
Abrufen des Anfrage-queryString
$request->queryString();
Gibt den queryString Teil der Anfrage zurück.
Abrufen der Anfrage-URL
Die url()
Methode gibt die URL ohne Query
Parameter zurück.
$request->url();
Gibt etwas wie //www.workerman.net/workerman-chat
zurück.
Die fullUrl()
Methode gibt die URL mit Query
Parametern zurück.
$request->fullUrl();
Gibt etwas wie //www.workerman.net/workerman-chat?type=download
zurück.
Hinweis
url()
undfullUrl()
geben nicht den Protokollteil zurück (geben weder http noch https zurück).
Browser, die eine Adresse im Format//example.com
verwenden, erkennen automatisch das Protokoll der aktuellen Seite und initiieren die Anfrage automatisch mit http oder https.
Wenn Sie einen Nginx-Proxy verwenden, fügen Sie die Zeile proxy_set_header X-Forwarded-Proto $scheme;
zur Nginx-Konfiguration hinzu, siehe Nginx-Proxy,
so können Sie mit $request->header('x-forwarded-proto');
überprüfen, ob es sich um http oder https handelt. Zum Beispiel:
echo $request->header('x-forwarded-proto'); // Gibt http oder https aus
Abrufen der Anfrage-HTTP-Version
$request->protocolVersion();
Gibt den String 1.1
oder 1.0
zurück.
Abrufen der Anfrage-Session-ID
$request->sessionId();
Gibt einen String zurück, der aus Buchstaben und Zahlen besteht.
Abrufen der Client-IP der Anfrage
$request->getRemoteIp();
Abrufen des Client-Ports der Anfrage
$request->getRemotePort();
Abrufen der echten Client-IP der Anfrage
$request->getRealIp($safe_mode=true);
Wenn das Projekt einen Proxy verwendet (z.B. Nginx), ist die von $request->getRemoteIp()
zurückgegebene IP oft die IP des Proxy-Servers (ähnlich 127.0.0.1
192.168.x.x
) und nicht die echte IP des Clients. In diesem Fall können Sie versuchen, die echte IP des Clients mit $request->getRealIp()
zu erhalten.
$request->getRealIp()
versucht, die echte IP aus den HTTP-Headern x-forwarded-for
、x-real-ip
、client-ip
、x-client-ip
、via
zu ermitteln.
Aufgrund der Leichtfertigkeit, mit der HTTP-Header gefälscht werden können, ist die durch diese Methode erhaltene Client-IP nicht zu 100 % vertrauenswürdig, besonders wenn
$safe_mode
auf false ist. Eine relativ zuverlässige Methode, um die echte Client-IP über einen Proxy zu erhalten, ist es, die bekannten sicheren IPs des Proxy-Servers zu haben und genau zu wissen, welcher HTTP-Header die echte IP enthält. Wenn die IP, die von$request->getRemoteIp()
zurückgegeben wird, als bekannte sichere Proxy-Server-IP bestätigt ist, können Sie die echte IP über$request->header('HTTP_HEADER_WITH_REAL_IP')
abrufen.
Abrufen der Server-IP
$request->getLocalIp();
Abrufen des Server-Ports
$request->getLocalPort();
Überprüfen, ob es sich um eine AJAX-Anfrage handelt
$request->isAjax();
Überprüfen, ob es sich um eine PJAX-Anfrage handelt
$request->isPjax();
Überprüfen, ob JSON zurückgegeben wird
$request->expectsJson();
Überprüfen, ob der Client JSON akzeptiert
$request->acceptJson();
Abrufen des Plugin-Namens der Anfrage
Nicht-Plugin-Anfragen geben einen leeren String ''
zurück.
$request->plugin;
Abrufen des Anwendungsnamens der Anfrage
Bei einer Einzelanwendung wird immer ein leerer String ''
zurückgegeben. Bei Multianwendungen wird der Anwendungsname zurückgegeben.
$request->app;
Da anonyme Funktionen keiner Anwendung angehören, gibt die Anfrage, die von einem anonymen Routen stammte, immer einen leeren String
''
für$request->app
zurück.
Weitere Informationen zu anonymen Routen finden Sie unter Routing
Abrufen des Klassennamens des Controllers der Anfrage
Erhält den Namen der Klasse, die dem Controller entspricht.
$request->controller;
Gibt etwas zurück wie app\controller\IndexController
.
Da anonyme Funktionen keiner bestimmten Kontrolle gehören, gibt die Anfrage, die von einer anonymen Route stammt, immer einen leeren String
''
für$request->controller
zurück.
Weitere Informationen zu anonymen Routen finden Sie unter Routing
Abrufen des Methodennamens der Anfrage
Erhält den Namen der Methode des Controllers, die der Anfrage entspricht.
$request->action;
Gibt etwas zurück wie index
.
Da anonyme Funktionen keiner bestimmten Kontrolle angehören, gibt die Anfrage, die von einer anonymen Route stammt, immer einen leeren String
''
für$request->action
zurück.
Weitere Informationen zu anonymen Routen finden Sie unter Routing
Parameter Überschreiben
Manchmal möchten wir die Parameter der Anfrage überschreiben, z.B. die Anfrage filtern und dann neue Werte der Anfragezuordnung zurückgeben. In diesem Fall können wir die Methoden setGet()
, setPost()
, setHeader()
verwenden.
Überschreiben von GET-Parametern
$request->get(); // Angenommen, wir erhalten ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // Endgültig erhalten wir ['name' => 'tom']
Hinweis
Wie im Beispiel gezeigt, überschreibtsetGet()
alle GET-Parameter.setPost()
undsetHeader()
haben dasselbe Verhalten.
Überschreiben von POST-Parametern
$post = $request->post();
foreach ($post as $key => $value) {
$post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // Erhalten Sie die gefilterten POST-Parameter
Überschreiben von HEADER-Parametern
$request->setHeader(['host' => 'example.com']);
$request->header('host'); // Gibt example.com aus