Recibiendo datos en Laravel 5

  • Por
  • PHP
Metodos y alternativas para recibir datos enviados en la solicitud HTTP con Request en Laravel 5.

Laravel 5 nos ofrece toda la información relativa a la solicitud por medio de un objeto Request, el cual estudiamos ya en el artículo de HTTP Request en Laravel. Ahora queremos revisar y poner ejemplos de una serie de métodos útiles para recibir los datos que nos envían.

El envío de datos puede realizarse tanto por get como por post y siempre los recibiremos por medio del objeto Request, usando los mismos métodos, independientemente del método de envío. Como ya sabemos, cuando se envían datos por get, viajan en variables dentro de la URL y cuando se envían por post, viajan en las cabeceras del HTTP, de manera invisible para el usuario.

Antes de ponernos a ver contenido de este artículo, refresquemos algo nuestra memoria sobre los request y el flujo de trabajo de Laravel 5. Vamos a trabajar con una ruta como la siguiente:

Route::match(['get', 'post'], 'input', 'TestRequestController@recibir');

Hemos definido una ruta hacia un controlador llamado "TestRequestController" con una acción llamada "recibir" ('TestRequestController@recibir') que es donde tenemos que codificar la respuesta ante la solicitud "input". Esta acción se pondrá en marcha cuando el verbo del HTTP sea "post" o "get". Todo esto lo vimos en el artículo sobre routing en Laravel.

Ahora veamos el código de este controlador, que define el método recibir() para codificar el comportamiento ante la ruta anterior.

class TestRequestController extends Controller
{
     public function recibir(Request $request)
    {
        // código para esta acción del controlador
    }
}

Dentro del controlador tenemos el método recibir(), al que le inyectamos como dependencia el objeto de la clase Request. De esa manera somos capaces de acceder a los datos de la solicitud. Todo el resto del código PHP que vamos a ver en este artículo se sitúa dentro de ese método y cuando hagamos referencia a $request ya sabemos que se trata de una instancia del objeto HTTP Request.

Averiguar el método en una solicitud

Como hemos mencionado, la manera de recoger los datos que nos envíen es la misma en cualquier método (get si se envían por la URL, post si se envían por formulario). Por tanto, si en algún momento necesitamos averiguar cuál es (get o post), podemos consultarlo a través del método de Request llamado method().

$metodo = $request->method();

Esto, en la ruta anterior, que hemos definido tanto para el verbo "post" como para el verbo "get" nos devolvería el método con el que se ha producido la solicitud, entre los dos posibles.

Si en cualquier momento queremos preguntar si estamos ante un método en particular podemos preguntarlo con isMethod().

if($request->isMethod('post')){
    echo "Estoy recibiendo por post";
}

Recuperando datos enviados por GET / POST

Ahora vamos a ver una serie de métodos de Request que nos sirven para traernos las variables enviadas por GET o POST.

Obtener un dato suelto: método input(), indicando la cadena que queremos recibir.

$nombre = $request->input("nombre");

Nota: Recuerda que para probar este ejercicio lo más cómodo será usar una extensión como Postman, que permite indicar la URL y definir el verbo del HTTP e incluso mandarle datos por formulario. Esto lo explicamos en el artículo Verbos en las rutas de Laravel. También se mencionó en ese artículo que para que los envíos por post nos funcionen habrá que desactivar el middleware de protección CSRF "VerifyCsrfToken".

Valor predeterninado: Ahora también podemos especificar un valor predeterminado para recibir como respuesta en la consulta, si es que ese dato no fue recibido en el Request.

$edad = $request->input("edad", 18);

Recibir datos que vienen en arrays: Como debes saber, es posible agrupar en arrays datos que se envían por formularios o por la URL. Hay diversos modos, el más habitual es ponerle el name del campo input un valor con unos corchetes vacíos al final.

Categoria0: <input name="categorias[]">
<br />
Categoria1: <input name="categorias[]">
<br />
Categoria2: <input name="categorias[]">

Otra opción es que te vengan los datos de un SELECT "multiple".

<select name="categorias" multiple>
...
</select>

La cosa se puede complicar todo lo que desees, con campos que se organizan en arrays de varias dimensiones.

<input name="categorias[0][nombre]">
<input name="categorias[0][votos]">
<input name="categorias[1][nombre]">
<input name="categorias[1][votos]">
...

Todas esas alternativas las construyes con el HTML, no vamos a seguir dando ejemplos. Ahora, si lo deseas, con Laravel lo podrías recoger con:

$categorias = $request->input("categorias");

Así recibes un array con todas las categorías, pero podrías acceder a alguna de las posiciones del array en concreto, mediante la notación "punto".

$categorias = $request->input("categorias.1.voto");

Saber si se recibe un dato: Puedes saber si estás recibiendo un dato en concreto en el conjunto de los datos recibidos con HTTP, mediante el método has().

if ($request->has("edad")){
    echo "Encontré la edad";
}

Recibir un grupo de datos: otra posibilidad, cuando quieres recibir varios datos a la vez, es usar el método only(), en el que indicas un listado de las claves (key) de aquellos datos que deseas recibir. Lo que te devuelve only() es un array asociativo con pares llave/valor de aquellos elementos indicados.

$datos_grupo = $request->only('nombre', 'id');

Mediante el anterior código recibirás un array asociativo con la llave "nombre" e "id". Sus valores serán aquellos valores que se reciban en Request. Si alguno de ellos se ha especificado pero no se ha recibido, entonces simplemente recibirás null como valor.

Recibir todos los datos menos algunos: Es parecido al anterior método, pero en vez de indicar qué queremos recibir, se indica qué se quiere excluir.

$datos_excepto = $request->except('categorias');

Recibir todos los datos del Request: Este método ya lo vimos anteriormente, simplemente nos devuelve un array asociativo con la totalidad de los datos que se encuentren en la solicitud.

$todos = $request->all();

Recibir un campo de tipo file: Si estamos haciendo upload de archivos a través de un formulario, los campos los tenemos que recoger de una manera diferente, usando el método file().

$archivo = $request->file('archivo');

También podemos comprobar si existe el archivo usando hasFile().

if($request->hasFile('archivo')){
    $archivo = $request->file('archivo');
}

Existen una serie de métodos para trabajar con archivos enviados desde formulario, pero preferimos verlos más adelante cuando hagamos un ejercicio completo de upload de archivos con Laravel, porque tiene varios detalles que sería largo de tratar en este momento e innecesario con lo que sabemos hasta el momento de este framework PHP.

De momento en el próximo artículo nos vamos a introducir en la validación de la entrada con Laravel, un tema mucho más básico e importante.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

jhoan steve

21/10/2016
error al usar post
cuando utilizo get funciona bien el envio de Request pero si es post al enviar datos sale error TokenMismatchException in VerifyCsrfToken.php line 68:

Claudio

12/7/2017
No dices como resibir un select en el controller
solo dices esto: "Otra opción es que te vengan los datos de un SELECT "multiple"."