Descripción

Obtener el objeto de solicitud

Webman inyectará automáticamente el objeto de solicitud en el primer parámetro del método de acción, por ejemplo:

Ejemplo

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        $default_name = 'webman';
        // Obtener el parámetro name de la solicitud get, si no se ha pasado el parámetro name, entonces devuelve $default_name
        $name = $request->get('name', $default_name);
        // Devolver la cadena al navegador
        return response('hello ' . $name);
    }
}

A través del objeto $request, podemos obtener cualquier dato relacionado con la solicitud.

A veces queremos obtener el objeto $request de la solicitud actual en otras clases, para esto solo necesitamos usar la función asistente request();

Obtener los parámetros de solicitud get

Obtener toda la matriz get

$request->get();

Si la solicitud no tiene parámetros get, devolverá un arreglo vacío.

Obtener un valor de la matriz get

$request->get('name');

Si la matriz get no contiene ese valor, devolverá null.

También puedes pasar un valor por defecto como segundo parámetro al método get, si no se encuentra el valor correspondiente en la matriz get, devolverá el valor por defecto. Por ejemplo:

$request->get('name', 'tom');

Obtener los parámetros de solicitud post

Obtener toda la matriz post

$request->post();

Si la solicitud no tiene parámetros post, devolverá un arreglo vacío.

Obtener un valor de la matriz post

$request->post('name');

Si la matriz post no contiene ese valor, devolverá null.

Al igual que el método get, también puedes pasar un valor por defecto como segundo parámetro al método post, si no se encuentra el valor correspondiente en la matriz post, devolverá el valor por defecto. Por ejemplo:

$request->post('name', 'tom');

Función asistente input()

Similar a la función $request->input(), puede obtener todos los parámetros, la función asistente input() tiene dos parámetros:

  1. name: el nombre del parámetro a obtener (si está vacío, puede obtener un arreglo con todos los parámetros)
  2. default: valor por defecto (si la obtención del primer parámetro falla, se usará este valor)

Por ejemplo

// Obtener el parámetro name
$name = input('name');
// Obtener el parámetro name, si no existe usar valor por defecto
$name = input('name', '张三');
// Obtener todos los parámetros
$all_params = input();

Obtener el cuerpo de la solicitud post original

$post = $request->rawBody();

Esta función es similar a file_get_contents("php://input"); en php-fpm. Se utiliza para obtener el cuerpo original de la solicitud http. Esto es útil al obtener datos de solicitud post que no son en formato application/x-www-form-urlencoded.

Obtener el encabezado

Obtener toda la matriz de encabezados

$request->header();

Si la solicitud no tiene parámetros de encabezado, devolverá un arreglo vacío. Ten en cuenta que todas las claves son minúsculas.

Obtener un valor de la matriz de encabezados

$request->header('host');

Si la matriz de encabezados no contiene ese valor, devolverá null. Ten en cuenta que todas las claves son minúsculas.

Al igual que el método get, también puedes pasar un valor por defecto como segundo parámetro al método header, si no se encuentra el valor correspondiente en la matriz de encabezados, devolverá el valor por defecto. Por ejemplo:

$request->header('host', 'localhost');

Obtener cookie

Obtener toda la matriz de cookies

$request->cookie();

Si la solicitud no tiene parámetros de cookies, devolverá un arreglo vacío.

Obtener un valor de la matriz de cookies

$request->cookie('name');

Si la matriz de cookies no contiene ese valor, devolverá null.

Al igual que el método get, también puedes pasar un valor por defecto como segundo parámetro al método cookie, si no se encuentra el valor correspondiente en la matriz de cookies, devolverá el valor por defecto. Por ejemplo:

$request->cookie('name', 'tom');

Obtener toda la entrada

Incluye la colección de post y get.

$request->all();

Obtener un valor de entrada específico

Obtener un valor de la colección de post y get.

$request->input('name', $default_value);

Obtener parte de los datos de entrada

Obtener parte de los datos de la colección de post y get.

// Obtener un arreglo compuesto por username y password, si la clave correspondiente no existe, se ignora
$only = $request->only(['username', 'password']);
// Obtener todos los datos de entrada excepto avatar y age
$except = $request->except(['avatar', 'age']);

Obtener entrada a través de parámetros del controlador

<?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 lógica del código es similar a

<?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]);
    }
}

Más información en Vinculación de parámetros del controlador

Obtener archivos subidos

Nota
La subida de archivos requiere utilizar formularios en formato multipart/form-data

Obtener toda la matriz de archivos subidos

$request->file();

El formulario es similar a:

<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>

El formato que devuelve $request->file() es similar a:

array (
    'file1' => object(webman\Http\UploadFile),
    'file2' => object(webman\Http\UploadFile)
)

Es un arreglo de instancias de webman\Http\UploadFile. La clase webman\Http\UploadFile hereda de la clase incorporada de PHP SplFileInfo y proporciona algunos métodos útiles.

<?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()); // Si el archivo es válido, por ejemplo true|false
            var_export($spl_file->getUploadExtension()); // Sufijo del archivo subido, por ejemplo 'jpg'
            var_export($spl_file->getUploadMimeType()); // Tipo mime del archivo subido, por ejemplo 'image/jpeg'
            var_export($spl_file->getUploadErrorCode()); // Obtener el código de error de la subida, por ejemplo UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
            var_export($spl_file->getUploadName()); // Nombre del archivo subido, por ejemplo 'my-test.jpg'
            var_export($spl_file->getSize()); // Obtener el tamaño del archivo, por ejemplo 13364, en bytes
            var_export($spl_file->getPath()); // Obtener el directorio de subida, por ejemplo '/tmp'
            var_export($spl_file->getRealPath()); // Obtener la ruta del archivo temporal, por ejemplo '/tmp/workerman.upload.SRliMu'
        }
        return response('ok');
    }
}

Notas:

  • Después de que un archivo es subido, será nombrado como un archivo temporal, similar a /tmp/workerman.upload.SRliMu
  • El tamaño de archivo subido está limitado por defaultMaxPackageSize, que es 10M por defecto, se puede modificar el valor por defecto en el archivo config/server.php cambiando max_package_size.
  • Después de finalizar la solicitud, los archivos temporales se eliminarán automáticamente.
  • Si la solicitud no tiene archivos subidos, entonces $request->file() devolverá un arreglo vacío.
  • Los archivos subidos no soportan el método move_uploaded_file(), utiliza en su lugar el método $file->move(), consulta el siguiente ejemplo.

Obtener un archivo subido específico

$request->file('avatar');

Si el archivo existe, devolverá la instancia webman\Http\UploadFile correspondiente, de lo contrario devolverá null.

Ejemplo

<?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']);
    }
}

Obtener el host

Obtener la información del host de la solicitud.

$request->host();

Si la dirección de la solicitud no es un puerto estándar como 80 o 443, la información del host puede incluir el puerto, por ejemplo example.com:8080. Si no se necesita el puerto, el primer parámetro puede ser pasado como true.

$request->host(true);

Obtener el método de solicitud

 $request->method();

El valor de retorno puede ser uno de GET, POST, PUT, DELETE, OPTIONS, HEAD.

Obtener el uri de la solicitud

$request->uri();

Devuelve el uri de la solicitud, incluyendo la parte de path y queryString.

Obtener el path de la solicitud

$request->path();

Devuelve la parte de path de la solicitud.

Obtener el queryString de la solicitud

$request->queryString();

Devuelve la parte de queryString de la solicitud.

Obtener la url de la solicitud

El método url() devuelve la URL sin los parámetros Query.

$request->url();

Devuelve algo similar a //www.workerman.net/workerman-chat

El método fullUrl() devuelve la URL con los parámetros Query.

$request->fullUrl();

Devuelve algo similar a //www.workerman.net/workerman-chat?type=download

Nota
url() y fullUrl() no devuelven la parte del protocolo (no devuelven http o https).
Debido a que en el navegador, una dirección que comienza con //example.com automáticamente reconocerá el protocolo del sitio actual y hará la solicitud usando http o https.

Si estás usando un proxy nginx, agrega proxy_set_header X-Forwarded-Proto $scheme; a la configuración de nginx, consulta el proxy nginx,
de esta manera podrás usar $request->header('x-forwarded-proto'); para determinar si es http o https, por ejemplo:

echo $request->header('x-forwarded-proto'); // Salida http o https

Obtener la versión HTTP de la solicitud

$request->protocolVersion();

Devuelve la cadena 1.1 o 1.0.

Obtener el sessionId de la solicitud

$request->sessionId();

Devuelve una cadena compuesta de letras y números.

Obtener la IP del cliente de la solicitud

$request->getRemoteIp();

Obtener el puerto del cliente de la solicitud

$request->getRemotePort();

Obtener la IP real del cliente de la solicitud

$request->getRealIp($safe_mode=true);

Cuando el proyecto utiliza un proxy (por ejemplo, nginx), el uso de $request->getRemoteIp() a menudo resultará en la IP del servidor proxy (como 127.0.0.1 192.168.x.x) y no la IP real del cliente. En este caso, se puede intentar usar $request->getRealIp() para obtener la IP real del cliente.

$request->getRealIp() intentará obtener la IP real del cliente a partir de los encabezados HTTP x-forwarded-for, x-real-ip, client-ip, x-client-ip, via.

Dado que los encabezados HTTP son fáciles de falsificar, la IP del cliente obtenida por este método no es 100% confiable, especialmente cuando $safe_mode es falso. Un método más confiable para obtener la IP real del cliente a través de un proxy es conocer las IP de los servidores proxy seguros y saber con claridad qué encabezado HTTP lleva la IP real. Si la IP devuelta por $request->getRemoteIp() se confirma como la IP conocida de un proxy seguro, entonces se puede obtener la IP real a través de $request->header('HTTP_HEADER_WITH_REAL_IP').

Obtener la IP del servidor

$request->getLocalIp();

Obtener el puerto del servidor

$request->getLocalPort();

Verificar si es una solicitud ajax

$request->isAjax();

Verificar si es una solicitud pjax

$request->isPjax();

Verificar si se espera un retorno en json

$request->expectsJson();

Verificar si el cliente acepta el retorno en json

$request->acceptJson();

Obtener el nombre del plugin de la solicitud

Las solicitudes que no son de plugins devuelven una cadena vacía ''.

$request->plugin;

Obtener el nombre de la aplicación de la solicitud

En una sola aplicación siempre devolverá una cadena vacía '', en múltiples aplicaciones devolverá el nombre de la aplicación.

$request->app;

La función de cierre no pertenece a ninguna aplicación, por lo que las solicitudes provenientes de rutas de cierre siempre devolverán una cadena vacía ''
Consulta las rutas de cierre en rutas

Obtener el nombre de la clase del controlador de la solicitud

Obtener el nombre de la clase correspondiente del controlador

$request->controller;

Devuelve algo similar a app\controller\IndexController

La función de cierre no pertenece a ningún controlador, por lo que las solicitudes provenientes de rutas de cierre siempre devolverán una cadena vacía ''
Consulta las rutas de cierre en rutas

Obtener el nombre del método de la solicitud

Obtener el nombre del método correspondiente del controlador para la solicitud

$request->action;

Devuelve algo similar a index

La función de cierre no pertenece a ningún controlador, por lo que las solicitudes provenientes de rutas de cierre siempre devolverán una cadena vacía ''
Consulta las rutas de cierre en rutas

Reescribir parámetros

A veces queremos reescribir los parámetros de la solicitud, por ejemplo, filtrar la solicitud y luego volver a asignarlos al objeto de solicitud, para esto podemos usar los métodos setGet(), setPost(), setHeader().

Reescribir parámetros GET

$request->get(); // Supongamos que obtenemos ['name' => 'tom', 'age' => 18]
$request->setGet(['name' => 'tom']);
$request->get(); // Finalmente obtiene ['name' => 'tom']

Nota
Como se mostró en el ejemplo, setGet() reescribe todos los parámetros GET, setPost() y setHeader() también comportan igual.

Reescribir parámetros POST

$post = $request->post();
foreach ($post as $key => $value) {
    $post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // Obtiene los parámetros post filtrados

Reescribir parámetros HEADER

$request->setHeader(['host' => 'example.com']);
$request->header('host'); // Salida example.com