Sistema de módulos en CodeIgniter 4

Observemos cómo montar un sistema de módulos/plugins en una aplicación creada con el FrameWork CodeIgniter 4.
Objetivo
Váis a desarrollar una aplicación con el FrameWork PHP CodeIgniter, y necesitáis ir ampliando vuestra aplicación con módulos. Por un lado, tener el core, y por otro, ir creando módulos para ir añadiéndolos sin tocar el core.
Veremos cómo hacer un sistema de módulos para ir ampliando tu aplicación en CodeIgniter 4.
Código
0. CodeIgniter
Si estáis leyendo este artículo, es que domináis CodeIgniter, o al menos lo conocéis. Ya que bien, sabréis que el árbol del FrameWork es:
/App/ .../Config/ .../Controllers/ .../Models/ .../Views/ ...etc /public/ /system/ /writable/
1. Creamos carpeta Modulos
Ya que nosotros, para nuestro sistema de módulos, vamos a hacer dentro de Aplicación, la carpeta Módulos.
/App/ .../Config/ .../Controllers/ .../Models/ .../Modulos/ .../Views/ ...etc /public/ /system/ /writable/
2. Registramos la carpeta
Una vez construida la carpeta donde iremos almacenando nuestros módulos, vamos a registrar las carpetas para que todo ande.
Deberemos cambiar el fichero Autoload.php de la carpeta /App/Config.
Buscáis la asignación de la variable $psr4, y le añadís la línea donde almacenáis vuestro módulo.
// Fichero /App/Config/Autoload.php public $psr4 = [ APP_NAMESPACE => APPPATH, // For custom app namespace 'Config' => APPPATH . 'Config', 'Modulos\Blog' => APPPATH. 'Modulos/Blog' ];
3. Modificamos Routes
Vamos complicando la cosa. En este momento toca cambiar el fichero /App/Config/Routes.php
En el final del fichero, añadimos el siguiente código. Fijaos que lo que hace es leer todos los Routes de todos los módulos que instalemos… De esta forma, cada módulo, en su carpeta, va a tener su Routes.php especial.
// Fichro /App/Config/Routes.php ... $modules_path = ROOTPATH . 'app/Modules/'; $modules = scandir($modules_path); foreach ($modules as $module) { if ($module === '.' || $module === '..') { continue; } if (is_dir($modules_path) . '/' . $module) { $routes_path = $modules_path . $module . '/Config/Routes.php'; if (file_exists($routes_path)) { require $routes_path; } else { continue; } } }
Después, lo veŕeis más claro cuando veáis la composición de nuestros módulos.
4. Composición Módulo
Observemos cómo estructuraremos todos nuestros módulos conformados.
/* Config */ /App/Modules/Blog/Config/Routes.php /* Controllers */ /App/Modules/Blog/Controllers/BlogController.php /* Models */ /App/Modules/Blog/Models/BlogModel.php /* Views */ /App/Modules/Blog/Views/blogView.php
Al fin y al cabo, es hacer la carpeta con nuestro Módulo, en el ejemplo Blog, y dentro las carpetas Config, Controllers, Models y Views.
5. Los archivos necesarios para el módulo
Y en este momento se encuentra? No. En este momento viene lo difícil, los namespace. Les coloco un caso de muestra muy simple de todos los archivos que les he comentado para que lo tengáis claro:
/App/Modules/Blog/Config/Routes.php
<?php namespace App\Modules\Blog\Models; use CodeIgniter\Model; class BlogModel extends Model { public function __construct() { parent::__construct(); } public function getEntrada($idioma, $id) { return ""; }
/App/Modules/Blog/Controllers/blogController.php
<?php echo "<p>Funciona: ". $text ."</p>"; ?>
Lógicamente, es un fácil ejemplo con todas las partes que puedes necesitar: config, controllers, models y views, pero que, el ejemplo en si, solo redacta un texto por pantalla.
Lo más relevante de estos, es que les quedéis con la composición del módulo, y sobretodo, en los namespace. Si no los declaráis de manera correcta, no les va a funcionar.
Así sólo debemos ir creando nuestros módulos e irlos agregando a la carpeta /App/Modules
Quisiera que les sea de herramienta.
Más información
Deja una respuesta
Artículos Relacionados