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.
También puede interesarte:
Configurar Laravel Sail para utilizar un MySql externo existente |
||
Añadir un comentarios:
Juan Carlos 25/05/2023 20:37:12Excelente 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. |