Laravel es un framework de código abierto basado en PHP, diseñado para facilitar el desarrollo de aplicaciones web. Su objetivo principal es permitir a los desarrolladores crear aplicaciones de manera rápida y eficiente, utilizando una sintaxis elegante y organizada.
Laravel se ha convertido en una opción popular entre los desarrolladores debido a su capacidad para simplificar el desarrollo de aplicaciones web, ofreciendo un entorno robusto y flexible.
En Laravel, las rutas definen qué debe responder tu aplicación cuando alguien visita una URL específica. Una ruta GET se usa para manejar peticiones HTTP de tipo GET (las típicas cuando visitas una página en el navegador).
🔹 Ejemplo básico de ruta GET que devuelve un string
En el archivo routes/web.php puedes escribir:
use Illuminate\Support\Facades\Route; Route::get('/hola', function () { return 'Hola, esta es mi primera ruta en Laravel!'; });
🔎 Qué ocurre aquí
Route::get('/hola', ...)
- Define una ruta accesible en la URL http://tu-app.test/hola.
- El método get indica que solo responderá a peticiones HTTP GET.
Closure (función anónima)
- Dentro de la función escribes lo que quieres devolver.
- En este caso, simplemente un string.
Respuesta
- Cuando visitas esa URL en el navegador, Laravel ejecuta la función y devuelve el texto como respuesta HTTP.
- No se carga ninguna vista Blade ni controlador, solo texto plano.
🔹 Otro ejemplo con variables en la URL
Route::get('/saludo/{nombre}', function ($nombre) { return "Hola, $nombre!"; });
- Si visitas http://tu-app.test/saludo/Marina, verás:Hola, Marina!
📝 Resumen
- Una ruta GET en Laravel se define en routes/web.php.
- Usa Route::get('url', function() { ... }).
- Puedes devolver un string, un JSON, o más adelante una vista.
- Es la forma más simple de probar que tu aplicación responde a las URLs.
En Laravel (y en la mayoría de frameworks), el orden de las rutas en web.php es importante porque el sistema de enrutamiento las evalúa de arriba hacia abajo y se queda con la primera coincidencia que encuentra.
🔹 Cómo funciona la resolución de rutas
- Laravel recorre las rutas en el orden en que están definidas.
- Cuando encuentra una coincidencia con la URL solicitada, detiene la búsqueda y ejecuta esa ruta.
- Si una ruta más genérica está definida antes que una más específica, puede “capturar” la petición y evitar que la ruta específica se ejecute.
🔹 Ejemplo práctico
// routes/web.php Route::get('/user/{id}', function ($id) { return "Usuario con ID: $id"; }); Route::get('/user/create', function () { return "Formulario para crear usuario"; });
👉 Si visitas /user/create, Laravel intentará primero la ruta /user/{id} porque está arriba, y tomará "create" como el parámetro {id}.
Resultado: "Usuario con ID: create" en lugar de mostrar el formulario.
✅ Solución
Coloca las rutas más específicas primero y las más genéricas después:
Route::get('/user/create', function () { return "Formulario para crear usuario"; }); Route::get('/user/{id}', function ($id) { return "Usuario con ID: $id"; });
Ahora /user/create funciona correctamente y /user/15 también.
🔹 Resumen
- Laravel evalúa las rutas en orden.
- La primera coincidencia se ejecuta y las demás se ignoran.
- Siempre define primero las rutas concretas y después las dinámicas.
- Esto evita conflictos y asegura que cada URL responda como esperas.
🔹 ¿Qué es un controlador en Laravel?
Un controlador es una clase que agrupa la lógica de tus rutas en métodos organizados.
En lugar de escribir funciones anónimas (closures) directamente en routes/web.php, se delega la lógica a un controlador, lo que hace el código más limpio, reutilizable y fácil de mantener.
🔹 Crear un controlador
Con Artisan puedes generar un controlador:
php artisan make:controller ProductController
Esto crea un archivo en app/Http/Controllers/ProductController.php.
🔹 Ejemplo de controlador
namespace App\Http\Controllers; use Illuminate\Http\Request; class ProductController extends Controller { // GET /products public function index() { return "Listado de productos"; } // GET /products/{id} public function show($id) { return "Mostrando producto con ID: $id"; } // GET /products/{id}/edit public function edit($id) { return "Formulario para editar producto $id"; } // POST /products public function store(Request $request) { return "Guardando nuevo producto"; } // PUT/PATCH /products/{id} public function update(Request $request, $id) { return "Actualizando producto $id"; } // DELETE /products/{id} public function destroy($id) { return "Eliminando producto $id"; } }
🔹 Cómo sustituye a las rutas con closures
En routes/web.php ya no necesitas escribir la lógica directamente:
// Antes (con closure) Route::get('/products', function () { return "Listado de productos"; }); // Después (con controlador) use App\Http\Controllers\ProductController; Route::get('/products', [ProductController::class, 'index']); Route::get('/products/{id}', [ProductController::class, 'show']); Route::post('/products', [ProductController::class, 'store']); Route::put('/products/{id}', [ProductController::class, 'update']); Route::delete('/products/{id}', [ProductController::class, 'destroy']);
🔹 Métodos típicos en un controlador RESTful
Laravel sigue la convención de resource controllers, que trabajan con distintos tipos de peticiones HTTP:
| Método | Tipo de petición | Propósito |
|---|---|---|
| index() | GET | Mostrar listado de recursos |
| create() | GET | Mostrar formulario de creación |
| store() | POST | Guardar nuevo recurso |
| show() | GET | Mostrar un recurso específico |
| edit() | GET | Mostrar formulario de edición |
| update() | PUT/PATCH | Actualizar un recurso existente |
| destroy() | DELETE | Eliminar un recurso |
🔹 Atajo con resource routes
Laravel puede generar todas estas rutas automáticamente:
Route::resource('products', ProductController::class);
Esto crea las 7 rutas RESTful (index, create, store, show, edit, update, destroy) de golpe.
Pero OJO, si ponemos ese ROUTE tenemos que tener todos los métodos en ProductController, sino fallará, la solución es utilizar __invoke()
✅ En resumen:
- Los controladores organizan la lógica fuera de web.php.
- Cada método corresponde a un tipo de petición HTTP.
- Puedes definir rutas manualmente o usar Route::resource para generar todas las rutas RESTful.
🔹 Método __invoke()
En PHP (y por extensión en Laravel), el método mágico __invoke() sirve para que una clase pueda ser llamada como si fuera una función.
🔹 Qué significa
- Normalmente, para usar una clase necesitas instanciarla y llamar a un método:$obj = new MiClase(); $obj->miMetodo();
- Si la clase tiene definido __invoke(), puedes llamarla directamente como si fuera una función:$obj = new MiClase(); $obj(); // ejecuta __invoke()
🔹 En Laravel
Laravel aprovecha __invoke() para los controladores de acción única (Single Action Controllers).
En lugar de tener varios métodos (index, show, store…), defines solo uno: __invoke().
Ejemplo
namespace App\Http\Controllers; use Illuminate\Http\Request; class ShowProductController extends Controller { public function __invoke($id) { return "Mostrando producto con ID: $id"; } }
Y en routes/web.php:
use App\Http\Controllers\ShowProductController; Route::get('/products/{id}', ShowProductController::class);
👉 Aquí no necesitas especificar el método ('show'), porque Laravel sabe que debe ejecutar __invoke().
🔹 Ventajas
- Simplicidad: ideal para controladores que solo tienen una acción.
- Legibilidad: la ruta apunta directamente a la clase, sin indicar método.
- Organización: evita llenar web.php con closures y mantiene la lógica en un controlador.
📝 Resumen
- __invoke() permite que una clase se use como función.
- En Laravel, se usa para controladores de acción única.
- La ruta apunta directamente a la clase, y Laravel ejecuta __invoke().
¿Quieres que te prepare un ejemplo comparativo entre un controlador multi‑acción y uno de acción única con __invoke() para que veas cuándo conviene usar cada uno?