Ir al contenido
Bondry

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.

  1. 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.
  2. 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.
  3. Un módulo roto nunca tumba el sitio. El arranque es resistente: un módulo que falla se salta y el sitio sigue sirviendo.
  4. Un módulo trae sus propios archivos de idioma. Viven en modules/<slug>/resources/lang y se cargan con un espacio de nombres (slug::archivo.clave). Nada va a los archivos de idioma del core.
  5. Nunca una clave foránea entre módulos. Un módulo se puede desinstalar mientras otro está corriendo.
  6. 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.
  7. 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.meta y 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#