Aller au contenu

Services

ArtisanCMS utilise une architecture orientée services. Les 41 services situés dans app/Services/ encapsulent la logique métier et sont injectables via le conteneur de dépendances Laravel.

Tous les services sont enregistrés dans le conteneur IoC de Laravel. Injectez-les via le constructeur ou la méthode.

use App\Services\PageService;
class PageController extends Controller
{
public function __construct(private PageService $pageService) {}
public function show(string $slug)
{
$page = $this->pageService->findBySlug($slug);
return inertia('Pages/Show', compact('page'));
}
}

Injection par méthode dans les routes :

Route::get('/pages', function (PageService $pageService) {
return $pageService->getAllPublished();
});

Services de gestion du contenu éditorial.

ServiceDescription
PageServiceCRUD des pages, publication, révisions, duplication
PostServiceCRUD des articles de blog, catégorisation, tags
ContentTypeServiceGestion des types de contenu personnalisés
ContentSanitizerNettoyage et validation du HTML des contenus
DynamicContentServiceRésolution des contenus dynamiques (blocs conditionnels, personnalisation)

Services de gestion des utilisateurs et des rôles.

ServiceDescription
UserServiceCRUD des utilisateurs, recherche, filtrage
RoleServiceGestion des rôles et attribution des permissions
AvatarServiceGénération et gestion des avatars utilisateurs

Services de gestion de la bibliothèque de médias.

ServiceDescription
MediaServiceUpload, métadonnées, recherche de médias
ImageOptimizerConversion WebP, redimensionnement, compression
MediaFolderServiceOrganisation en dossiers de la bibliothèque
OrphanMediaDetectorServiceDétection des médias non utilisés
StockPhotoServiceIntégration avec les banques d’images externes

Services de personnalisation visuelle et structurelle du site.

ServiceDescription
DesignTokenServiceGestion des tokens de design (couleurs, polices, espacements)
BrandingServiceLogo, favicon, couleurs de marque
GlobalSectionServiceSections globales réutilisables (header, footer)
MenuServiceCréation et gestion des menus de navigation
TaxonomyServiceCatégories, tags et taxonomies personnalisées

Services d’organisation et de structuration du contenu.

ServiceDescription
BlockPatternServiceModèles de blocs prédéfinis réutilisables
CustomFieldServiceChamps personnalisés polymorphiques
PopupServiceGestion des popups et modales
WidgetServiceWidgets de la barre latérale et du footer

Services du tableau de bord et de l’administration.

ServiceDescription
DashboardServiceWidgets et données du tableau de bord
NotificationServiceNotifications système et utilisateur
ActivityLogServiceJournal d’activité (qui a fait quoi, quand)
CommentServiceGestion des commentaires et modération

Services de gestion des emails et newsletters.

ServiceDescription
EmailTemplateServiceTemplates d’emails personnalisables
NewsletterServiceGestion des abonnés et envoi de newsletters

Services techniques et d’infrastructure.

ServiceDescription
InstallerServiceLogique de l’assistant d’installation
TemplateServiceRésolution et rendu des templates
UpdateServiceVérification et installation des mises à jour
DatabaseConfiguratorConfiguration dynamique de la connexion BDD
HealthCheckServiceVérification de l’état du système (BDD, disque, queue)
ErrorRecoveryServiceMode dégradé et récupération après erreur
RequirementsCheckerVérification des prérequis système (PHP, extensions)

Services de suivi et d’analyse.

ServiceDescription
AnalyticsServiceCollecte et agrégation des statistiques de visites
SearchServiceIndexation et recherche full-text
SessionTrackingServiceSuivi des sessions visiteurs

Services d’intégration avec des systèmes tiers.

ServiceDescription
WebhookServiceEnvoi et réception de webhooks
ImportExportServiceImport/export de contenus (JSON, CSV, WordPress)

Les services suivent un pattern cohérent dans ArtisanCMS :

  1. Injection des dépendances : les services reçoivent leurs dépendances via le constructeur.
  2. Méthodes publiques : interface claire avec des méthodes nommées selon l’action (create, update, delete, findBy*).
  3. Événements : les services déclenchent des hooks après les opérations importantes.
  4. Validation : la validation des données est effectuée dans les Form Requests, pas dans les services.
// Exemple de structure type d'un service
class PageService
{
public function __construct(
private Page $model,
private ContentSanitizer $sanitizer,
) {}
public function create(array $data): Page
{
$data['body'] = $this->sanitizer->clean($data['body']);
$page = $this->model->create($data);
\CMS::doAction('content.saved', $page);
return $page;
}
public function findBySlug(string $slug): ?Page
{
return $this->model->where('slug', $slug)
->where('status', 'published')
->first();
}
}

Créez votre service dans app/Services/ et enregistrez-le si nécessaire dans un ServiceProvider.

app/Services/MyCustomService.php
namespace App\Services;
class MyCustomService
{
public function __construct(private PageService $pages) {}
public function getLatestPages(int $count = 5): Collection
{
return $this->pages->getPublished()->take($count);
}
}

Les services sans interface peuvent être résolus automatiquement par le conteneur sans enregistrement explicite.