Skip to main content

Qu’est-ce qu’un package ?

Dans Laravel, un package est un package Composer qui ajoute des fonctionnalités à votre application. Il en existe globalement deux types :
  • Package autonome — bibliothèque PHP générique qui ne dépend pas de Laravel (par exemple : Carbon, Pest)
  • Package Laravel — package intégré à Laravel qui expose des routes, des contrôleurs, des vues, de la configuration, etc.
Ce guide traite du second cas, à savoir le développement de packages spécifiques à Laravel. Concevoir un tel package suppose une bonne connaissance de la structure interne de Laravel : service providers, façades, publication de fichiers de configuration, etc.
Pour tester votre package, utilisez Orchestra Testbench. Vous pourrez écrire les tests de votre package comme s’il s’agissait d’une application Laravel classique.

Découverte automatique des packages

Lorsqu’un package est installé, Laravel lit la section extra.laravel de son composer.json afin d’enregistrer automatiquement les service providers et les façades.
Grâce à cette configuration, l’utilisateur n’a plus besoin d’éditer manuellement bootstrap/providers.php : le package est chargé automatiquement.
Le fonctionnement interne de la découverte automatique et le moment où le cache est reconstruit sont détaillés dans Fonctionnement interne de la découverte de packages.

Désactiver la découverte automatique

Si un utilisateur souhaite désactiver la découverte automatique pour un package donné, il peut le déclarer dans le composer.json de son application.

Rôle du service provider

Le service provider est le point d’entrée d’un package. C’est là que l’on centralise l’enregistrement des ressources (vues, configuration, migrations, routes…) auprès de Laravel. Le service provider hérite de Illuminate\Support\ServiceProvider et possède deux méthodes : register et boot.
N’enregistrez ni écouteurs d’événements, ni routes, ni vues dans la méthode register. Vous risqueriez d’utiliser par erreur un service issu d’un autre service provider pas encore chargé. Tout traitement autre qu’un binding doit se faire dans boot.

Publication du fichier de configuration

publishes() — publier des fichiers

En appelant publishes() dans boot, vous permettez aux utilisateurs de copier le fichier de configuration dans leur application via la commande vendor:publish.
Une fois publié, l’accès à la configuration se fait de manière classique :

mergeConfigFrom() — fusionner avec des valeurs par défaut

En utilisant mergeConfigFrom() dans la méthode register, vous garantissez que les valeurs par défaut du package sont utilisées même lorsque l’utilisateur n’a pas publié le fichier de configuration.
mergeConfigFrom() ne fusionne pas les tableaux imbriqués en profondeur. Sur des configurations comportant des tableaux multidimensionnels, une définition partielle par l’utilisateur peut empêcher la fusion des options restantes.

Séparer les groupes de publication par tag

En passant un tag comme deuxième argument à publishes(), vous permettez aux utilisateurs de publier uniquement les ressources dont ils ont besoin.

Enregistrement des routes

Utilisez loadRoutesFrom() pour charger un fichier de routes. Si le cache des routes de l’application est actif, le chargement est automatiquement ignoré.
Dans le fichier de routes, référencez les contrôleurs du package :

Publication des migrations

publishesMigrations() permet de publier les fichiers de migration. Laravel met à jour automatiquement l’horodatage au moment de la publication.

Publication des vues

loadViewsFrom() — enregistrer un dossier de vues

loadViewsFrom() enregistre un dossier de vues. Le namespace passé en deuxième argument permet ensuite de référencer les vues sous la forme package::view.
Une fois enregistrée, chaque vue s’utilise via le namespace du package :
Laravel cherche les vues à deux emplacements : d’abord dans resources/views/vendor/courier de l’application, puis, à défaut, dans le dossier de vues du package. Cela permet aux utilisateurs de personnaliser les vues.

Publier les vues

Enregistrer des composants Blade

Si votre package fournit des composants Blade, enregistrez-les dans la méthode boot.
Vous pouvez également enregistrer un namespace entier de composants en une seule fois.

Publication des fichiers de traduction

loadTranslationsFrom() enregistre les fichiers de traduction. Les traductions se référencent sous la forme package::file.key.
Pour des fichiers de traduction au format JSON, utilisez loadJsonTranslationsFrom().

Enregistrement des commandes

Les commandes Artisan du package sont enregistrées via la méthode commands(). Il est courant de ne les enregistrer que dans l’environnement console.

Intégration à la commande optimize

Si le package possède son propre cache, la méthode optimizes() permet de l’intégrer aux commandes php artisan optimize et php artisan optimize:clear.

Ajouter des informations à la commande about

Pour ajouter des informations sur votre package dans la sortie de php artisan about, utilisez AboutCommand::add().

Créer une façade

Les façades permettent d’appeler un binding du service container comme s’il s’agissait d’une méthode statique.
1

Créer la classe de service

2

Créer la classe façade

Héritez de Illuminate\Support\Facades\Facade et renvoyez la clé du binding du service container depuis getFacadeAccessor().
3

Déclarer le binding dans le service provider

4

Déclarer la façade dans composer.json

En ajoutant des annotations PHPDoc @method aux méthodes de la façade, vous activez l’autocomplétion dans les IDE.

DeferrableProvider — mettre en place le chargement différé

Un provider qui se contente d’enregistrer des bindings dans le service container peut être chargé de manière différée en implémentant l’interface DeferrableProvider. Le provider n’est chargé que lorsque le service est effectivement requis, ce qui améliore les performances de l’application.
Laravel compile et stocke la liste des services fournis par les deferred providers. Le provider n’est chargé qu’au moment où un des services listés dans provides() est résolu.
N’utilisez pas DeferrableProvider pour un provider qui doit enregistrer des ressources (vues, routes, écouteurs d’événements…). Si le provider est différé, ces ressources ne seront jamais enregistrées.

Tester un package

Pour tester un package indépendamment, utilisez Orchestra Testbench. Vous pourrez écrire les tests comme si vous étiez dans une application Laravel classique.
Dans votre classe de test, surchargez getPackageProviders() pour enregistrer les service providers du package.

Publication sur Composer

Voici quelques bonnes pratiques pour publier votre package sur Packagist. Configuration de base du composer.json
En dépendant de illuminate/support plutôt que de illuminate/framework, vous n’importez que les composants de Laravel dont vous avez réellement besoin. Gardez l’arbre de dépendances de votre package aussi léger que possible.
Exemple de structure de répertoires

Pages associées

Service providers

Revenez sur les méthodes register et boot des service providers et sur les deferred providers.

Gestion de la compatibilité entre versions

Découvrez les stratégies pour prendre en charge les montées de version majeures de Laravel et PHP ainsi que la configuration d’une matrice de tests GitHub Actions.
Dernière modification le 2 août 2026