Newsletter para devsEntra

Laravel VII: Rutas

Si bien ya hemos tocado por encima las rutas dentro de esta serie sobre el Framework PHP Laravel, he visto conveniente dedicar un sólo artículo a la puerta de entrada de nuestra aplicación.

curso-laravel-gestion-rutas

Si os habéis perdido algún artículo de la Laravel series, os dejo por aquí un pequeño índice:

Como bien he dicho antes, las rutas se pueden considerar la puerta de entrada de nuestra aplicación, ya que gestiona todos los ataques a las mismas por parte del usuario.

Toda petición del usuario en la barra (/) que se encuentra después de nuestro dominio es controlable mediante código y en este artículo vamos a ver las diferentes opciones que Laravel nos permite utilizar.

Gestión básica de rutas

Cabe decir que las rutas gestionadas dentro de nuestra aplicación permiten todos estos tipos de peticiones HTTP:

  • GET
  • POST
  • PUT
  • PATCH
  • DELETE
  • OPTIONS

En este artículo no veremos todas las opciones, pero con tan solo el método GET, podemos hacernos una idea de cómo funciona el sistema.

Estas peticiones son las que realizamos cuando visitamos una URL con un método simple como un anchor o cuando simplemente escribimos la URL en la barra de nuestro navegador.

La inyección de parámetros con este método se realiza en la misma URL de vista a la ruta, y viene especificada con una nomenclatura específica:

http://midominio.com/ruta.php/parametro1/{valor parametro1}/parametro2/{valor parametro 2}

Cabe recordar que todas las rutas de nuestra aplicación vienen contenidas en routes/web.php.

En la definición más básica de este tipo de peticiones, podemos ver que debemos hacer una llamada a la clase Route (incluida con la instalación del Framework), utilizando el método estático get y pasándole como parámetros la ruta y la función a ejecutar.

Una petición simple, que devuelve una vista cuando el usuario pide una ruta, puede verse en la ruta por defecto que incluye Laravel cuando realizamos una instalación limpia.

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the 'web' middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

En este caso, podemos ver la llamada a la clase Route y más específicamente al método get (ya que es una petición del tipo GET), su ruta sería /, el raíz de nuestra aplicación, y como función anónima (sin nombre) retornamos una vista, que este caso es la vista de bienvenida de Laravel.

Cabe destacar que nomenclatura a utilizar en Laravel suele tener varias alternativas. En este caso podemos sustituir la llamada realizada anteriormente por esta otra, siendo el resultado totalmente idéntico:

Route::view('/', 'welcome');

En este caso, el método view, está esperando una vista como segundo parámetro.

Si quisiéramos declarar una vista del tipo POST tan solo deberíamos utilizar el método post en lugar de get. Esto si, esta ruta solo se ejecutaría si la llamada a la ruta se hubiera hecho a través de un formulario (que es el que envía las variables a través del método POST).

Gestión rutas con parámetros

Tal y como hemos visto antes, una ruta al uso en Laravel, puede contener parámetros en la misma URL (siempre y cuando enviemos estos parámetros a través del método GET).

En una petición llevada a la mínima expresión, podemos por ejemplo, hacer una llamada a una ruta en nuestra aplicación en la que se ataque a /users y que además le inyectemos el parámetro como valor del mismo (/343 a continuación):

https://midominio.com/users/343

Pero, ¿cómo podemos almacenar el valor de este parámetro en una variable para poder tratarlo?

Dentro de nuestro archivo de gestión de rutas: /routes/web.php, en la declaración de la ruta /users y en su método GET, debemos utilizar una nomenclatura específica, en la cual, el método get espera que todo valor contenido entre {} sea un valor de una variable.

Para especificar el nombre de la misma, en la llamada a la función anónima, tan solo debemos especificarle como parámetros el nombre de la variable en función del orden en el que estas variables se han declarado entre corchetes.

La declaración de la ruta anterior se realizaría de esta forma:

Route::get('/users/{user}', function ($userId) {
    //
});

Dentro de la función anónima, podríamos utilizar la variable $userId que contendría el valor 343.

Además, este valor puede ser llevado a una vista, controlador, etc.

Realizando llamadas a un controlador

En algunos artículos de esta saga, hemos visto que Laravel se basa en el modelo Vista Controlador (MVC), esta arquitectura nos permite que la lógica de negocio (el código que realiza la acción en sí), se encuentre encapsulado en una parte de nuestra aplicación que se dedica específicamente al tratamiento de datos, gestión de bases de datos, etc. Los controladores.

Vamos a ponernos en la situación anterior.

Queremos obtener el usuario 343 de nuestra base de datos y para ello necesitamos acceder a nuestra base de datos y obtener los datos del mismo.

Nuestro controlador tendría un código similar a este:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;

class UserController extends Controller
{
    public function show($id)
    {
        return view('user.profile', [
            'user' => User::findOrFail($id)
        ]);
    }
}

Como habréis podido observar, hemos tenido que hacer una inclusión del modelo User (os hablo de los modelos en el capítulo 3 de esta saga).

Después, tenemos un método llamado show() y dentro de este método hacemos una llamada a la vista user.profile pasándole como parámetro el usuario que se ha encontrado al lanzar el método findOrFail()

¿Pero como ha llegado hasta aquí el valor de $id?

Pues no es tan difícil como creéis, basta con realizar una llamada al método del controlador y automáticamente Laravel sabrá que el valor de la variable obtenida a través de la llamada GET del navegador, corresponde a $id.

Eso sí, la variable tiene que llamarse exactamente igual al valor descrito entre corchetes en la declaración de la ruta.

Así se vería esta línea en routes/web.php:

use App\Http\Controllers\UserController;

Route::get('/user/{id}', [UserController::class, 'show']);

Como podéis ver en el ejemplo, hemos tenido que hacer un use del controlador de nuestra aplicación (UserController), ya que si no, la aplicación no sabrá dónde encontrar ese objeto.

Por otra parte, el método get de la clase Route, debe aceptar como parámetro la clase y el método al que se hace referencia.

Este último ejemplo de la aplicación ha sido obtenidos de la documentación oficial de Laravel en inglés.

Ansiosos de ver cómo sigue la saga…¡toca esperar!

¡Nos vemos en el siguiente fragmento de código!

Escrito originalmente por: Juan José Ramos

Imagen de Daniel Primo

Daniel Primo

CEO en pantuflas de Web Reactiva. Programador y formador en tecnologías que cambian el mundo y a las personas. @delineas en twitter y canal @webreactiva en telegram

12 recursos para developers cada domingo en tu bandeja de entrada

Además de una skill práctica bien explicada, trucos para mejorar tu futuro profesional y una pizquita de humor útil para el resto de la semana. Gratis.