Saltar a contenido

Controladores

Los controladores son el lugar perfecto para definir la lógica de negocio de nuestra aplicación o sitio web. Hace de intermediario entre la vista (lo que vemos con nuestro navegador o cliente) y el servidor donde la app está alojada.

Por defecto, los controladores se guardan en una carpeta específica situada en app/Http/Controllers y tienen extensión .php.

Creación

Para crear un controlador nuevo debemos hacer uso de nuestro querido autómata artisan donde le diremos que cree un controlador con el nombre que nosotros queramos.

Abrimos la consola y nos situamos en la raíz de nuestro proyecto

php artisan make:controller PagesController
Si todo ha salido bien, recibiremos un mensaje por consola con que todo ha ido bien y podremos comprobar que, efectivamente se ha creado el archivo PagesController.php con una estructura básica de controlador, dentro de la carpeta Controllers que hemos descrito anteriormente.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PagesController extends Controller
{
    //
}

Este controlador hereda de la clase base Controller, lo que nos permitirá ir añadiendo métodos personalizados para gestionar las distintas vistas o acciones que nuestra aplicación necesite.

Uso

Ahora podemos modificar nuestro archivo de rutas web.pbp para dejarlo limpio de lógica y trasladar ésta a nuestro nuevo controlador. La idea de ésto es dejar el archivo web.php tan limpio como podamos para que, de un vistazo, se entienda todo perfectamente.

Info

Sólo movemos la lógica, mientras que las cláusulas como where y name las seguimos dejando en el archivo de rutas web.php

Veamos cómo quedaría un refactor del archivo de rutas utilizando un Controller como el que acabamos de crear:

web.php
<?php

use App\Http\Controllers\PagesController;
use Illuminate\Support\Facades\Route;

Route::get('/', [ PagesController::class, 'inicio' ]);
Route::get('datos', [ PagesController::class, 'datos' ]);
Route::get('cliente/{id?}', [ PagesController::class, 'cliente' ]) -> where('id', '[0-9]+');
Route::get('nosotros/{nosotros?}', [ PagesController::class, 'nosotros']) -> name('nosotros');

y en nuestro archivo controlador lo dejaríamos de la siguiente manera

PagesController.php
<?php

namespace App\Http\Controllers;

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

    public function datos() { 
        return view('usuarios', ['id' => 56]);
    }

    public function cliente($id = 1) {
        return ('Cliente con el id: ' . $id);
    }

    public function nosotros($nombre = null) {
        $equipo = [
            'Paco',
            'Enrique',
            'Maria',
            'Veronica'
        ];

        return view('nosotros', @compact('equipo', 'nombre'));
    }
}

Controladores resource

Un controlador resource en Laravel es un tipo especial de controlador que sigue una convención estándar para gestionar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) sobre un recurso determinado. Al crear un controlador resource, Laravel define de forma anticipada una serie de métodos que representan las acciones más comunes sobre un recurso (como un modelo o entidad). Estos métodos son:

  • index() – Mostrar un listado del recurso.
  • create() – Mostrar el formulario para crear un nuevo recurso.
  • store() – Almacenar un nuevo recurso en la base de datos.
  • show($id) – Mostrar un recurso específico.
  • edit($id) – Mostrar el formulario para editar un recurso existente.
  • update(Request $request, $id) – Actualizar un recurso en la base de datos.
  • destroy($id) – Eliminar un recurso.

Este enfoque ahorra tiempo y mantiene una estructura clara y coherente dentro del proyecto.

Laravel permite generar este tipo de controlador automáticamente mediante el comando make:controller con la opción --resource. Un ejemplo sería

php artisan make:controller PhotoController --resource

Este comando generará un controlador en app/Http/Controllers/PhotoController.php. El controlador contendrá un método para cada uno de los recursos disponibles. A continuación, puedes registrar una ruta de recursos que apunte al controlador:

<?php

use App\Http\Controllers\PhotoController;

Route::resource('photos', PhotoController::class);

Esta única declaración de ruta crea múltiples rutas para manejar una variedad de acciones en el recurso. El controlador generado ya tendrá métodos para cada una de estas acciones. Recuerda, siempre puedes obtener una visión rápida de las rutas de tu aplicación ejecutando el comando route:list de artisan.

Método URI Acción Nombre de la ruta
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy

No olvides consultar la documentación para profundizar más en los controladores de Laravel.

Actividades

  • 📝 AC 708 . (RA8 / CE8c CE8d CE8g / IC1 / 3p) - Genera el controlador de tareas para tu proyecto de listado de tareas iniciado en AC 705.

  • ⚓ AR 709. (RA8 / CE8c CE8d CE8g / IC1 / 3p) - Genera los controladores necesarios para la gestión de un blog. Estos deben incluir, al menos, usuario, categorías y post.

  • 🧪 PR 710. (RA8 / CE8c CE8d CE8g / IC2 / 5p) - Siguiendo con la solución de e-commerce, necesitas gestionar y crear todos los controladores que te puedan hacer falta a la hora de hacer uso de ella. Deja la parte de pago fuera, pues otro equipo hará su integración.

    Aprende de los grandes

    Date una vuelta por tu tienda favorita e imagina los controladores que se pueden estar usando. Una buena idea es la de ir mirando las rutas e intentar copiar su arquitectura. Recuerda que siempre debe haber alguien que la pueda administrar. Puede darse el caso que un controlador esté en el frontal y en la administración si hay tareas diferentes, por ejemplo uno pensado en mostrar información y el otro en la gestión.