Description
Obtenir l'objet de requête
Webman injecte automatiquement l'objet de requête dans le premier paramètre de la méthode d'action, par exemple
Exemple
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$default_name = 'webman';
// Obtenir le paramètre name depuis la requête GET, s'il n'est pas fourni, retourner $default_name
$name = $request->get('name', $default_name);
// Retourner une chaîne au navigateur
return response('hello ' . $name);
}
}
Avec l'objet $request
, nous pouvons obtenir toutes les données liées à la requête.
Parfois, nous voulons obtenir l'objet $request
de la requête actuelle dans d'autres classes. Dans ce cas, il suffit d'utiliser la fonction d'assistance request()
;
Obtenir les paramètres de requête GET
Obtenir l'ensemble du tableau GET
$request->get();
Si la requête ne contient pas de paramètres GET, cela retourne un tableau vide.
Obtenir une valeur dans le tableau GET
$request->get('name');
Si cette valeur n'est pas dans le tableau GET, cela retourne null.
Vous pouvez également passer une valeur par défaut en tant que deuxième paramètre à la méthode get, si la valeur correspondante n'est pas trouvée dans le tableau GET, cela retourne la valeur par défaut. Par exemple :
$request->get('name', 'tom');
Obtenir les paramètres de requête POST
Obtenir l'ensemble du tableau POST
$request->post();
Si la requête ne contient pas de paramètres POST, cela retourne un tableau vide.
Obtenir une valeur dans le tableau POST
$request->post('name');
Si cette valeur n'est pas dans le tableau POST, cela retourne null.
Comme avec la méthode GET, vous pouvez également passer une valeur par défaut en tant que deuxième paramètre à la méthode post, si la valeur correspondante n'est pas trouvée dans le tableau POST, cela retourne la valeur par défaut. Par exemple :
$request->post('name', 'tom');
Fonction d'assistance input()
Semblable à la fonction $request->input()
, peut obtenir tous les paramètres, la fonction d'assistance input() a deux paramètres :
- name : Le nom du paramètre à obtenir (s'il est vide, cela peut obtenir un tableau de tous les paramètres)
- default : Valeur par défaut (utilisée si l'obtention par le premier paramètre échoue)
Par exemple
// Obtenir le paramètre name
$name = input('name');
// Obtenir le paramètre name, s'il n'existe pas, utilise la valeur par défaut
$name = input('name','张三');
// Obtenir tous les paramètres
$all_params = input();
Obtenir le corps brut de la requête POST
$post = $request->rawBody();
Cette fonctionnalité est similaire à l'opération file_get_contents("php://input");
dans php-fpm
. Elle est utilisée pour obtenir le corps brut de la requête HTTP. Cela est utile lors de l'obtention de données de requête POST dans un format autre que application/x-www-form-urlencoded
.
Obtenir les en-têtes
Obtenir l'ensemble du tableau des en-têtes
$request->header();
Si la requête ne contient pas de paramètres d'en-tête, cela retourne un tableau vide. Notez que toutes les clés sont en minuscules.
Obtenir une valeur dans le tableau des en-têtes
$request->header('host');
Si cette valeur n'est pas dans le tableau des en-têtes, cela retourne null. Notez que toutes les clés sont en minuscules.
Comme avec la méthode GET, vous pouvez également passer une valeur par défaut en tant que deuxième paramètre à la méthode header, si la valeur correspondante n'est pas trouvée dans le tableau des en-têtes, cela retourne la valeur par défaut. Par exemple :
$request->header('host', 'localhost');
Obtenir les cookies
Obtenir l'ensemble du tableau des cookies
$request->cookie();
Si la requête ne contient pas de paramètres de cookie, cela retourne un tableau vide.
Obtenir une valeur dans le tableau des cookies
$request->cookie('name');
Si cette valeur n'est pas dans le tableau des cookies, cela retourne null.
Comme avec la méthode GET, vous pouvez également passer une valeur par défaut en tant que deuxième paramètre à la méthode cookie, si la valeur correspondante n'est pas trouvée dans le tableau des cookies, cela retourne la valeur par défaut. Par exemple :
$request->cookie('name', 'tom');
Obtenir toutes les entrées
Cela inclut un ensemble de post
et de get
.
$request->all();
Obtenir une valeur d'entrée spécifiée
Pour obtenir une valeur d'un ensemble de post
et de get
.
$request->input('name', $default_value);
Obtenir certaines données d'entrée
Pour obtenir certaines données dans l'ensemble de post
et get
.
// Obtenir un tableau composé de username et password, ignorer si la clé correspondante n'existe pas
$only = $request->only(['username', 'password']);
// Obtenir toutes les entrées sauf avatar et age
$except = $request->except(['avatar', 'age']);
Obtenir des entrées via des paramètres de contrôleur
<?php
namespace app\controller;
use support\Response;
class UserController
{
public function create(string $name, int $age = 18): Response
{
return json(['name' => $name, 'age' => $age]);
}
}
La logique est similaire à
<?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]);
}
}
Pour plus d'informations, veuillez consulter lien de liaison des paramètres de contrôleur
Obtenir des fichiers téléchargés
Avertissement
Les fichiers téléchargés doivent utiliser un formulaire au formatmultipart/form-data
.
Obtenir l'ensemble du tableau de fichiers téléchargés
$request->file();
Le formulaire ressemble à ceci :
<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>
Le format retourné par $request->file()
ressemble à ceci :
array (
'file1' => object(webman\Http\UploadFile),
'file2' => object(webman\Http\UploadFile)
)
C'est un tableau d'instances de webman\Http\UploadFile
. La classe webman\Http\UploadFile
hérite de la classe PHP intégrée SplFileInfo
et fournit plusieurs méthodes utiles.
<?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()); // Le fichier est-il valide, par exemple true|false
var_export($spl_file->getUploadExtension()); // Extension du fichier téléchargé, par exemple 'jpg'
var_export($spl_file->getUploadMimeType()); // Type mime du fichier téléchargé, par exemple 'image/jpeg'
var_export($spl_file->getUploadErrorCode()); // Obtenir le code d'erreur de téléchargement, par exemple UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
var_export($spl_file->getUploadName()); // Nom du fichier téléchargé, par exemple 'my-test.jpg'
var_export($spl_file->getSize()); // Obtenir la taille du fichier, par exemple 13364, en octets
var_export($spl_file->getPath()); // Obtenir le répertoire de téléchargement, par exemple '/tmp'
var_export($spl_file->getRealPath()); // Obtenir le chemin du fichier temporaire, par exemple '/tmp/workerman.upload.SRliMu'
}
return response('ok');
}
}
Remarque :
- Le fichier téléchargé sera nommé un fichier temporaire, semblable à
/tmp/workerman.upload.SRliMu
. - La taille maximale des fichiers téléchargés est limitée par defaultMaxPackageSize, par défaut 10M, peut être modifiée dans le fichier
config/server.php
pour changermax_package_size
. - Le fichier temporaire sera automatiquement supprimé après la fin de la requête.
- Si aucune fichier n'est téléchargé,
$request->file()
retourne un tableau vide. - Les fichiers téléchargés ne supportent pas la méthode
move_uploaded_file()
, veuillez utiliser la méthode$file->move()
à la place, voir l'exemple ci-dessous.
Obtenir un fichier téléchargé spécifique
$request->file('avatar');
Si le fichier existe, cela retourne l'instance webman\Http\UploadFile
correspondante, sinon cela retourne null.
Exemple
<?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']);
}
}
Obtenir l'hôte
Obtenir les informations de l'hôte de la requête.
$request->host();
Si l'adresse de la requête est sur un port non standard, comme 80 ou 443, les informations d'hôte peuvent inclure le port, par exemple example.com:8080
. Si le port n'est pas nécessaire, le premier paramètre peut être passé comme true
.
$request->host(true);
Obtenir la méthode de requête
$request->method();
La valeur de retour peut être l'un de GET
, POST
, PUT
, DELETE
, OPTIONS
, HEAD
.
Obtenir l'URI de la requête
$request->uri();
Retourne l'URI de la requête, y compris les parties path et queryString.
Obtenir le chemin de la requête
$request->path();
Retourne la partie path de la requête.
Obtenir la queryString de la requête
$request->queryString();
Retourne la partie queryString de la requête.
Obtenir l'URL de la requête
La méthode url()
retourne l'URL sans les paramètres Query
.
$request->url();
Retourne une valeur similaire à //www.workerman.net/workerman-chat
.
La méthode fullUrl()
retourne l'URL avec les paramètres Query
.
$request->fullUrl();
Retourne une valeur similaire à //www.workerman.net/workerman-chat?type=download
.
Remarque
Les méthodesurl()
etfullUrl()
ne retournent pas la partie protocole (ne retournent pas http ou https).
Cela est dû au fait que dans les navigateurs, une adresse commençant par//example.com
reconnaît automatiquement le protocole du site actuel, initiant automatiquement la requête en http ou https.
Si vous utilisez un proxy nginx, veuillez ajouter proxy_set_header X-Forwarded-Proto $scheme;
à la configuration nginx, voir la documentation du proxy nginx,
vous pourrez ainsi utiliser $request->header('x-forwarded-proto');
pour déterminer s'il s'agit de http ou https, par exemple :
echo $request->header('x-forwarded-proto'); // Affiche http ou https
Obtenir la version HTTP de la requête
$request->protocolVersion();
Retourne une chaîne 1.1
ou 1.0
.
Obtenir l'ID de session de la requête
$request->sessionId();
Retourne une chaîne composée de lettres et de chiffres.
Obtenir l'IP du client de la requête
$request->getRemoteIp();
Obtenir le port du client de la requête
$request->getRemotePort();
Obtenir l'IP réelle du client de la requête
$request->getRealIp($safe_mode=true);
Lorsque le projet utilise un proxy (comme nginx), l'utilisation de $request->getRemoteIp()
retourne souvent l'IP du serveur proxy (comme 127.0.0.1
192.168.x.x
) et non l'IP réelle du client. Dans ce cas, vous pouvez essayer d'utiliser $request->getRealIp()
pour obtenir l'IP réelle du client.
La méthode $request->getRealIp()
tentera d'obtenir l'IP réelle à partir des en-têtes HTTP x-forwarded-for
, x-real-ip
, client-ip
, x-client-ip
, et via
.
Étant donné que les en-têtes HTTP peuvent facilement être falsifiés, l'IP du client obtenue par cette méthode n'est pas à 100 % fiable, surtout lorsque
$safe_mode
est faux. La méthode la plus fiable pour obtenir l'IP réelle du client à travers un proxy est de connaître les IP des serveurs proxy sécurisés et de savoir exactement quel en-tête HTTP transporte l'IP réelle. Si l'IP retournée par$request->getRemoteIp()
est confirmée comme étant un serveur proxy sécurisé connu, vous pourrez alors obtenir l'IP réelle via$request->header('HTTP_HEADER_TRANSPORTANT_L_IP_REELLE')
.
Obtenir l'IP du serveur
$request->getLocalIp();
Obtenir le port du serveur
$request->getLocalPort();
Vérifier si c'est une requête ajax
$request->isAjax();
Vérifier si c'est une requête pjax
$request->isPjax();
Vérifier si une réponse JSON est attendue
$request->expectsJson();
Vérifier si le client accepte une réponse JSON
$request->acceptJson();
Obtenir le nom du plugin de la requête
Les demandes sans plugin retournent une chaîne vide ''
.
$request->plugin;
Obtenir le nom de l'application de la requête
Pour une application unique, cela retourne toujours une chaîne vide ''
, dans le cas de plusieurs applications cela retourne le nom de l'application.
$request->app;
Étant donné que les fonctions de fermeture n'appartiennent à aucune application, les requêtes provenant de routes de fermeture retourneront toujours une chaîne vide
''
pour$request->app
.
Pour plus d'informations sur les routes de fermeture, voir les routes.
Obtenir le nom de la classe du contrôleur de la requête
Obtenir le nom de la classe correspondant au contrôleur.
$request->controller;
Retourne une valeur similaire à app\controller\IndexController
.
Étant donné que les fonctions de fermeture n'appartiennent à aucun contrôleur, les requêtes provenant de routes de fermeture retourneront toujours une chaîne vide
''
pour$request->controller
.
Pour plus d'informations sur les routes de fermeture, voir les routes.
Obtenir le nom de la méthode de la requête
Obtenir le nom de la méthode du contrôleur correspondant à la requête.
$request->action;
Retourne une valeur similaire à index
.
Étant donné que les fonctions de fermeture n'appartiennent à aucun contrôleur, les requêtes provenant de routes de fermeture retourneront toujours une chaîne vide
''
pour$request->action
.
Pour plus d'informations sur les routes de fermeture, voir les routes.
Réécrire les paramètres
Parfois, nous voulons réécrire les paramètres de la requête, par exemple filtrer la requête, puis réaffecter les valeurs à l'objet de requête. Dans ce cas, nous pouvons utiliser les méthodes setGet()
, setPost()
, setHeader()
.
Réécrire les paramètres GET
$request->get(); // Supposons obtenir ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // Finalement obtient ['name' => 'tom']
Remarque
Comme indiqué dans l'exemple,setGet()
réécrit tous les paramètres GET,setPost()
etsetHeader()
ont le même comportement.
Réécrire les paramètres POST
$post = $request->post();
foreach ($post as $key => $value) {
$post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // Obtient les paramètres POST filtrés
Réécrire les paramètres d'en-tête
$request->setHeader(['host' => 'example.com']);
$request->header('host'); // Affiche example.com