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