APIs

Guide complet pour créer un package Laravel : Guide Comple

Apprenez à créer un package Laravel de A à Z : structure, Service Provider, Facade, tests, publication sur Packagist et erreurs à éviter.

09 Mar 2026 11 min de lecture 5 vues
5

Lectures

11

Minutes

0

Partages

Introduction

En 2024, Laravel continue d'être l'un des frameworks PHP les plus populaires au monde, notamment grâce à sa flexibilité, son élégance syntaxique et sa communauté extrêmement active. Un chiffre frappant : plus de 1,5 million de sites web utilisent Laravel en production. Cependant, un défi courant pour les développeurs est de créer des solutions réutilisables et modulaires qui traversent les projets sans nécessiter de copier-coller. C'est précisément là qu'interviennent les packages Laravel.

En créant votre propre package, vous pouvez partager du code entre projets, améliorer la maintenabilité de vos applications et même contribuer à l'écosystème open source. Ce guide exhaustif vous apprendra à créer un package Laravel de A à Z, en couvrant chaque étape depuis la configuration initiale jusqu'à la publication sur Packagist, en passant par la gestion des dépendances, l'enregistrement de Service Providers, l'écriture de tests automatisés et l'optimisation de votre workflow de développement. Vous découvrirez également les erreurs courantes à éviter et des conseils concrets pour produire un package professionnel et fiable.

Pourquoi créer un package Laravel ?

Avant de plonger dans le code, il est essentiel de comprendre les motivations profondes derrière la création d'un package Laravel. Que vous soyez développeur freelance, membre d'une équipe technique ou contributeur open source, les bénéfices sont multiples et significatifs.

Modularité et réutilisabilité

La modularité est essentielle pour maintenir des applications de grande envergure. En créant un package, vous encapsulez des fonctionnalités spécifiques qui peuvent être utilisées indépendamment et mises à jour sans affecter le reste de votre application. Par exemple, si vous développez un système de notifications par SMS que vous utilisez dans trois projets différents, un package dédié vous évite de maintenir trois copies du même code. Chaque correction de bug ou amélioration se propage automatiquement via une simple mise à jour Composer.

Contribution à l'open source

Partager vos packages avec la communauté peut non seulement vous aider à obtenir des retours précieux d'autres développeurs, mais aussi à améliorer votre propre code grâce aux contributions externes. Les packages populaires comme Spatie Permission, Laravel Debugbar ou Livewire ont tous commencé comme des initiatives individuelles. Publier votre package renforce votre crédibilité professionnelle et enrichit votre portfolio technique.

Gain de productivité en équipe

Dans un contexte d'entreprise, les packages internes permettent de standardiser des fonctionnalités communes entre plusieurs projets. Authentification, gestion de fichiers, intégration d'API tierces : en centralisant ces logiques dans des packages privés, votre équipe gagne un temps considérable et réduit les risques d'incohérences entre les applications.

Comparatif : package Laravel vs autres approches

Pour bien comprendre l'intérêt d'un package Laravel, voici un tableau comparatif avec d'autres approches courantes de réutilisation de code :

CritèrePackage LaravelCopier-coller de codeSous-module GitAPI microservice
RéutilisabilitéExcellenteFaibleMoyenneBonne
Facilité de mise à jourTrès facile (Composer)Très difficileMoyenneIndépendante
Gestion des dépendancesAutomatiqueManuelleManuelleAutomatique
Tests isolésOuiNonPossibleOui
Intégration Laravel nativeParfaiteVariableVariableVia HTTP uniquement
Partage communautairePackagistImpossibleGitHubNon applicable
Complexité de mise en placeMoyenneTrès faibleÉlevéeTrès élevée

Comme le montre ce comparatif, le package Laravel offre le meilleur équilibre entre réutilisabilité, facilité de maintenance et intégration native avec le framework.

Premiers pas avec la création d'un package

Pour commencer, assurez-vous d'avoir une installation Laravel fonctionnelle (version 10 ou supérieure recommandée). Vous aurez besoin de Composer pour gérer les dépendances et de Git pour le contrôle de version. Créez un nouveau répertoire pour votre package et initialisez un dépôt Git.

mkdir mon-package-laravel
cd mon-package-laravel
git init

Structure de base du package

La structure de base d'un package Laravel ressemble beaucoup à celle d'une application Laravel classique, mais en version simplifiée. Voici l'arborescence recommandée :

mon-package-laravel/
├── src/
│   ├── MonPackageServiceProvider.php
│   ├── Facades/
│   │   └── MonPackage.php
│   ├── Http/
│   │   ├── Controllers/
│   │   └── Middleware/
│   ├── Models/
│   └── config/
│       └── mon-package.php
├── tests/
│   └── ClassePrincipaleTest.php
├── database/
│   └── migrations/
├── resources/
│   └── views/
├── routes/
│   └── web.php
├── composer.json
├── README.md
├── LICENSE
└── .gitignore

Vous aurez besoin d'un répertoire src pour le code source et d'un fichier composer.json pour déclarer les dépendances et l'autoloading.

{
  "name": "votre-nom/mon-package-laravel",
  "description": "Un package Laravel personnalisé",
  "type": "library",
  "license": "MIT",
  "authors": [
    {
      "name": "Votre Nom",
      "email": "votre@email.com"
    }
  ],
  "autoload": {
    "psr-4": {
      "VotreNom\\MonPackage\\": "src/"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "VotreNom\\MonPackage\\Tests\\": "tests/"
    }
  },
  "require": {
    "php": "^8.1",
    "illuminate/support": "^10.0|^11.0"
  },
  "require-dev": {
    "phpunit/phpunit": "^10.0",
    "orchestra/testbench": "^8.0"
  },
  "extra": {
    "laravel": {
      "providers": [
        "VotreNom\\MonPackage\\MonPackageServiceProvider"
      ]
    }
  }
}

Créer le Service Provider

Le Service Provider est le point d'entrée de votre package dans l'écosystème Laravel. C'est lui qui enregistre les services, les configurations, les routes et les vues de votre package. Voici un exemple complet :

namespace VotreNom\MonPackage;

use Illuminate\Support\ServiceProvider;

class MonPackageServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->mergeConfigFrom(
            __DIR__ . '/config/mon-package.php',
            'mon-package'
        );

        $this->app->singleton('mon-package', function ($app) {
            return new ClassePrincipale(
                config('mon-package')
            );
        });
    }

    public function boot(): void
    {
        // Publication de la configuration
        $this->publishes([
            __DIR__ . '/config/mon-package.php' => config_path('mon-package.php'),
        ], 'mon-package-config');

        // Chargement des routes
        $this->loadRoutesFrom(__DIR__ . '/../routes/web.php');

        // Chargement des vues
        $this->loadViewsFrom(__DIR__ . '/../resources/views', 'mon-package');

        // Chargement des migrations
        $this->loadMigrationsFrom(__DIR__ . '/../database/migrations');

        // Publication des vues
        $this->publishes([
            __DIR__ . '/../resources/views' => resource_path('views/vendor/mon-package'),
        ], 'mon-package-views');
    }
}

Créer une Facade

Les Facades offrent une interface statique élégante pour accéder aux services enregistrés dans le conteneur. Voici comment créer une Facade pour votre package :

namespace VotreNom\MonPackage\Facades;

use Illuminate\Support\Facades\Facade;

class MonPackage extends Facade
{
    protected static function getFacadeAccessor(): string
    {
        return 'mon-package';
    }
}

Développement du package

Une fois la structure de base en place, vous pouvez commencer à développer les fonctionnalités de votre package. Ajoutez vos classes dans le répertoire src et assurez-vous que votre logique est correctement encapsulée et respecte les principes SOLID.

Développement local avec un projet Laravel

Pour tester votre package en temps réel pendant le développement, vous pouvez l'ajouter comme dépendance locale dans un projet Laravel existant. Modifiez le fichier composer.json de votre projet Laravel :

{
  "repositories": [
    {
      "type": "path",
      "url": "../mon-package-laravel",
      "options": {
        "symlink": true
      }
    }
  ],
  "require": {
    "votre-nom/mon-package-laravel": "dev-main"
  }
}

Puis exécutez composer update. Grâce au symlink, toute modification dans votre package sera immédiatement reflétée dans le projet Laravel, sans nécessiter de nouvelle installation.

Gestion des dépendances

Utilisez Composer pour gérer les dépendances de votre package. Soyez précis dans vos contraintes de version pour éviter les conflits. Préférez les contraintes souples comme ^10.0 plutôt que des versions exactes. Évitez aussi d'ajouter des dépendances inutiles qui alourdiraient l'installation pour les utilisateurs de votre package.

Fichier de configuration

Un bon package permet à ses utilisateurs de personnaliser son comportement via un fichier de configuration publiable :

// src/config/mon-package.php
return [
    'enabled' => env('MON_PACKAGE_ENABLED', true),
    'cache_duration' => env('MON_PACKAGE_CACHE', 3600),
    'api_key' => env('MON_PACKAGE_API_KEY', null),
    'default_format' => 'json',
    'log_channel' => env('MON_PACKAGE_LOG_CHANNEL', 'stack'),
];

Écriture de tests

Les tests sont cruciaux pour garantir la stabilité de votre package. Utilisez PHPUnit combiné avec Orchestra Testbench, qui fournit un environnement Laravel complet pour tester vos packages en isolation. Voici un exemple enrichi :

namespace VotreNom\MonPackage\Tests;

use Orchestra\Testbench\TestCase;
use VotreNom\MonPackage\MonPackageServiceProvider;
use VotreNom\MonPackage\ClassePrincipale;

class ClassePrincipaleTest extends TestCase
{
    protected function getPackageProviders($app): array
    {
        return [
            MonPackageServiceProvider::class,
        ];
    }

    protected function getEnvironmentSetUp($app): void
    {
        $app['config']->set('mon-package.enabled', true);
    }

    public function testFonctionnaliteDeBase(): void
    {
        $instance = new ClassePrincipale();
        $this->assertEquals('résultat attendu', $instance->methode());
    }

    public function testConfigurationEstChargee(): void
    {
        $this->assertTrue(config('mon-package.enabled'));
        $this->assertEquals(3600, config('mon-package.cache_duration'));
    }

    public function testFacadeFonctionne(): void
    {
        $resultat = \VotreNom\MonPackage\Facades\MonPackage::methode();
        $this->assertNotNull($resultat);
    }
}

Configurez PHPUnit avec un fichier phpunit.xml à la racine de votre package :

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php"
         colors="true"
         verbose="true">
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

Documentation et bonnes pratiques

Un package sans documentation est un package que personne n'utilisera. Investir du temps dans une documentation claire est tout aussi important que le code lui-même.

Rédiger un README efficace

Votre fichier README.md doit contenir au minimum les sections suivantes : une description claire du package, les prérequis, les instructions d'installation via Composer, des exemples d'utilisation concrets, la documentation de configuration, les instructions pour contribuer et la licence. Ajoutez aussi des badges (version, tests, couverture de code) pour indiquer le niveau de maturité de votre package.

Respecter les conventions Laravel

Pour que votre package soit adopté facilement, respectez les conventions de nommage et d'architecture de Laravel. Utilisez le PSR-4 pour l'autoloading, le PSR-12 pour le style de code et suivez les patterns habituels du framework comme les Service Providers, les Facades et les fichiers de configuration publiables.

Publication du package

Une fois votre package prêt, testé et documenté, vous pouvez le publier sur Packagist pour le rendre disponible à toute la communauté Laravel. Assurez-vous que votre dépôt Git est public et que votre fichier composer.json est correctement configuré.

Étapes pour publier sur Packagist

  1. Poussez votre code sur un dépôt GitHub, GitLab ou Bitbucket public.
  2. Créez un tag de version avec Git : git tag v1.0.0 puis git push --tags.
  3. Connectez-vous à packagist.org avec votre compte GitHub.
  4. Soumettez l'URL de votre dépôt via le bouton Submit.
  5. Configurez un webhook GitHub pour que Packagist soit automatiquement notifié à chaque push.

Packagist va automatiquement récupérer les informations de votre fichier composer.json et rendre votre package installable via la commande :

composer require votre-nom/mon-package-laravel
Important : Assurez-vous que votre package est bien documenté, que chaque fonctionnalité est couverte par des tests et que vous utilisez le versioning sémantique (SemVer) avant de publier une version stable.

Versioning sémantique

Adoptez le versioning sémantique pour communiquer clairement les changements à vos utilisateurs. Le format MAJOR.MINOR.PATCH fonctionne comme suit : incrémentez MAJOR pour les changements non rétrocompatibles, MINOR pour les nouvelles fonctionnalités rétrocompatibles et PATCH pour les corrections de bugs. Par exemple, passer de v1.2.3 à v2.0.0 signale un changement majeur qui pourrait casser le code existant.

Pièges et erreurs courantes

Même les développeurs expérimentés commettent des erreurs lors de la création de packages. Voici les pièges les plus fréquents et comment les éviter :

  • Oublier d'ajouter des tests : une erreur fréquente qui peut mener à des bugs non détectés en production. Visez au minimum 80 % de couverture de code.
  • Ne pas suivre les standards de codage Laravel : cela rend votre package difficile à maintenir et rebute les contributeurs potentiels.
  • Publier sans documentation : un package sans README exploitable est pratiquement invisible sur Packagist.
  • Ignorer les mises à jour de dépendances : cela peut causer des problèmes de compatibilité avec les nouvelles versions de Laravel.
  • Trop coupler le package au framework : dans la mesure du possible, gardez votre logique métier indépendante de Laravel pour faciliter les tests et la portabilité.
  • Oublier la découverte automatique : sans la section extra.laravel.providers dans composer.json, vos utilisateurs devront enregistrer manuellement le Service Provider.
  • Ne pas utiliser de fichier de configuration publiable : cela empêche vos utilisateurs de personnaliser le comportement du package sans modifier le code source.

Conclusion

Créer un package Laravel est une compétence précieuse pour tout développeur PHP souhaitant améliorer sa productivité, structurer son code et contribuer à l'écosystème open source. En suivant les étapes détaillées dans ce guide, vous disposez de toutes les connaissances nécessaires pour créer des solutions réutilisables, testées et professionnelles.

Voici un résumé des points essentiels abordés :

  • Comprendre les avantages concrets de la création de packages par rapport aux autres approches.
  • Structurer correctement votre package avec un Service Provider, une Facade et un fichier de configuration.
  • Développer et tester efficacement vos fonctionnalités avec Orchestra Testbench et PHPUnit.
  • Publier et versionner votre package sur Packagist en respectant le versioning sémantique.
  • Éviter les erreurs courantes pour assurer la qualité, la maintenabilité et l'adoption de votre code.

Commencez dès maintenant à créer votre premier package Laravel. Plus vous pratiquez, plus vous maîtriserez les subtilités de l'écosystème et plus vous serez reconnu dans la communauté des développeurs Laravel.

Tags

Laravel Package PHP

Partagez cet article

Twitter Facebook LinkedIn
JY
Jordane YENO

Developpeur Full Stack passionne par le web et les nouvelles technologies

En savoir plus

Articles similaires