Les services
Elementum propose une architecture basée sur des services qui simplifient l'accès aux fonctionnalités essentielles du framework. Ces services suivent le modèle d'inversion de contrôle (IoC) pour une meilleure gestion des dépendances.
Qu'est-ce qu'un service ?
Un service dans Elementum est une classe qui encapsule une fonctionnalité spécifique du framework. Il offre une interface claire pour interagir avec cette fonctionnalité de manière isolée et testable. Les services sont conçus pour être réutilisables.
Services disponibles
Elementum fournit plusieurs services prêts à l'emploi :
Services principaux
router: Gestion avancée du routage des requêtestwig: Moteur de template avec support de l'héritage et des composantsconfig: Gestion centralisée de la configurationapi: Création et gestion des endpoints REST APIpostTypes: Déclaration et gestion des types de contenu personnalisés
Services d'administration
dashboard.widgets: Gestion des widgets du tableau de borddashboard.alerts: Système de notifications pour l'administrationplugins: Gestion des extensions et de leurs dépendancesroles: Gestion des rôles et des capacités utilisateurs
Services avancés
component: Système de composants réutilisablestemplates: Gestion des templates avec remplacement de la hiérarchie WordPressblocks: Création et gestion des blocs Gutenbergflashbag: Messages flash pour les notifications utilisateureditor.colors: Gestion de la palette de couleur pour l'éditeur Gutenberg.
Utilisation des services
Dans les contrôleurs
Les contrôleurs d'Elementum disposent d'un accès simplifié aux services principaux via des méthodes dédiées :
use Elementum\Kernel\Service\Router; // Via le conteneur de services global $kernel; $router = $kernel->getService(Router::NAME);
Lister les services disponibles
global $kernel; $services = $kernel->container->getServices();
Créer un service personnalisé
- Créez une classe qui utilise le trait
Singleton:
<?php namespace App\Service; use Elementum\Trait\Singleton; use Elementum\Interfaces\ServiceInterface; class MyService implements ServiceInterface { use Singleton; public const NAME = 'my_service'; public function doSomething() { // Votre logique métier ici } }
- Enregistrez le service dans le conteneur :
#[Kernel('services')] public function registerServices(\Elementum\Container $container): void { $container->addService( MyService::NAME, [MyService::class, 'getInstance'], args: [], priority: 200 ); }
Gestion des priorités
La priorité détermine l'ordre d'exécution des services. Plus la valeur est élevée, plus le service sera exécuté tardivement. Elle est automatiquement gérée par le système de conteneur de services mais peut être ajustée si nécessaire.
Bonnes pratiques
- Utilisez toujours la constante
NAMEpour référencer un service - Documentez vos services personnalisés avec PHPDoc
Exemple complet
<?php namespace App\Service; use Elementum\Trait\Singleton; use Elementum\Interfaces\ServiceInterface; class LoggerService implements ServiceInterface { use Singleton; public const NAME = 'logger'; public function log(string $message, string $level = 'info'): void { // Implémentation de la journalisation error_log("[$level] $message"); } }
#[Kernel('services')] public function registerServices(\Elementum\Container $container): void { $container->addService( LoggerService::NAME, [LoggerService::class, 'getInstance'] ); } // Utilisation dans un contrôleur public function index() { $this->getService('logger')->log('Page d\'accueil chargée'); return $this->render('home.twig'); }