Solicitudes
Flight encapsula la solicitud HTTP en un solo objeto, que puede ser accedido haciendo:
$request = Flight::request();
Casos de Uso Típicos
Cuando estás trabajando con una solicitud en una aplicación web, típicamente querrás
extraer un encabezado, o un parámetro $_GET
o $_POST
, o quizás
incluso el cuerpo de la solicitud en bruto. Flight proporciona una interfaz simple para hacer todas estas cosas.
Aquí hay un ejemplo de obtención de un parámetro de la cadena de consulta:
Flight::route('/search', function(){
$keyword = Flight::request()->query['keyword'];
echo "Estás buscando: $keyword";
// consulta una base de datos o algo más con el $keyword
});
Aquí hay un ejemplo de tal vez un formulario con un método POST:
Flight::route('POST /submit', function(){
$name = Flight::request()->data['name'];
$email = Flight::request()->data['email'];
echo "Has enviado: $name, $email";
// guarda en una base de datos o algo más con el $name y $email
});
Propiedades del Objeto Solicitud
El objeto solicitud proporciona las siguientes propiedades:
- body - El cuerpo de la solicitud HTTP en bruto
- url - La URL solicitada
- base - El subdirectorio padre de la URL
- method - El método de solicitud (GET, POST, PUT, DELETE)
- referrer - La URL de referencia
- ip - 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 la publicación 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 arreglo
$_SERVER
en busca deHTTP_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
Puedes acceder a las propiedades query
, data
, cookies
y files
como matrices u objetos.
Así que, 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 RAW
Para obtener el cuerpo de la solicitud HTTP en bruto, por ejemplo al manejar 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 arreglo $_GET
a través de la propiedad query
:
$id = Flight::request()->query['id'];
$_POST
Puedes acceder al arreglo $_POST
a través de la propiedad data
:
$id = Flight::request()->data['id'];
$_COOKIE
Puedes acceder al arreglo $_COOKIE
a través de la propiedad cookies
:
$myCookieValue = Flight::request()->cookies['myCookieName'];
$_SERVER
Hay un acceso directo disponible para acceder al arreglo $_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 archivos subidos a través de la propiedad files
:
$uploadedFile = Flight::request()->files['myFile'];
Procesamiento de Cargas de Archivos
Puedes procesar cargas de archivos utilizando el framework con algunos métodos de ayuda. Básicamente se reduce a extraer los datos del archivo de la solicitud y moverlos a una nueva ubicación.
Flight::route('POST /upload', function(){
// Si tuvieras 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 recorrerlos:
Flight::route('POST /upload', function(){
// Si tuvieras 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 desinfecta la entrada del usuario, especialmente al tratar con cargas de archivos. Siempre valida el tipo de extensiones que permitirás que se suban, pero también debes validar los "bytes mágicos" del archivo para asegurarte de que es realmente el tipo de archivo que el usuario dice que es. Hay artículos y bibliotecas disponibles para ayudar con esto.
Encabezados de Solicitud
Puedes acceder a los encabezados de solicitud usando el método getHeader()
o getHeaders()
:
// Tal vez necesites el encabezado de Autorización
$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 en bruto utilizando el método getBody()
:
$body = Flight::request()->getBody();
Método de Solicitud
Puedes acceder al método de solicitud utilizando 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 auxiliares para ensamblar partes de una URL para tu conveniencia.
URL Completa
Puedes acceder a la URL completa de la solicitud 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();
// Nota, sin barra final.
// https://example.com
Análisis de Consultas
Puedes pasar una URL al método parseQuery()
para analizar la cadena de consulta en un arreglo asociativo:
$query = Flight::request()->parseQuery('https://example.com/some/path?foo=bar');
// ['foo' => 'bar']