viernes, 24 de octubre de 2014

Controladores RESTful

Sabemos que podemos definir verbos de peticiones HTTP que queramos asociar usando los métodos
de rutas. Esto es realmente conveniente a la hora de enrutar a Closures. No obstante, cuando
enrutamos a Controladores puede que quieras mantener la definición del verbo de la petición junto
a la lógica de tu aplicación. Bueno, las buenas noticias es que Laravel te ofrece esta configuración
alternativa.
Alteremos nuestro Controlador un poco, ¿vale?

<?php

// app/controllers/Articulo.php

namespace Blog\Controller;

use View;
use BaseController;

class Articulo extends BaseController
{
public function getCrear()
{
return View::make('crear');
}
16
17
public function postCrear()

{
18
// Gestionar el formulario de creacion
19
}
20
21
92
}
Aquí tenemos nuestro Controlador de Articulo una vez más. La intención de las acciones son
facilitar una forma de crear y gestionar la creación de un nuevo artículo del blog. Descubrirás que
los nombres de las acciones tienen como prefijo get y post . Esos son nuestros verbos HTTP.
Por tanto, en nuestro ejemplo podrías pensar que hemos representado puntos para las siguientes
URLs:
1
2
GET /crear
POST /crear
También podrías preguntarte cómo enrutamos hacia nuestro controlador RESTful. Como verás, usar
métodos de verbos en la clase Route no tendría mucho sentido. Bueno, di adios a enrutar acciones
individuales. Echemos un vistazo a otro método de enrutado.

<?php

// app/routes.php

Route::controller('Articulo', 'Blog\Controller\Articulo');

Este único método enrutará todas las acciones representada en nuestro controlador RESTFul.
Miremos con más detenimiento al método.
El primer parámetro es la URL base. Normalmente, el enrutado RESTful es usado para representar
un objeto por lo que, en la mayoría de las ocasiones, la URL base será el nombre de ese objeto. Puedes
pensar en ello como un prefijo de las acciones que hemos creado en nuestro controlador RESTful.
El segundo parámetro ya te será familiar. Es el controlador al que intentamos enrutar. Una vez más,
Laravel aceptará felizmente un controlador con un espacio de nombre como objetivo de la ruta por
lo que eres libre de organizar tus Controladores como quieras.
Como puedes ver, usar este método de enrutado a tus controladores, te ofrece una ventaja distinta
sobre el método de enrutado original. Con este método, solo tendrás que facilitar una única entrada
de enrutado para el controlador, en vez de enrutar cualquier acción de forma independiente.

Enrutado de Controlador


Los Controladores son bonitos y limpios y ofrecen una forma sencilla de agrupar lógica común.
No obstante, no son útiles a menos que nuestros usuarios puedan alcanzar esa lógica. por suerte, el
método para enlazar una URI a un Controlador es similar al método que usamos para las Closures.
Echemos un ojo.

<?php

// app/routes.php



Route::get('index', 'ArticuloController@mostrarIndex');
Para enlazar una URI a un Controlador, tenemos que definir una nueva ruta en el archivo
/app/routes.php . Estamos usando el mismo método Route::get() que utilizamos al usar Closures.
No obstante, el segundo parámetro es totalmente diferente. En esta ocasión tenemos una cadena.
La cadena consiste en dos secciones que están separadas por una arroba ( @ ). Echemos un ojo otra
vez al Controlador que creamos en la última sección.

Route::post('articulo/nuevo', 'ArticuloController@nuevoArticulo');

<?php

// app/routes.php

Route::post('index', 'Blog\Controller\Articulo@mostrarIndex');
Es igual que antes, solo que en esta ocasión el nombre del controlador ha sido prefijado con su
espacio de nombre. Como ves, ¡los espacios de nombre no tienen que complicar las cosas! Incluso
puedes almacenar tu controlador con espacio de nombre en un directorio anidado, o en cualquier
sitio con un esquema de carga PSR-0. A Laravel no le importa, mientras que Composer sepa dónde
encontrar tu clase, Laravel podrá usarla.

Controladores

El Controlador es una clase usada para alojar lógica de enrutado. Normalmente, el Controlador
contendrá un número de métodos públicos conocidos como acciones. Puedes pensar en las acciones
como la alternativa directa a las closures que usamos en el capítulo anterior, son muy similares tanto
en apariencia como en funcionalidad.

?php

// app/controllers/ArticuloController.php

class ArticuloController extends BaseController
{
public function mostrarIndex()
{
return View::make('index');
}

public function mostrarUnico($idArticulo)
{
return View::make('unico');
}

}

Puedes llamar al Controlador como quieras. Mientras este extienda a BaseController o Controller ,
Laravel sabrá lo que intentas hacer. No obstante, añadirle el sufijo Controller es algo estándar que
los programadores web usan. Si piensas trabajar con otros, los estándares pueden ser realmente
útiles.

Patrones de filtro

El patrón de filtros te permite hacer coincidir un filtro before a un número de rutas facilitando un
patrón de enrutado con un asterisco. Veámoslo en acción.

?php

// app/routes.php

Route::when('perfil/*', 'cumpleanos');
El método Route::when() de arriba, ejecutará el filtro cumpleanos en todas las rutas cuya URI
comiencen con perfil/ . El asterisco del primer parámetro actúa como comodín. Es una gran forma
de adjuntar un filtro before a varias rutas a la vez.

Parámetros de los filtros

Al igual que las funciones de PHP, los filtros pueden aceptar parámetros. Esta es una gran forma de
evitar repeticiones y que permite mayor flexibilidad. Vamos allá con un ejemplo, como siempre.

<?php

// app/filters.php

// before

Route::filter('test', function($ruta, $peticion)
{

// after

Route::filter('test', function($ruta, $peticion, $respuesta)
{

});

Filtros múltiples


Otra cosa que deberías saber es que puedes aplicar tantos filtros como quieras a una ruta. Echemos
un vistazo a algunos ejemplos en acción. Primero, añadamos varios filtros before :
1
<?php

// app/routes.php

Route::get('/', array(
'before' => 'cumpleanos|navidad',
function()
{
return View::make('hola');
}
));
Aquí hemos añadido los filtros tanto cumpleanos como navidad en el apartado before a la ruta.
Dejaré que tu imaginación decida lo que hace el filtro navidad , pero asegúrate de que sea algo
mágico.
El caracter | (tubería) puede ser usado para separar una lista de filtros. Serán ejecutados de izquierda
a derecha, y el primero que devuelva una respuesta terminará la petición y esa respuesta será
devuelta como resultado.
Si quieres, puedes usar una matriz para ofrecer varios filtros. Puede que eso te parezca más del estilo
php.

Si quieres, puedes usar una matriz para ofrecer varios filtros. Puede que eso te parezca más del estilo
php.

Route::get('/', array(
'before' => array('cumpleanos', 'navidad'),
function()
{
return View::make('hola');
}
));

<?php

// app/routes.php

Route::get('/', array(
'before'
=> 'cumpleanos',
'after'
=> 'navidad',
function()
{
return View::make('hola');
}
));

Filtros Básicos

Los filtros son ciertos conjuntos de reglas que pueden ser aplicados a una ruta. Pueden ser aplicados
antes o después de que se ejecute la lógica de una ruta. No obstante, descubrirás que los filtros que
se ejecutan antes son más útiles. Estos filtros pueden alterar el flujo de la aplicación si no se cumplen
una serie de reglas o criterios. Es una forma maravillosa de proteger nuestras rutas.

<?php

// app/filters.php

Route::filter('cumpleanos', function()
{
if (date('d/m') == '12/12') {
return View::make('cumpleanos');
}
});

Aquí tenemos nuestro primer filtro. Laravel nos da un archivo en app/filters.php como ubicación
genérica para nuestros filtros, pero podemos ponerlos donde queramos.
Usamos el método Route::filter() para crear un nuevo filtro. El primer parámetro es un nombre
amistoso que usaremos más tarde para aisgnar el filtro a una ruta. En este ejemplo he nombrado al
filtro cumpleanos . El segundo parámetro es un callback, que en este ejemplo es una Closure.
El callback es una función que es llamada cuando se ejecuta el filtro. Si devuelve un objeto de tipo
respuesta, como aquellos que usamos en la lógica de nuesutra ruta, la respuesta será devuelta y
servida en vez del resultado de la lógica de nuestra ruta. Si no hay respuesta desde el filtro, la lógica
de la ruta continuará normalmente.

<?php

// app/routes.php

Route::get('/', array(
'before' => 'cumpleanos',
function()
{
return View::make('hola');
}
));
Como puedes ver, hemos creado otra opción en nuestra matriz. El índice before le dice al framework
que queremos ejecutar nuestro filtro cumpleanos antes de que la lógica de la ruta sea ejecutada. El
valor cumpleanos es igual al apodo que le dimos a nuestro filtro.
Vamos a probar a ejecutar nuestra ruta / . Ahora, asumiendo que hoy no es el 12 de Diciembre, verás
la página de Laravel. Esto es porque la condición del filtro ha fallado y no se devuelve ninguna
respuesta.