imagen post

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étodoTipo de peticiónPropósito
index()GETMostrar listado de recursos
create()GETMostrar formulario de creación
store()POSTGuardar nuevo recurso
show()GETMostrar un recurso específico
edit()GETMostrar formulario de edición
update()PUT/PATCHActualizar un recurso existente
destroy()DELETEEliminar 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?