Aller au contenu principal
Version: Next

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êtes
  • twig : Moteur de template avec support de l'héritage et des composants
  • config : Gestion centralisée de la configuration
  • api : Création et gestion des endpoints REST API
  • postTypes : Déclaration et gestion des types de contenu personnalisés

Services d'administration

  • dashboard.widgets : Gestion des widgets du tableau de bord
  • dashboard.alerts : Système de notifications pour l'administration
  • plugins : Gestion des extensions et de leurs dépendances
  • roles : Gestion des rôles et des capacités utilisateurs

Services avancés

  • component : Système de composants réutilisables
  • templates : Gestion des templates avec remplacement de la hiérarchie WordPress
  • blocks : Création et gestion des blocs Gutenberg
  • flashbag : Messages flash pour les notifications utilisateur
  • editor.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é

  1. Créez une classe qui utilise le trait Singleton :
app/Service/MyService.php
<?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
    }
}
  1. Enregistrez le service dans le conteneur :
app/Controller/MyController.php
#[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 NAME pour référencer un service
  • Documentez vos services personnalisés avec PHPDoc

Exemple complet

app/Service/LoggerService.php
<?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");
    }
}
app/Controller/MyController.php
#[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');
}