Ese 404 en Laravel que no esperabas: el orden de las rutas importa (y mucho)
Programación

Ese 404 en Laravel que no esperabas: el orden de las rutas importa (y mucho)

Hace poco me encontré con un problema curioso mientras implementaba un CRUD para categorías en mi blog hecho con Laravel. Todo funcionaba perfectamente: podía listar, editar y eliminar categorías… pero al intentar crear una nueva, el formulario me llevaba a un error 404. 🤯

¿Qué estaba pasando?

La ruta GET /categories/create funcionaba. El formulario se cargaba con su campo de nombre y el botón de “Crear”. Sin embargo, al hacer clic, la petición POST /categories devolvía un 404. Revisé el controlador, la vista, el formulario, el método... todo parecía correcto. Incluso php artisan route:list mostraba que la ruta estaba registrada:

POST  /categories  →  categories.store  →  CategoryController@store

El culpable: una ruta genérica mal ubicada

Tras muchas pruebas (inspeccionar la acción del formulario, revisar el token CSRF, limpiar caché, probar con cURL...), encontré al culpable: tenía esta ruta definida antes que las del recurso:

Route::get('{id}/{slug}', [PostController::class, 'show'])->name('posts.show');

Esta ruta está pensada para mostrar un post por su ID y slug. Pero al estar antes de Route::resource('categories', ...), Laravel la interpretaba como la primera coincidencia para cualquier ruta sin match exacto. /categories era una de ellas, por lo que la petición POST nunca llegaba a su destino legítimo.

La solución: respetar el orden de las rutas

La solución fue tan sencilla como mover la ruta genérica al final del archivo web.php:

// ✅ Primero las rutas específicas
Route::resource('categories', CategoryController::class);

// ✅ Luego las más genéricas
Route::get('{id}/{slug}', [PostController::class, 'show'])->name('posts.show');

Con eso, la creación de categorías funcionó como debía. El formulario ya no era interceptado y el CRUD quedó completo.

Lecciones aprendidas

  • Laravel evalúa las rutas en orden: la primera coincidencia que encaje con una URL es la que se ejecuta.
  • Las rutas genéricas deben ir al final: evita comodines amplios al principio del archivo.
  • Comandos como route:list o herramientas como cURL son clave: confirman si Laravel está escuchando donde tú crees.
  • Un error 404 no siempre es “falta la vista”: a veces es una colisión silenciosa en el enrutador.

Consejo final

Si estás trabajando con Route::resource, mantén tu archivo web.php ordenado. Agrupa rutas por funcionalidad, evita comodines tempranos y reserva las rutas genéricas como /{slug} o /{id} para el final.

“El orden de las rutas en Laravel no es solo cuestión de estética. Es cuestión de funcionamiento.”

Diego O.

Si esta historia te ha resultado útil, compártela. Quizás alguien más esté atrapado en un 404 que no le pertenece.

Hi, I'm Admin User

Soy Diego, el culpable de todo esto. Mezclo código con café y teorías económicas con bugs existenciales. Bienvenido al blog donde solo hay una instancia, pero muchas ideas.

Categories
Tags
ads

Descubre artículos únicos sobre desarrollo, tecnología, economía y más

Explora contenidos creados con pasión para ayudarte a crecer como desarrollador y emprendedor. ¡Gracias por formar parte de este proyecto!