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.
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 sectionextra.laravel de son composer.json afin d’enregistrer automatiquement les service providers et les façades.
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 lecomposer.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 deIlluminate\Support\ServiceProvider et possède deux méthodes : register et boot.
callAfterResolving() s’exécute et comment concevoir un code qui supporte les applications répétées.
Pour des méthodes d’enregistrement qui ne conservent pas d’état d’un traitement à l’autre, même avec Octane ou les workers de file d’attente, consultez Conception du cycle de vie des services d’un package. Cette page explique l’implémentation interne de scoped() et les points d’attention concernant les dépendances conservées par les singletons.
Publication du fichier de configuration
publishes() — publier des fichiers
En appelantpublishes() dans boot, vous permettez aux utilisateurs de copier le fichier de configuration dans leur application via la commande vendor:publish.
mergeConfigFrom() — fusionner avec des valeurs par défaut
En utilisantmergeConfigFrom() 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.
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
UtilisezloadRoutesFrom() pour charger un fichier de routes. Si le cache des routes de l’application est actif, le chargement est automatiquement ignoré.
Publication des migrations
publishesMigrations() permet d’enregistrer les fichiers de migration pour la publication. Dans la configuration par défaut de Laravel 13, database.migrations.update_date_on_publish est activé : l’horodatage du nom de fichier est donc mis à jour lors de la publication. Si ce paramètre est désactivé ou absent, cette mise à jour n’a pas lieu.
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.
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.
L’ordre de recherche réel et le repli fichier par fichier, la manière de livrer les changements aux templates publiés, ainsi que la différence avec le cache Blade, sont expliqués dans Surcharger et mettre à jour les vues d’un package.
Publier les vues
Enregistrer des composants Blade
Si votre package fournit des composants Blade, enregistrez-les dans la méthodeboot.
Distribution des assets publics
Pour distribuer le JavaScript, le CSS ou les images de votre package, enregistrez avecpublishes() une copie vers un emplacement tel que public_path('vendor/courier'). Les fichiers déjà publiés ne changent pas automatiquement lorsque vous mettez à jour le package.
La restriction des cibles par tag et par provider, la différence entre --force et --existing, le traitement des fichiers supprimés et la mise à jour via laravel-assets sont expliqués dans Assets publics d’un package et mises à jour.
Publication des fichiers de traduction
loadTranslationsFrom() enregistre les fichiers de traduction. Les traductions se référencent sous la forme package::file.key.
loadJsonTranslationsFrom().
Enregistrement des commandes
Les commandes Artisan du package sont enregistrées via la méthodecommands(). 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.
--except, l’ordre d’exécution par rapport aux tâches standard et les codes de sortie en cas d’échec sont expliqués dans Cache d’un package et intégration à optimize.
Ajouter des informations à la commande about
Pour ajouter des informations sur votre package dans la sortie de php artisan about, utilisez AboutCommand::add().
--only et la sortie JSON, une conception qui n’expose aucun secret et l’état d’enregistrement dans les tests sont détaillés dans Ajouter des informations de diagnostic du package à about.
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
@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’interfaceDeferrableProvider. Le provider n’est chargé que lorsque le service est effectivement requis, ce qui améliore les performances de l’application.
provides() est résolu.
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.getPackageProviders() pour enregistrer les service providers du package.
Publication sur Composer
Voici quelques bonnes pratiques pour publier votre package sur Packagist. Configuration de base ducomposer.json
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.