Solución a error: Can’t find a route for – Codeigniter 4

En este post daremos algunas soluciones para el error «Can’t find a route for» en Codeigniter 4.

Este error es generado porque se requiere la configuración de las rutas para acceder a un método del controlador ya que a partir de la versión 4.2.0 del framework el enrutamiento automático está deshabilitado de forma predeterminada.

Para corregir este error tenemos tres opciones.

Solución 1

Esta solución es sencilla pero es Legacy, que quiere decir que está en desuso.

Consta de habilitar el enrutamiento automático. Abrimos el archivo app/Config/Routes.php, descomentamos la siguiente línea //$routes->setAutoRoute(false); y cambiar la configuración de la opción a true:

$routes->setAutoRoute(true);

Solución 2

A partir de la versión 4.2.0 del framework, se ha introducido el nuevo enrutamiento automático más seguro.

Para usarlo, debe cambiar la configuración de la opción setAutoRoute() a true en app/Config/Routes.php:

$routes->setAutoRoute(true);

Y debe cambiar la propiedad $autoRoutesImproved a true en app/Config/Feature.php:

public bool $autoRoutesImproved = true;

Como usarlo

Considere que el siguiente URI:

example.com/index.php/helloworld/

En el ejemplo anterior, CodeIgniter intentaría encontrar un controlador con nombre App\Controllers\Helloworld y cargarlo, cuando el enrutamiento automático está habilitado.

Cuando utiliza el enrutamiento automático, los nombres de clase del controlador deben comenzar con una letra mayúscula y sólo el primer carácter puede estar en mayúscula.

Un método de controlador que se ejecutará mediante enrutamiento automático (mejorado) necesita un prefijo de verbo HTTP ( get, post, put, etc.) como getIndex(), postCreate(), putUpdate().

Si usas este método, evita definir de forma manual alguna ruta del controlador sino te enviará el mensaje de error:

No se puede acceder al controlador en rutas definidas

Solución 3

Para esta solución se requiere definir cada ruta. Las reglas de enrutamiento se definen en el archivo app/Config/Routes.php en la sección de Route Definitions:

$routes->get('unidades', 'Unidades::index');

Con está configuración indicamos que al ingresar a la dirección de unidades llame al controlador Unidades y al método index().

Se deberán definir todas las rutas de las peticiones que se soliciten ya sean POST, GET u otras.

$routes->post('unidades/actualizar', 'Unidades::actualizar');

Recomendaciones

Se recomienda trabajar con la solución 3, que es definir cada enrutamiento ya que podemos agregar diferentes filtros y prevenir vulnerabilidades en nuestras aplicaciones.

La solución 2 también recomendable ya que es la versión mejorada del auto enrutamiento.

Material de apoyo

Enrutamiento URI en CodeIgniter 4: https://www.codeigniter.com/user_guide/incoming/routing.html