Solicitudes
Flight encapsula la solicitud HTTP en un solo objeto, que se puede acceder haciendo:
$request = Flight::request();
Casos de Uso Típicos
Cuando estás trabajando con una solicitud en una aplicación web, generalmente querrás
extraer un encabezado, o un parámetro $_GET
o $_POST
, o quizás
incluso el cuerpo de la solicitud sin procesar. Flight proporciona una interfaz simple para hacer todo esto.
Aquí hay un ejemplo para obtener un parámetro de la cadena de consulta:
Flight::route('/search', function(){
$keyword = Flight::request()->query['keyword'];
echo "You are searching for: $keyword";
// consulta una base de datos o algo más con el $keyword
});
Aquí hay un ejemplo de quizás un formulario con un método POST:
Flight::route('POST /submit', function(){
$name = Flight::request()->data['name'];
$email = Flight::request()->data['email'];
echo "You submitted: $name, $email";
// guarda en una base de datos o algo más con el $name y $email
});
Propiedades del Objeto de Solicitud
El objeto de solicitud proporciona las siguientes propiedades:
- body - El cuerpo de la solicitud HTTP sin procesar
- url - La URL que se está solicitando
- base - El subdirectorio principal de la URL
- method - El método de la solicitud (GET, POST, PUT, DELETE)
- referrer - La URL de referencia
- ip - La dirección IP del cliente
- ajax - Si la solicitud es una solicitud AJAX
- scheme - El protocolo del servidor (http, https)
- user_agent - Información del navegador
- type - El tipo de contenido
- length - La longitud del contenido
- query - Parámetros de la cadena de consulta
- data - Datos de POST o datos JSON
- cookies - Datos de cookies
- files - Archivos subidos
- secure - Si la conexión es segura
- accept - Parámetros de aceptación HTTP
- proxy_ip - Dirección IP del proxy del cliente. Escanea el array
$_SERVER
paraHTTP_CLIENT_IP
,HTTP_X_FORWARDED_FOR
,HTTP_X_FORWARDED
,HTTP_X_CLUSTER_CLIENT_IP
,HTTP_FORWARDED_FOR
,HTTP_FORWARDED
en ese orden. - host - El nombre de host de la solicitud
- servername - El SERVER_NAME de
$_SERVER
Puedes acceder a las propiedades query
, data
, cookies
y files
como arrays u objetos.
Entonces, para obtener un parámetro de la cadena de consulta, puedes hacer:
$id = Flight::request()->query['id'];
O puedes hacer:
$id = Flight::request()->query->id;
Cuerpo de Solicitud Sin Procesar
Para obtener el cuerpo de la solicitud HTTP sin procesar, por ejemplo al lidiar con solicitudes PUT, puedes hacer:
$body = Flight::request()->getBody();
Entrada JSON
Si envías una solicitud con el tipo application/json
y los datos {"id": 123}
estará disponible desde la propiedad data
:
$id = Flight::request()->data->id;
$_GET
Puedes acceder al array $_GET
a través de la propiedad query
:
$id = Flight::request()->query['id'];
$_POST
Puedes acceder al array $_POST
a través de la propiedad data
:
$id = Flight::request()->data['id'];
$_COOKIE
Puedes acceder al array $_COOKIE
a través de la propiedad cookies
:
$myCookieValue = Flight::request()->cookies['myCookieName'];
$_SERVER
Hay un atajo disponible para acceder al array $_SERVER
a través del método getVar()
:
$host = Flight::request()->getVar('HTTP_HOST');
Accediendo a Archivos Subidos a través de $_FILES
Puedes acceder a los archivos subidos a través de la propiedad files
:
$uploadedFile = Flight::request()->files['myFile'];
Procesamiento de Subidas de Archivos (v3.12.0)
Puedes procesar subidas de archivos usando el framework con algunos métodos de ayuda. Básicamente se reduce a extraer los datos del archivo de la solicitud y moverlo a una nueva ubicación.
Flight::route('POST /upload', function(){
// Si tenías un campo de entrada como <input type="file" name="myFile">
$uploadedFileData = Flight::request()->getUploadedFiles();
$uploadedFile = $uploadedFileData['myFile'];
$uploadedFile->moveTo('/path/to/uploads/' . $uploadedFile->getClientFilename());
});
Si tienes múltiples archivos subidos, puedes iterar a través de ellos:
Flight::route('POST /upload', function(){
// Si tenías un campo de entrada como <input type="file" name="myFiles[]">
$uploadedFiles = Flight::request()->getUploadedFiles()['myFiles'];
foreach ($uploadedFiles as $uploadedFile) {
$uploadedFile->moveTo('/path/to/uploads/' . $uploadedFile->getClientFilename());
}
});
Nota de Seguridad: Siempre valida y sanitiza la entrada del usuario, especialmente al lidiar con subidas de archivos. Siempre valida el tipo de extensiones que permitirás subir, pero también deberías validar los "magic bytes" del archivo para asegurarte de que realmente es el tipo de archivo que el usuario reclama. Hay articles and libraries disponibles para ayudar con esto.
Encabezados de Solicitud
Puedes acceder a los encabezados de solicitud usando el método getHeader()
o getHeaders()
:
// Quizás necesites el encabezado Authorization
$host = Flight::request()->getHeader('Authorization');
// o
$host = Flight::request()->header('Authorization');
// Si necesitas obtener todos los encabezados
$headers = Flight::request()->getHeaders();
// o
$headers = Flight::request()->headers();
Cuerpo de Solicitud
Puedes acceder al cuerpo de la solicitud sin procesar usando el método getBody()
:
$body = Flight::request()->getBody();
Método de Solicitud
Puedes acceder al método de la solicitud usando la propiedad method
o el método getMethod()
:
$method = Flight::request()->method; // en realidad llama a getMethod()
$method = Flight::request()->getMethod();
Nota: El método getMethod()
primero obtiene el método de $_SERVER['REQUEST_METHOD']
, luego puede ser sobrescrito
por $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']
si existe o $_REQUEST['_method']
si existe.
URLs de Solicitud
Hay un par de métodos de ayuda para ensamblar partes de una URL para tu conveniencia.
URL Completa
Puedes acceder a la URL de solicitud completa usando el método getFullUrl()
:
$url = Flight::request()->getFullUrl();
// https://example.com/some/path?foo=bar
URL Base
Puedes acceder a la URL base usando el método getBaseUrl()
:
$url = Flight::request()->getBaseUrl();
// Notice, no trailing slash.
// https://example.com
Análisis de Consultas
Puedes pasar una URL al método parseQuery()
para analizar la cadena de consulta en un array asociativo:
$query = Flight::request()->parseQuery('https://example.com/some/path?foo=bar');
// ['foo' => 'bar']