Publicidad

Rutas dinámicas en codeigniter 4


Por Alex el 04/04/2022, Comentar el artículo

Comparte este artículo:      




Como podemos extraer desde una base de datos las rutas de Codeigniter 4 y escribirlas en el fichero Routes.php, crear las rutas de forma dinámica ...


Para poder extraer las rutas de una tabla y añadirlas al fichero Routes.php necesitamos crearnos una librería con el código que acceda al modelo, con esto es suficiente para tener rutas dinámicas.

Primero creamos una tabla para las rutas, para el ejemplo:


CREATE TABLE `rutas` (
  `id` int NOT NULL,
  `name` varchar(100) NOT NULL,
  `icon` varchar(100) DEFAULT NULL,
  `slug` varchar(50) NOT NULL,
  `enabled` int NOT NULL DEFAULT '0',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Aquí lo importante es el campo name y el campo slug. Y ponéis las rutas que mas os gusten :-)

Ahora creamos el modelo y accedemos a la base de datos donde tenemos las rutas almacenadas:

namespace App\Models;

use CodeIgniter\Model;

class RutasModel extends Model
{
	function __construct()
        {
          parent::__construct();
         $this->db = db_connect( 'default');
        }


        private function ExecuteQueryResults( $sql)
	{

		$query = $this->db->query( $sql);
                $rows = $query->getResult();
                $query->freeResult();

              return ( $rows);
	}

	public function GetRoutes()
	{
		return( $this->ExecuteQueryResults(
                  "Select id, name, slug From rutas Where enabled = 1 Order by name asc"
                ));
	}

}

El modelo lo que hace es conectarse a la base de datos y una consulta para extraer las rutas, este método que extrae las rutas ahora lo llamaremos desde el controlador (RutasController.php) para pintarlas por pantalla y lo llamaremos tambien desde el fichero Routes.php para crear as rutas.


namespace App\Controllers;

class RutasController extends BaseController
{
    public function index()
    {

        $modelRutas = new \App\Models\RutasModel();

        echo "Rutas:

"; foreach ( $modelRutas->GetRoutes() as $row) { echo "".$row->name . "
"; } } public function customRoutes() { print_r( "
" . print_r( $this->request->uri->getSegments(), true) . "
"); } }
El controlador RutasController.php tiene dos métodos, el método index que es el punto de entrada de la aplicación y donde se crea un listado del menú de rutas. Ahora cambiamos la ruta en el fichero Routes.php para que cuando se acceda al web vaya directo a este método. Cambiamos este código:

$routes->get('/', 'Home::index');

Por este otro:

$routes->get('/', 'RutasController::index');

El segundo método customRoutes es donde se redirige la llamada de todas las url dinámicas.

Ahora creamo la clase que obtendra las rutas para escribirlas en el fichero Routes.php

Creamos en el directorio Libraries una clase que en el ejemplo he llamado CustomRoutes.php y dentro ponemos e siguiente código

namespace App\Libraries;

class CustomRoutes
{

  public function GetCustomRutes()
  {
     $modelPosts = new \App\Models\RutasModel();

     return( $modelPosts->GetRoutes());
  }

}

Este método devuelve un objecto con la lista de rutas y lo vamos a llamar desde el fichero Routes.php, en éste fichero, debajo del último cambio que hemos realizado escribimos el siguiente código:

$custom_lib = new \App\Libraries\CustomRoutes();

$routes = $custom_lib->GetCustomRutes();
foreach ( $routes as $s_route)
{
  $routes->get( $s_route->slug, 'RutasController::customRoutes');
}

Ahora para probarlo ejecutamos el servidor que tiene incorporado PHP en el directorio public

php -S 127.0.0.1:8000


He dejado el código completo del proyecto en Codeigniter en git:

https://github.com/depruebas/Rutas-dinamicas-CI4

Y esto es todo
Saludos, y feliz programming
Alex.



Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)

avatar

Juan Carlos 25/05/2023 20:37:12

Excelente aporte, yo lo complementaría con una tabla de permisos para asignar las rutas a cada rol de usuario o directamente a cada usuario, así tendríamos un sistema de listas de acceso mucho más dinámico. Saludos.




SIGUENOS EN

ARCHIVO

Publicidad

.