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:

  1. name: Der Name des abzurufenden Parameters (wenn leer, können alle Parameter als Array abgerufen werden)
  2. 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 Format multipart/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 von max_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 GETPOSTPUTDELETEOPTIONSHEAD 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() und fullUrl() 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-forx-real-ipclient-ipx-client-ipvia 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, überschreibt setGet() alle GET-Parameter. setPost() und setHeader() 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