Enrutamientos en Laravel

Vamos a comenzar a trabajar con los enrutamientos en Laravel. Con esto ya vamos a ir pudiendo hacer nuestras webs estáticas, de modo que a ir empezando a tener resultados.

Ciclo de vida de una petición

Cuando Laravel recibe una petición el archivo public/index.php se ejecuta y hace varias acciones:

  • cargar el archivo vendor/autoload.php para cargar las dependencias
  • cargar el archivo boostrap/app.php
  • Crea un kernel para manejar las peticiones entrantes, las envía en a la aplicación y vuelve a cerrar el kernel

Rutas básicas

Las rutas se encuentran en routes/web.php, aquí es donde tenemos todas las rutas, para poder comenzar a trabajar con él podemos eliminar todo lo que contiene y comenzar a crear nuestras rutas.

Cuando Laravel recibe una petición observa el método de la peticion, por medio de un verbo HTTP:

  • GET
  • POST
  • DELETE
  • PATH

También comprueba cual es la URI de la petición.

Una vez que tenemos esto ya podemos crear nuestra ruta según el siguiente ejemplo:

Route::verboHTTP('URI', funcion_a_ejecutar);

Y un ejemplo simple para acceder a la página de inicio

Route::get('/', function(){
    return "hola laravel";
});
Route::get('contacto', function(){
    return "contacto";
});

Esto lo que hace es que si introducimos nuestra ruta public aparece hola Laravel y si introducimos public/contacto aparece contacto.

Esto es muy interesante y seguramente ya estarás pensando en devolver una cadena con el  HTML, no esperaba menos, pero no es la mejor forma de trabajar en Laravel como veremos un poco más adelante…

Pasando parámetros por medio de una ruta

Podemos pasar parámetros por medio de las rutas, como ids, nombres… de forma muy sencilla, tal y como vemos a continuación:

Route::get('/usuario/{nombre}', function($nombre){
	return $nombre;
});

Vemos que el parámetro viene envuelto en llaves simples, cuando Laravel ve esto entiende como un parámetro, lo captura y lo envía al manejador.

En la función solo tenemos que añadir un parámetro y como vemos en el ejemplo usarlo de forma normal en PHP.

Si ejecutamos el ejemplo anterior vemos que al introducir nuestra ruta public/usuario/maría, nos devuelve maría, o cualquier nombre que pongamos.

Pero estos parámetros no tienen que ser obligatorios, pueden ser opcionales, para ello simplemente hay que colocar una ? entre el parámetro y la llave de cierre, y como buena práctica hay que asegurarse de que se le añade un valor predeterminado al parámetro para evitar errores en nuestra aplicación, de este modo podemos hacer los siguiente:

Route::get('/usuario/{nombre?}', function($nombre='no hay ningun nombre'){
	return $nombre;
});

Aquí le decimos a la ruta que nombre es opcional y que si no tiene ningún parámetro tome por defecto «no hay ningún nombre»

Es más, se pueden usar expresiones regulares dentro de nuestros parámetros, para ello tenemos que utilizar el método where después de la ruta de la siguiente forma:

Route::get('/usuario/{nombre?}', function($nombre='no hay ningun nombre'){
	return $nombre;
})->where('nombre', '[a-z]+');

Vemos que where tiene dos parámetros, uno de ellos es la ruta a la que se va aplicar y el segundo la expresión regular. En nuestro caso solo letras minúsculas.

En caso de que el parámetro no se cumpla aparece una página de 404 informando de que no existe la URI, página que como veremos se puede personalizar.

Utilizando diferentes verbos HTTP

En ocasiones puede ser interesante que una misma ruta pueda ser activada utilizando diferentes verbos como GET y POST, (algo que yo he hecho a menudo en las webs a medida) y que puede resultar muy interesante de trabajar.

Rutas utilizando Controladores

La forma de crear rutas que hemos visto hasta ahora, funciona, pero no es la mejor forma de utilizar los enrutamientos en laravel, ya que ensucian mucho el código y lo hacen poco entendible, por lo que podemos usar los controllers, que son clases de php con métodos que podemos enrutar.

De esta forma podemos separar la lógica de las rutas.

Los controladores se encuentran en app/Http/Controllers, donde podemos crear archivos o carpetas, aunque de momento vamos a ir viendo cómo funciona.

El archivo controller.php contiene la importación de las clases que necesita y la clase que hereda de BaseController. Esto es lo básico para que un controlador funcione por lo que todos nuestros controladores necesitarán tener estas líneas de código.

Dentro de la carpeta Auth vemos que hay una serie de archivos que son los que se encargan de la autorización de usuarios en nuestro sitio.

Una vez que hemos visto esto vamos a crear nuestros controladores, para ello podemos hacerlo manualmente copiando el código del archivo controller.php

Después de esto ya podemos introducir nuestras funciones, por ejemplo así:

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;

class HomeController extends BaseController
{
    public function inicio(){
    	return "Hola Laravel";
    }
}

Una vez que tenemos esto nos vamos al archivo de rutas y creamos nuestra ruta de la siguiente forma:

Route::get('/', 'HomeController@inicio');

Como podemos ver lo único que hemos hecho es cambiar la llamada a la función anónima por el controlador @ y el método que queremos utilizar.

También podemos crear nuestros controlares de forma más eficiente utilizando artisan en la consola, por medio de la siguiente instrucción en el directorio principal del proyecto.

php artisan make:controller PagesController

Esto nos ha creado un controlador llamado PagesController en app/Http/controllers llamado PagesController con todo lo necesario para funcionar.

Crear la estructura web

Las vistas de la web se encuentran dentro de la carpeta resources/views.

Si queremos que laravel nos cargue una vista tenemos que utilizar el controlador de la siguiente manera, y siguiendo con el ejemplo anterior… dentro de HomeController.php, tenemos que añadir nuestra función de inicio y en ella decirle que nos cargue la vista que queremos:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    public function inicio(){
    	return view('welcome');
    }
}

Esto se puede hacer en otros controladores que hayamos credo previamente como por ejemplo el de PagesController, quedando PagesConroller@inicio en lugar de HomeController@inicio.

De esta forma podemos crear los enrutamientos que queramos tal y como vemos a continuacion:

Archivo de rutas:

<?php 
Route::get('/', 'HomeController@inicio');
Route::get('/contacto/{nombre}', 'PagesController@contacto');
Route::get('/sobre', 'PagesController@sobremi');

Archivo PagesController (puede ser otro según nuestro caso):

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;

class PagesController extends Controller
{
    public function contacto($nombre){
    	return "Hola $nombre";
    }

    public function sobremi(){
    	return "Hola soy Miguel";
    }
}

Como vemos, podemos seguir introduciendo los parámetros, expresiones regulares… que queramos de forma bastante sencilla e incluso cargar las vistas que queramos y que deberemos de haber creado previamente, pero eso lo veremos próximamente.

Esta es la forma de crear estructructuras web y enrutamientos en Laravel.