Desarrollar para Bondry
Qué es un módulo, qué es un tema, y las reglas que valen para ambos antes de escribir una línea.
Bondry es una aplicación Laravel con un kernel que carga módulos y temas en tiempo de ejecución. Todo lo que construyes es un directorio con un manifiesto, empaquetado en un zip e instalado desde el panel.
Las dos cosas que puedes construir#
| Artefacto | Vive en | Manifiesto |
|---|---|---|
| Módulo | modules/<slug>/ |
module.json |
| Tema | themes/<slug>/ |
theme.json |
Un paquete de idioma es un tercer tipo de paquete, pero solo lleva archivos de
traducción y un language.json, y no necesita código.
Las reglas que no se doblan#
Las impone el kernel, no la costumbre. Un paquete que las rompe se rechaza al instalar.
- Un módulo es dueño solo de sus tablas. Llevan el prefijo
mod_<slug>_, con los guiones convertidos en guiones bajos. Leer datos del core está permitido; crear, alterar o borrar algo fuera de ese prefijo, no. - Desinstalar quita solo el módulo. Borra sus tablas y sus registros de migración. El core queda intacto, así que reinstalar empieza de cero.
- Un módulo roto nunca tumba el sitio. El arranque es resistente: un módulo que falla se salta y el sitio sigue sirviendo.
- Un módulo trae sus propios archivos de idioma. Viven en
modules/<slug>/resources/langy se cargan con un espacio de nombres (slug::archivo.clave). Nada va a los archivos de idioma del core. - Nunca una clave foránea entre módulos. Un módulo se puede desinstalar mientras otro está corriendo.
- Ninguna compilación en el host del comprador. El CSS y el JS van ya compilados dentro del paquete. Quien compila eres tú, no él.
- Ningún script en línea. El producto corre con una CSP estricta. El comportamiento vive en tu archivo JS empaquetado.
Extender sin tocar el core#
Dos mecanismos, y vas a usar los dos:
- Eventos para el comportamiento. El kernel y los módulos lanzan eventos
como el registro de un miembro o la creación de una entrada; tú escuchas en
tu
boot(). - Slots de interfaz para la UI. El core declara slots (
admin.menu,profile.tabs,search.sources,head.metay otros) y cualquier módulo puede rellenarlos.
Nada exige editar un archivo del core, y un módulo que edite uno perderá el cambio en el siguiente update.
Proteger una integración entre módulos#
Un módulo nunca sabe si otro está instalado. Pregunta, no supongas:
PHP
if (class_exists(\App\Support\Breadcrumbs::class)) {
\App\Support\Breadcrumbs::push(__('directory::labels.title'), route('directory.index'));
}
if (\Illuminate\Support\Facades\Route::has('lms.catalog')) {
// Ofrece la integración solo cuando el LMS esté ahí.
}
A dónde ir ahora#
- Anatomía de un módulo para la carpeta y el manifiesto.
- Reglas de independencia para el detalle detrás de la lista de arriba.
- Rutas, permisos y pantallas de administración para conectar un módulo al panel.
- Temas para el contrato de tema.
- Empaquetado y formato de versión cuando estés listo para publicar.