Lección 7 de 45 12 min de lectura

Controladores

Hasta ahora hemos puesto toda la lógica en las rutas, pero eso no escala. Los controladores te permiten organizar el código en clases dedicadas, siguiendo el patrón MVC.

¿Por qué usar controladores?

Imagina que tu archivo routes/web.php tiene 50 rutas, cada una con 20 líneas de lógica. Sería imposible de mantener. Los controladores resuelven esto agrupando la lógica relacionada en clases.

Crear un controlador

Usa Artisan para generar un controlador:

bash
php artisan make:controller UserController

Esto crea app/Http/Controllers/UserController.php:

php
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

class UserController extends Controller
{
    public function index(): string
    {
        return 'Lista de usuarios';
    }

    public function show(int $id): string
    {
        return "Usuario: $id";
    }
}

Conectar ruta con controlador

En routes/web.php, apunta la ruta al método del controlador:

php
use App\Http\Controllers\UserController;

Route::get('/usuarios', [UserController::class, 'index']);
Route::get('/usuarios/{id}', [UserController::class, 'show']);

La sintaxis es un array con la clase y el método como string.

Convenciones de nombres

Laravel usa estas convenciones para métodos de controlador:

  • index - Listar todos los recursos
  • show - Mostrar un recurso específico
  • create - Mostrar formulario de creación
  • store - Guardar nuevo recurso
  • edit - Mostrar formulario de edición
  • update - Actualizar recurso existente
  • destroy - Eliminar recurso

Controladores de un solo método

Si tu controlador solo tiene un método, usa __invoke:

php
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

class HomeController extends Controller
{
    public function __invoke(): string
    {
        return 'Página de inicio';
    }
}

En la ruta, no necesitas especificar el método:

php
Route::get('/', HomeController::class);
Cuándo usar __invoke

Usa controladores invocables para acciones únicas como la página de inicio, páginas estáticas o acciones que no encajan en un CRUD.

Parámetros en controladores

Los parámetros de la URL se inyectan automáticamente en los métodos:

php
// Ruta
Route::get('/posts/{id}/comments/{comment}', [PostController::class, 'showComment']);

// Controlador
public function showComment(int $id, int $comment): string
{
    return "Post $id, Comentario $comment";
}

Ejercicios

Ejercicio 1: Controlador básico

Crea un ProductController con un método index que devuelva "Lista de productos" y conéctalo a la ruta /productos.

Ver solución
// app/Http/Controllers/ProductController.php
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

class ProductController extends Controller
{
    public function index(): string
    {
        return 'Lista de productos';
    }
}

// routes/web.php
use App\Http\Controllers\ProductController;

Route::get('/productos', [ProductController::class, 'index']);

Ejercicio 2: Controlador con parámetro

Añade un método show al ProductController que reciba un int $id y devuelva "Producto: [id]". Conéctalo a /productos/{id}.

Ver solución
// En ProductController
public function show(int $id): string
{
    return "Producto: $id";
}

// routes/web.php
Route::get('/productos/{id}', [ProductController::class, 'show']);

Ejercicio 3: Controlador invocable

Crea un AboutController invocable que devuelva "Sobre nosotros" y conéctalo a /sobre.

Ver solución
// app/Http/Controllers/AboutController.php
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

class AboutController extends Controller
{
    public function __invoke(): string
    {
        return 'Sobre nosotros';
    }
}

// routes/web.php
use App\Http\Controllers\AboutController;

Route::get('/sobre', AboutController::class);

Resumen

En esta lección aprendiste:

  • Los controladores organizan la lógica fuera de las rutas
  • php artisan make:controller genera controladores
  • La sintaxis [Controller::class, 'method'] conecta rutas
  • __invoke para controladores de un solo método
  • Los parámetros de URL se inyectan automáticamente

En la siguiente lección aprenderás a trabajar con objetos Request y Response para manejar peticiones HTTP.

¿Te está gustando el curso?

Tenemos cursos premium con proyectos reales, soporte personalizado y certificado.

Descubrir cursos premium