Rutas

Las rutas de nuestra aplicación aplicación se tienen que definir en el fichero routes/web.php. Este es el punto centralizado para la definición de rutas y cualquier ruta no definida en este fichero no será válida, generado una excepción (lo que devolverá un error 404).

Las rutas, en su forma más sencilla, pueden devolver directamente un valor desde el propio fichero de rutas, pero también podrán generar la llamada a una vista o a un controlador. Empezaremos viendo el primer tipo de rutas y en secciones posteriores se tratará como enlazarlas con una vista o con un controlador.

Rutas básicas

Las rutas, además de definir la URL de la petición, también indican el método con el cual se ha de hacer dicha petición. Los dos métodos más utilizados y que empezaremos viendo son las peticiones tipo GET y tipo POST. Por ejemplo, para definir una petición tipo GET tendríamos que añadir el siguiente código a nuestro fichero routes.php:

Route::get('/', function()
{
return '¡Hola mundo!';
});

Este código se lanzaría cuando se realice una petición tipo GET a la ruta raíz de nuestra aplicación. Si estamos trabajando en local esta ruta sería http://localhost pero cuando la web esté en producción se referiría al dominio principal, por ejemplo: http://www.dirección-de-tu-web.com. Es importante indicar que si se realiza una petición tipo POST o de otro tipo que no sea GET a dicha dirección se devolvería un error ya que esa ruta no está definida.

Para definir una ruta tipo POST se realizaría de la misma forma pero cambiando el verbo GET por POST:

Route::post('foo/bar', function()
{
return '¡Hola mundo!';
});

En este caso la ruta apuntaría a la dirección URL foo/bar (http://localhost/foo/bar o http://www.dirección-de-tu-web.com/foo/bar).

De la misma forma podemos definir rutas para peticiones tipo PUT o DELETE:

Route::put('foo/bar', function () {
//
});
Route::delete('foo/bar', function () {
//
});

Si queremos que una ruta se defina a la vez para varios verbos lo podemos hacer añadiendo un array con los tipos, de la siguiente forma:

Route::match(array('GET', 'POST'), '/', function()
{
return '¡Hola mundo!';
});

O para cualquier tipo de petición HTTP utilizando el método any:

Route::any('foo', function()
{
return '¡Hola mundo!';
});

Añadir parámetros a las rutas

Si queremos añadir parámetros a una ruta simplemente los tenemos que indicar entre llaves {} a continuación de la ruta, de la forma:

Route::get('user/{id}', function($id)
{
return 'User '.$id;
});

En este caso estamos definiendo la ruta /user/{id}, donde id es requerido y puede ser cualquier valor. En caso de no especificar ningún id se produciría un error. El parámetro se le pasará a la función, el cual se podrá utilizar (como veremos más adelante) para por ejemplo obtener datos de la base de datos, almacenar valores, etc.

También podemos indicar que un parámetro es opcional simplemente añadiendo el símbolo ? al final (y en este caso no daría error si no se realiza la petición con dicho parámetro):

Route::get('user/{name?}', function($name = null)
{
return $name;
});
// También podemos poner algún valor por defecto...
Route::get('user/{name?}', function($name = 'Javi')
{
return $name;
});

Laravel también permite el uso de expresiones regulares para validar los parámetros que se le pasan a una ruta. Por ejemplo, para validar que un parámetro esté formado solo por letras o solo por números:

Route::get('user/{name}', function($name)
{
//
})
->where('name', '[A-Za-z]+');
Route::get('user/{id}', function($id)
{
//
})
->where('id', '[0-9]+');
// Si hay varios parámetros podemos validarlos usando un array:
Route::get('user/{id}/{name}', function($id, $name)
{
//
})
->where(array('id' => '[0-9]+', 'name' => '[A-Za-z]+'))

Generar una ruta

Cuando queramos generar la URL hasta una ruta podemos utilizar el siguiente método:

$url = url('foo');

Con este método nos aseguraremos que la URL sea válida y además se le añadirá el dominio que tengamos definido en los ficheros de configuración. En general no será necesaria su utilización y simplemente podremos escribir la ruta a mano hasta una dirección de la forma: /foo (anteponiendo la barra / para asegurarnos que la ruta sea a partir de la raíz del dominio de nuestro sitio). Sin embargo se recomienda la utilización de este método en general para evitar problemas de generación de rutas no existentes o relativas (si se nos olvidase anteponer la /).

Checkpoint

A estas alturas ya tendríamos que ser capaces de crear una web con contenido estático, simplemente modificando el fichero de rutas y devolviendo todo el contenido desde aquí. Pero esto no es lo correcto porque terminaríamos con un fichero routes.php inmenso con todo el código mezclado en el mismo archivo. En las siguientes secciones vamos a ver como separar el código de las vistas y mas adelante añadiremos los controladores.