Développer pour Bondry
Ce qu'est un module, ce qu'est un thème, et les règles qui valent pour les deux avant d'écrire une ligne.
Bondry est une application Laravel dotée d'un kernel qui charge les modules et les thèmes à l'exécution. Tout ce que vous construisez est un répertoire avec un manifeste, empaqueté en zip et installé depuis le panneau.
Les deux choses que vous pouvez construire#
| Artefact | Se trouve dans | Manifeste |
|---|---|---|
| Module | modules/<slug>/ |
module.json |
| Thème | themes/<slug>/ |
theme.json |
Un paquet de langue est un troisième type de paquet, mais il ne contient que
des fichiers de traduction et un language.json, et n'a besoin d'aucun code.
Les règles qui ne plient pas#
Elles sont imposées par le kernel, pas par convention. Un paquet qui les enfreint est refusé à l'installation.
- Un module ne possède que ses propres tables. Elles portent le préfixe
mod_<slug>_, les tirets devenant des tirets bas. Lire les données du core est permis ; créer, modifier ou supprimer quoi que ce soit en dehors de ce préfixe, non. - La désinstallation ne retire que le module. Elle supprime ses tables et ses enregistrements de migration. Le core n'est pas touché, donc une réinstallation repart de zéro.
- Un module cassé ne fait jamais tomber le site. Le démarrage est résilient : un module qui lève une erreur est ignoré et le site continue.
- Un module livre ses propres fichiers de langue. Ils vivent dans
modules/<slug>/resources/langet sont chargés sous un espace de noms (slug::fichier.cle). Rien ne va dans les fichiers de langue du core. - Jamais de clé étrangère entre modules. Un module peut être désinstallé pendant qu'un autre tourne.
- Aucune compilation chez l'acheteur. Le CSS et le JS sont livrés déjà compilés dans le paquet. C'est vous qui compilez, pas lui.
- Aucun script en ligne. Le produit applique une CSP stricte. Le comportement vit dans votre bundle JS.
Étendre sans toucher au core#
Deux mécanismes, et vous utiliserez les deux :
- Les événements pour le comportement. Le kernel et les modules émettent
des événements tels que l'inscription d'un membre ou la création d'un
message ; vous écoutez dans votre
boot(). - Les emplacements d'interface pour l'UI. Le core déclare des emplacements
(
admin.menu,profile.tabs,search.sources,head.metaet d'autres) et n'importe quel module peut les remplir.
Rien n'oblige à modifier un fichier du core, et un module qui en modifie un perdra sa modification à la prochaine mise à jour.
Protéger une intégration entre modules#
Un module ne sait jamais si un autre est installé. Demandez, ne supposez pas :
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')) {
// Proposez l'intégration seulement quand le LMS est là.
}
Où aller ensuite#
- Anatomie d'un module pour le dossier et le manifeste.
- Règles d'indépendance pour le détail derrière la liste ci-dessus.
- Routes, permissions et écrans d'administration pour brancher un module au panneau.
- Thèmes pour le contrat de thème.
- Empaquetage et format de version quand vous serez prêt à publier.