Search by

elouafidev / lcms-core

elouafidev

LCMS Core — Modular, extensible, and resilient Plugin-First Content Management System built on Laravel.

Package info

github.com/elouafidev/lcms-core

Type:project

pkg:composer/elouafidev/lcms-core

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2026-10-26 18:53 UTC

This package is auto-updated.

Last update: 2026-10-26 19:25:31 UTC


README

LCMS Core Banner

Système de gestion de contenu modulaire, extensible et résilient, fondé sur un noyau minimaliste Laravel et une architecture découplée pilotée par des contrats publics.

Packagist Version PHP Version Laravel Version Tests PHPStan Level 8 Code Style License

📖 À Propos de LCMS Core

Contrairement aux CMS traditionnels qui intègrent nativement des modèles de données rigides (pages, articles, médiathèque, formulaires ou commerce électronique en dur dans le noyau), LCMS Core implémente une séparation architecturale radicale :

  1. Noyau Minimal (Lean Core) : Le noyau (app/Core/) ne contient aucune logique métier. Il assure exclusivement les services d'infrastructure : authentification racine, découverte d'extensions, validation de manifestes, résolution topologique des dépendances, bus d'interception (Hooks), tolérance aux crashs et layout d'administration unifié.
  2. Contrats Publics Stricts (app/Core/Contracts/) : Les extensions ne communiquent jamais directement entre leurs implémentations privées. Tout échange s'opère via des contrats immuables et le conteneur IoC de Laravel.
  3. Écosystème de Plugins Autonomes (platform/plugins/) : Chaque fonctionnalité métier (pages statiques, arborescences de navigation, médiathèque, méta-tags SEO) est portée par une extension indépendante possédant ses propres routes, contrôleurs, vues Blade, permissions et migrations isolées.
  4. Moteur de Thèmes Découplé (platform/themes/) : Système de présentation autonome capable de surcharger dynamiquement (View Overriding) les templates des plugins sans toucher à leur code source.

🚀 Fonctionnalités Clés

  • 🧩 Architecture 100% Modulaire : Activez, désactivez ou supprimez des fonctionnalités sans altérer le noyau.
  • 📐 Résolution Topologique des Dépendances (Algorithme de Kahn) : Ordonnancement déterministe au démarrage, détection préventive des cycles (CircularDependencyException) et gardes de dépendances inverses pour interdire les désactivations en cascade non confirmées.
  • 🧯 Résilience & Tolérance aux Pannes :
    • Mise en Quarantaine Automatique : Si une extension déclenche une exception fatale au boot, elle est isolée en base (cms_plugin_errors) sans bloquer le reste de l'application.
    • Mode de Secours (Emergency Safe Mode) : Bypass immédiat de toutes les extensions tierces via drapeau fichier ou commande CLI (cms:recovery:safe-mode --on) pour restaurer l'accès administrateur en cas d'urgence.
  • 📦 Installation Sécurisée d'Extensions ZIP : Import direct depuis le tableau de bord avec protection stricte contre le Zip Slip, rejet des extensions exécutables interdites (.exe, .sh, .phar, etc.), extraction sandboxée et validation de schéma JSON.
  • 🪝 Bus de Hooks Extensible : Système d'actions et de filtres priorisés (Hook::action(), Hook::filter()) pour personnaliser le comportement du CMS sans modifier le code source.
  • 🎨 Moteur de Thèmes & Surcharge Blade : Thème de référence default-modern responsive avec surcharge hiérarchique des vues de plugins (platform/themes/{theme}/views/plugins/{plugin-id}/*).
  • 🖥️ Panneau d'Administration Unifié & Ergonomique : Interface moderne basée sur AdminLTE 4 et Tailwind CSS avec barre latérale sombre (#050914), header harmonisé, et layout canonique (core::admin.layouts.app) assurant l'affichage permanent et inaltérable de la barre latérale (admin-sidebar) sur l'ensemble des modules d'administration.
  • 🌐 Internationalisation & Multilingue (i18n) : Prise en charge native du français (fr) et de l'anglais (en), sélecteur de langue dynamique en front et dans le panneau d'administration, architecture de localisation JSON centralisée (lang/fr.json).
  • 💾 Propriété Stricte des Données : Migrations isolées par extension avec journalisation dédiée (cms_plugin_migrations). La désactivation conserve les tables ; la désinstallation propose une purge optionnelle et explicite.

📸 Aperçu du Panneau d'Administration

LCMS Core offre une interface d'administration épurée, responsive et cohérente, facilitant la supervision globale des extensions et des thèmes :

🧩 Gestion et Cycle de Vie des Extensions (Plugins)

Supervision en temps réel des extensions, activation/désactivation sécurisée, résolution des dépendances et téléversement d'archives ZIP.

LCMS Core - Gestion des Extensions

🎨 Gestion et Activation des Thèmes

Activation instantanée du thème de rendu public, prévisualisation, gestion des métadonnées et surcharge automatique des vues Blade.

LCMS Core - Gestion des Thèmes

🏛️ Architecture du Système

flowchart TD
    subgraph Client["Navigateur / Client HTTP"]
        UI["Interface Front & Panneau d'Administration"]
    end

    subgraph Core["LCMS Core (app/Core)"]
        Kernel["Démarrage & Cycle de Vie"]
        Registry["PluginRegistry & ThemeManager"]
        Resolver["DependencyResolver (Kahn)"]
        Hooks["Bus de Hooks (Actions & Filtres)"]
        SafeMode["Safe Mode & Quarantaine"]
        AdminLayout["Layout Unifié & NavigationRegistry"]
    end

    subgraph Contracts["Contrats Publics (app/Core/Contracts)"]
        PluginContract["PluginInterface"]
        ManifestContract["PluginManifestInterface"]
        ThemeContract["ThemeInterface"]
        StorageContract["MediaStorageInterface"]
    end

    subgraph Plugins["Extensions Autonomes (platform/plugins)"]
        Pages["lcmscore.pages (Pages & Routage)"]
        Menus["lcmscore.menus (Menus & Directive @menu)"]
        Media["lcmscore.media-library (Médiathèque)"]
        SEO["lcmscore.seo (Méta-tags & Hook cms.head)"]
    end

    subgraph Themes["Moteur de Présentation (platform/themes)"]
        DefaultTheme["default-modern (Layouts & View Overrides)"]
    end

    UI --> Kernel
    Kernel --> Registry
    Registry --> Resolver
    Resolver --> Hooks
    Registry --> SafeMode
    Registry --> AdminLayout

    Core -.-> Contracts
    Plugins --> Contracts
    Themes --> Contracts
    Themes -.->|View Overriding| Plugins
Loading

📦 Extensions & Thèmes Fournis

Identifiant Rôle & Fonctionnalités Contrats & Hooks
lcmscore.pages Gestion des pages statiques avec slugs personnalisés, publication/brouillon et routes dynamiques /page/{slug}. PluginInterface
lcmscore.menus Gestion hiérarchique des éléments de navigation, directive Blade @menu('main-nav') et filtre cms.menu. PluginInterface, HookSubscriberInterface
lcmscore.media-library Stockage et organisation des fichiers médias avec upload sécurisé et gestion des métadonnées. MediaStorageInterface
lcmscore.seo Optimisation pour moteurs de recherche, liens canoniques et métadonnées OpenGraph injectées via le filtre cms.head. HookSubscriberInterface
default-modern Thème responsive moderne avec typographie soignée, intégration fluide des menus, des pages et surcharge de templates de plugins. ThemeInterface

🛠️ Installation et Démarrage Rapide

Prérequis Système

  • PHP : ^8.2 ou ^8.3 avec extensions mbstring, xml, sqlite3, curl, zip.
  • Composer : 2.x.
  • Base de données : SQLite (par défaut pour le développement) ou PostgreSQL / MySQL.

Option 1 (Recommandée) : Créer un projet via Composer (Packagist)

Vous pouvez initialiser une nouvelle instance de LCMS Core en une seule commande grâce à Composer et Packagist :

composer create-project elouafidev/lcms-core mon-projet-lcms
cd mon-projet-lcms
php artisan serve

Tip

Ce que Composer exécute automatiquement pour vous :

  • Téléchargement du template et installation des dépendances PHP.
  • Création du fichier .env et génération de la clé de chiffrement APP_KEY.
  • Création du fichier de base de données SQLite database/database.sqlite.
  • Exécution automatique des migrations du noyau et des extensions initiales.
  • Seeding automatique du compte Super Administrateur racine.

Votre CMS est opérationnel instantanément sans configuration manuelle !

Option 2 : Cloner depuis GitHub

Initialisation Automatique

git clone https://github.com/elouafidev/lcms-core.git
cd lcms-core

# Routine complète (installation, .env, clé, migration, seed, build)
composer run setup

# Lancer le serveur local
php artisan serve

Initialisation Manuelle

git clone https://github.com/elouafidev/lcms-core.git
cd lcms-core

# Copier la configuration
cp .env.example .env

# Installer les dépendances backend
composer install

# Générer la clé de chiffrement
php artisan key:generate

# Exécuter les migrations de base de données
php artisan migrate

# Peupler la base de données avec le compte Super Administrateur
php artisan db:seed

# Installer et compiler les dépendances front-end (optionnel)
npm install && npm run build

# Démarrer le serveur local
php artisan serve

4. Démarrer le Serveur Local

php artisan serve

🔐 Identifiants par Défaut (Super Administrateur)

Le seeder du projet (database/seeders/UserSeeder.php) préconfigure un compte super administrateur racine avec les identifiants d'accès suivants :

Paramètre Valeur par défaut
URL de connexion http://localhost:8000/login ou http://localhost:8000/admin
Email admin@lcms.local
Mot de passe Password123!
Rôle / Droits SuperAdmin (accès complet aux modules d'administration, thèmes et extensions)

Tip

Si la base de données a été réinitialisée ou migrée sans seed, vous pouvez générer ou réinitialiser ce compte super administrateur à tout moment avec la commande :

php artisan db:seed --class=UserSeeder

💻 Référence des Commandes Artisan

LCMS Core fournit un ensemble complet de commandes CLI pour piloter les extensions, les thèmes et la résilience :

Gestion des Plugins (cms:plugin:*)

# Lister toutes les extensions et leur état
php artisan cms:plugin:list

# Activer et monter une extension
php artisan cms:plugin:enable lcmscore.pages

# Désactiver une extension (sans suppression de données)
php artisan cms:plugin:disable lcmscore.pages

# Publier les assets publics d'une extension vers public/vendor/plugins/
php artisan cms:plugin:publish-assets lcmscore.pages

# Exécuter les seeders d'une extension spécifique
php artisan cms:plugin:seed lcmscore.demo-hello

# Exécuter les seeders de toutes les extensions actives
php artisan cms:plugin:seed --all

Gestion des Thèmes (cms:theme:*)

# Lister les thèmes disponibles et identifier le thème actif
php artisan cms:theme:list

# Activer un thème pour le rendu public
php artisan cms:theme:activate default-modern

# Publier les assets d'un thème vers public/vendor/themes/
php artisan cms:theme:publish-assets default-modern

Mode de Récupération d'Urgence (cms:recovery:*)

# Activer le Safe Mode (désactive l'exécution de toutes les extensions tierces)
php artisan cms:recovery:safe-mode --on

# Désactiver le Safe Mode et restaurer le démarrage normal
php artisan cms:recovery:safe-mode --off

🧩 Anatomie d'un Plugin LCMS

Chaque plugin est logé dans son propre sous-dossier au sein de platform/plugins/{vendor}.{nom}/ et contient obligatoirement un manifeste immuable plugin.json :

{
  "id": "lcmscore.mon-plugin",
  "name": "Mon Extension Métier",
  "version": "1.0.0",
  "description": "Exemple d'extension autonome pour LCMS Core",
  "author": {
    "name": "LCMS Core Development Team",
    "email": "contact@lcmscore.test",
    "homepage": "https://lcmscore.test"
  },
  "compatibility": {
    "php": "^8.2",
    "lcms": "^1.0"
  },
  "autoload": {
    "psr-4": {
      "Plugins\\MonPlugin\\": "src/"
    }
  },
  "providers": [
    "Plugins\\MonPlugin\\Providers\\MonPluginServiceProvider"
  ],
  "dependencies": {
    "lcmscore.media-library": "^1.0"
  },
  "conflicts": [],
  "permissions": [
    {
      "key": "mon_plugin.manage",
      "label": "Gérer les fonctionnalités de Mon Plugin"
    }
  ],
  "routes": {
    "web": "routes/web.php",
    "api": "routes/api.php"
  }
}

Structure recommandée d'une extension :

platform/plugins/lcmscore.mon-plugin/
├── plugin.json                 # Manifeste validé obligatoirement
├── database/
│   └── migrations/             # Migrations isolées du plugin
├── resources/
│   └── views/                  # Vues Blade (surchargeables par le thème)
├── routes/
│   └── web.php                 # Routes montées uniquement à l'état ACTIVE
└── src/
    ├── Http/Controllers/       # Contrôleurs isolés
    ├── Models/                 # Modèles Eloquent du plugin
    └── Providers/              # ServiceProviders enregistrés au boot

🔒 Sécurité et Robustesse

Le projet applique les principes de défense en profondeur documentés dans nos modèles de menaces :

  • Prévention du Zip Slip & Attaques de Décompression : PluginZipInstaller contrôle chaque segment de chemin (.., séparateurs de lecteur, barres obliques absolues) et refuse catégoriquement l'extraction hors du bac à sable temporaire.
  • Filtrage des Fichiers Exécutables : Interdiction stricte de toute extension potentiellement dangereuse (.exe, .sh, .bat, .cmd, .phar, .phtml, etc.) dans les archives téléversées.
  • Protection Anti-Traversal sur les Manifestes : Les chemins de routes et d'autoloading déclarés dans plugin.json sont inspectés par ManifestValidator pour bloquer les tentatives de saut de répertoire.
  • Isolation d'Exécution : L'enregistrement des ServiceProvider des plugins est encapsulé dans une frontière de capture de fautes ; tout crash est capturé et le composant incriminé est consigné en quarantaine.
  • Authentification & Contrôles CSRF : Toutes les actions d'activation, de désactivation, de téléversement et de désinstallation d'extensions sont protégées par une authentification administrateur et un jeton CSRF.

🧪 Assurance Qualité & Tests

Le projet est couvert par une suite rigoureuse de 244 tests automatisés (1 427 assertions) sans aucun contournement :

# Exécuter l'intégralité de la suite de tests
composer test

# Lancer l'analyse statique au niveau maximal (Niveau 8)
composer run analyse

# Vérifier la conformité du style de code
composer run lint

# Formater automatiquement le code selon les standards Laravel
composer run format

📚 Documentation Technique

La documentation technique interactive officielle au format HTML est disponible dans le dossier docs/ :

  • 🌐 Portail de Documentation Technique Complète (docs/index.html) :
    • 🚀 Installation & Démarrage Rapide : Déploiement Packagist via composer create-project, configuration .env, gestion du compte Super Administrateur.
    • 🏛️ Architecture Globale : Philosophie Lean Core, Contrats Publics Stricts, ordonnancement topologique (Kahn), Bus de Hooks et Mode de Secours.
    • 🧩 Guide de Création de Plugins : Anatomie, manifeste plugin.json, migrations isolées, seeders automatiques et publication d'assets.
    • 🎨 Moteur de Thèmes : Système de présentation autonome et surcharge hiérarchique des vues Blade (View Overriding).
    • 💻 Référence Complète des Commandes Artisan : Tableau exhaustif des commandes CLI cms:*.

📄 Licence

Ce projet est distribué sous licence open-source MIT. Consultez le fichier LICENSE pour plus d'informations.