Link Search Menu Expand Document

5.9. Controladores

Los controladores son un elemento clave de la arquitectura MVC. En Laravel, los controladores funcionan exactamente igual que en las aplicaciones MVC hechas con PHP clásico.

Es decir: son los puntos de entrada a la aplicación desde el enrutador.

Los controladores deberían permanecer lo más sencillos posible: nada de accesos a la base de datos ni de generación de HTML. Esas acciones se derivarán a los modelos y las vistas. El controlador es un organizador del flujo de la aplicación: decide qué componente tiene que trabajar y el orden en el que lo debe hacer.

En esta sección, vamos a aprender a construir controladores con Laravel. Vas a ver que es algo extremadamente sencillo.

5.9.1. Cuatro cosas importantes sobre los controladores en Laravel

  1. Los controladores en Laravel siempre heredan de la clase Controller o de una subclase de Controller.

    class MiControlador extends Controller {
       ...
    }
    
  2. Su nombre debería escribirse en singular, CamelCase y terminando en la palabra Controller. Por ejemplo: UserController, LoginController, ArticleController

  3. Cada método del controlador debe terminar en un return. Lo que el método devuelva será convertido automáticamente en una HTTP response 200, es decir, en una respuesta válida http, excepto si es un array, en cuyo caso Laravel lo convertirá automáticamente en JSON (perfecto para responder a peticiones Ajax, como veremos más adelante).

  4. Si lo necesitas, puedes actuar sobre la HTTP response devolviendo algo como esto:

      return response('contenido', 201)
             ->header('mi-cabecera', 'contenido')
             ->header('otra-cabecera', 'más-contenido')
             ->cookie('mi-cookie', 'valor');
             (etc)
    

    (Pero no nos engañemos: no lo necesitarás hacer demasiado a menudo).

5.9.2. Tres formas de crear un controlador

Los controladores se pueden crear a mano: vas al directorio /app/http/controllers, creas allí un archivo vacío y empiezas a escribir código como una fiera.

Pero nadie lo hace así porque Artisan ya crea el esqueleto del archivo por ti. Así que es mejor que vayas a lo práctico: abre una consola en tu servidor web y ponte a escribir.

Forma 1. Crear un controlador vacío.

Por ejemplo, para crear un controlador para la tabla de usuarios:

   $ php artisan make:controller UserController

Forma 2. Crear un controlador de tipo resource.

Estos controladores se generan automáticamente con un andamiaje para construir recursos REST. Es decir, la clase ya llevará incorporados los métodos index(), create(), store(), show(), edit(), update() y destroy() del estándar REST.

(Si no sabes de qué estamos hablando, revisa la sección que dedicamos al enrutamiento en Laravel)

Para crear un controlador RESTful:

   $ php artisan make:controller UserController --resource

No te olvides de añadir al enrutador (/routes/web.php) las rutas REST para este tipo controlador. Te recuerdo que se pueden resumir las siete rutas en esta sola entrada del enrutador:

   Route::resource('nombreRecurso', 'controlador');

En nuestro ejemplo:

   Route::resource('usuarios', 'UserController');

Forma 3. Crear un controlador tipo API.

Una API (Application Programming Interface) es un interfaz entre programas. Es decir, es la forma en la que unos programas interaccionan con otros.

Algunas aplicaciones web se diseñan para que otros programas las utilicen, no para que las utilicen seres humanos. En estos casos, el interfaz de usuario no existe (o es mínimo) y lo importante es el API. Y los métodos del controlador no devuelven vistas, sino datos formateados en JSON.

Se puede construir con Laravel un controlador tipo API de forma muy simple, porque es parecido a un resource, pero sin create() ni edit(), porque una API no necesita mostrar los formularios de inserción/modificación.

   $ php artisan make:controller UserController --api

De nuevo, no te olvides de las entradas en el enrutador. Puedes englobarlas todas en una sola entrada con este aspecto:

   Route::apiResource('usuarios', 'UserController');