APIs

Créer un package Laravel : Guide complet et pratique

Apprenez à créer un package Laravel professionnel : structure, Service Provider, tests, Facade et publication sur Packagist. Guide complet et prati...

25 Feb 2026 12 min de lecture 13 vues
13

Lectures

12

Minutes

0

Partages

Introduction

Selon une enquête récente, plus de 70 % des développeurs Laravel cherchent à créer des packages réutilisables pour améliorer l'efficacité de leurs projets. En 2024, avec l'évolution rapide des technologies et la nécessité croissante d'optimiser les processus de développement, savoir créer un package Laravel est devenu une compétence précieuse et recherchée sur le marché.

Ce guide complet vous apprendra comment concevoir, structurer et distribuer un package Laravel efficace, étape par étape. Nous aborderons la planification initiale, l'architecture des fichiers, le développement des fonctionnalités, les tests automatisés, la documentation professionnelle et enfin la publication sur Packagist. Que vous soyez développeur intermédiaire ou confirmé, vous trouverez ici toutes les clés pour réussir votre premier package ou améliorer vos pratiques existantes.

Qu'est-ce qu'un package Laravel ?

Un package Laravel est une extension modulaire qui ajoute des fonctionnalités spécifiques à une application Laravel existante. Il permet de réutiliser du code entre plusieurs projets, de réduire significativement le temps de développement et d'améliorer la maintenabilité globale de vos applications. Comprendre ce concept est crucial car il vous permet d'optimiser vos projets en isolant des fonctionnalités dans des modules autonomes et testables.

Un package peut inclure des routes, des contrôleurs, des modèles Eloquent, des vues Blade, des migrations de base de données, des fichiers de configuration, des middlewares et bien d'autres composants nécessaires au bon fonctionnement de votre application. L'écosystème Laravel repose largement sur cette architecture de packages : des outils populaires comme Spatie Permission, Laravel Debugbar ou Laravel Cashier sont tous des packages tiers.

Pourquoi créer son propre package ?

Créer votre propre package présente de nombreux avantages concrets pour votre carrière et vos projets :

  • Réutilisabilité : un même package peut être intégré dans plusieurs projets sans duplication de code.
  • Maintenabilité : les mises à jour se font en un seul endroit et se propagent à tous les projets dépendants.
  • Collaboration : un package bien documenté facilite le travail en équipe et le partage avec la communauté open source.
  • Qualité du code : le processus de création d'un package vous pousse à écrire du code plus propre, mieux structuré et mieux testé.
  • Visibilité professionnelle : publier un package utile renforce votre crédibilité en tant que développeur.

Structure d'un package Laravel

Un package Laravel est structuré de manière à être facilement intégrable dans n'importe quelle application. Voici l'arborescence complète des dossiers et fichiers typiques d'un package professionnel :

my-package/
├── config/
│   └── my-package.php
├── database/
│   └── migrations/
├── resources/
│   └── views/
├── routes/
│   └── web.php
├── src/
│   ├── Http/
│   │   ├── Controllers/
│   │   └── Middleware/
│   ├── Models/
│   ├── Facades/
│   ├── MyPackageServiceProvider.php
│   └── MyPackage.php
├── tests/
│   ├── Unit/
│   └── Feature/
├── composer.json
├── LICENSE
└── README.md

Chaque dossier a un rôle précis : src contient le code source principal, config héberge les fichiers de configuration publiables, database contient les migrations, resources stocke les vues Blade, routes définit les routes du package, et tests regroupe les tests unitaires et fonctionnels.

Comparatif des types de packages Laravel

Avant de commencer le développement, il est important de comprendre les différents types de packages que vous pouvez créer. Voici un tableau comparatif pour vous aider à choisir l'approche adaptée à votre besoin :

Type de packageCas d'utilisationComplexitéExemple
Package utilitaireFonctions helpers, manipulation de donnéesFaibleGénération de slugs, formatage de dates
Package de serviceIntégration d'API tierces, services métierMoyennePasserelle de paiement, envoi de SMS
Package UIComposants Blade, thèmes, widgetsMoyenneTableaux de bord, formulaires dynamiques
Package completModule autonome avec routes, vues, migrationsÉlevéeSystème de blog, gestion de rôles
Package CLICommandes Artisan personnaliséesFaible à moyenneGénérateurs de code, outils de déploiement

Ce tableau vous aide à calibrer l'effort nécessaire et à définir le périmètre de votre package avant de commencer à coder.

Créer un package : les étapes essentielles

Créer un package Laravel demande une planification rigoureuse et une approche méthodique. Voici les étapes clés pour réussir, détaillées avec des exemples concrets.

Étape 1 : initialiser le package

Pour commencer, créez un nouveau répertoire dédié à votre package en dehors de votre application Laravel principale. Ensuite, initialisez un nouveau projet Composer :

mkdir my-laravel-package
cd my-laravel-package
composer init

Cette commande interactive génère un fichier composer.json qui décrit votre package et ses dépendances. Voici un exemple de configuration complète et optimisée :

{
    "name": "vendor/my-package",
    "description": "Un package Laravel pour gérer les notifications avancées",
    "type": "library",
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "Vendor\\MyPackage\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Vendor\\MyPackage\\Tests\\": "tests/"
        }
    },
    "require": {
        "php": "^8.1",
        "illuminate/support": "^10.0|^11.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0",
        "orchestra/testbench": "^8.0|^9.0"
    },
    "extra": {
        "laravel": {
            "providers": [
                "Vendor\\MyPackage\\MyPackageServiceProvider"
            ]
        }
    }
}

Notez l'utilisation de la section extra.laravel.providers qui permet la découverte automatique du package par Laravel, évitant ainsi l'enregistrement manuel du service provider.

Étape 2 : créer le Service Provider

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

<?php

namespace Vendor\MyPackage;

use Illuminate\Support\ServiceProvider;

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

        $this->app->singleton('my-package', function ($app) {
            return new MyPackage($app['config']['my-package']);
        });
    }

    public function boot(): void
    {
        $this->loadRoutesFrom(__DIR__ . '/../routes/web.php');
        $this->loadViewsFrom(__DIR__ . '/../resources/views', 'my-package');
        $this->loadMigrationsFrom(__DIR__ . '/../database/migrations');

        if ($this->app->runningInConsole()) {
            $this->publishes([
                __DIR__ . '/../config/my-package.php' => config_path('my-package.php'),
            ], 'my-package-config');

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

Ce Service Provider illustre les bonnes pratiques : séparation entre register() pour les liaisons au conteneur et boot() pour le chargement des ressources. La méthode publishes() permet aux utilisateurs de personnaliser la configuration et les vues.

Étape 3 : développer les fonctionnalités

Ajoutez les fonctionnalités souhaitées dans le dossier src. Utilisez des classes PHP bien organisées, des contrôleurs et des vues pour structurer votre code. Voici un exemple de contrôleur plus complet avec validation et réponse JSON :

<?php

namespace Vendor\MyPackage\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Routing\Controller;

class NotificationController extends Controller
{
    public function index(): JsonResponse
    {
        $notifications = auth()->user()->notifications()->paginate(15);

        return response()->json([
            'status' => 'success',
            'data' => $notifications,
        ]);
    }

    public function store(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'message' => 'required|string',
            'type' => 'required|in:info,warning,error',
        ]);

        $notification = auth()->user()->notifications()->create($validated);

        return response()->json([
            'status' => 'success',
            'data' => $notification,
        ], 201);
    }
}

Étape 4 : créer une Facade

Les Facades fournissent une interface statique élégante pour accéder aux fonctionnalités de votre package. Voici comment en créer une :

<?php

namespace Vendor\MyPackage\Facades;

use Illuminate\Support\Facades\Facade;

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

Grâce à cette Facade, les développeurs pourront utiliser votre package de manière intuitive avec une syntaxe comme MyPackage::notify().

Étape 5 : ajouter un fichier de configuration

Un fichier de configuration publiable permet aux utilisateurs de personnaliser le comportement de votre package sans modifier le code source :

<?php

return [
    'enabled' => env('MY_PACKAGE_ENABLED', true),
    'default_channel' => env('MY_PACKAGE_CHANNEL', 'database'),
    'max_retries' => 3,
    'queue' => [
        'connection' => env('MY_PACKAGE_QUEUE_CONNECTION', 'default'),
        'name' => env('MY_PACKAGE_QUEUE_NAME', 'notifications'),
    ],
];

L'utilisation de env() avec des valeurs par défaut offre une flexibilité maximale aux utilisateurs de votre package.

Tests et assurance qualité

Tester votre package est absolument crucial pour garantir sa fiabilité et sa stabilité à travers les versions. Laravel recommande l'utilisation de PHPUnit combiné avec Orchestra Testbench, un outil spécialement conçu pour tester les packages Laravel dans un environnement isolé.

Configurer l'environnement de test

Commencez par configurer Orchestra Testbench en créant une classe de test de base :

<?php

namespace Vendor\MyPackage\Tests;

use Orchestra\Testbench\TestCase as OrchestraTestCase;
use Vendor\MyPackage\MyPackageServiceProvider;

abstract class TestCase extends OrchestraTestCase
{
    protected function getPackageProviders($app): array
    {
        return [
            MyPackageServiceProvider::class,
        ];
    }

    protected function getEnvironmentSetUp($app): void
    {
        $app['config']->set('database.default', 'testing');
        $app['config']->set('database.connections.testing', [
            'driver' => 'sqlite',
            'database' => ':memory:',
        ]);
    }
}

Écrire des tests unitaires et fonctionnels

Créez des tests ciblés pour chaque fonctionnalité de votre package :

<?php

namespace Vendor\MyPackage\Tests\Unit;

use Vendor\MyPackage\Tests\TestCase;
use Vendor\MyPackage\Facades\MyPackage;

class MyPackageTest extends TestCase
{
    public function test_package_is_registered(): void
    {
        $this->assertNotNull($this->app->make('my-package'));
    }

    public function test_configuration_is_loaded(): void
    {
        $this->assertNotNull(config('my-package'));
        $this->assertTrue(config('my-package.enabled'));
    }

    public function test_default_channel_is_database(): void
    {
        $this->assertEquals('database', config('my-package.default_channel'));
    }
}

Exécutez vos tests avec la commande suivante :

./vendor/bin/phpunit

Visez une couverture de tests d'au moins 80 % pour garantir la robustesse de votre package. Utilisez des tests unitaires pour les fonctions isolées et des tests fonctionnels pour vérifier l'intégration avec le framework.

Documentation professionnelle

Un package sans documentation est un package que personne n'utilisera. Assurez-vous que votre fichier README.md contient les sections suivantes pour maximiser l'adoption :

  • Description : explication claire de ce que fait le package et des problèmes qu'il résout.
  • Prérequis : versions de PHP et Laravel compatibles.
  • Installation : commande Composer et étapes de configuration.
  • Utilisation : exemples de code concrets et cas d'usage courants.
  • Configuration : description de toutes les options disponibles.
  • Tests : instructions pour exécuter les tests du package.
  • Changelog : historique des modifications entre les versions.
  • Contribution : guide pour les développeurs souhaitant contribuer.
  • Licence : type de licence utilisée (MIT, Apache, etc.).
Conseil : ajoutez des badges dans votre README (tests CI, couverture de code, version stable) pour inspirer confiance aux utilisateurs potentiels et renforcer la crédibilité de votre package.

Publier votre package

Publier votre package sur Packagist permet à des milliers de développeurs de l'utiliser facilement via Composer. Voici la procédure complète pour une publication réussie.

Préparer la publication

Avant de publier, assurez-vous que votre package respecte ces critères de qualité :

  1. Tous les tests passent avec succès.
  2. Le fichier composer.json contient toutes les informations nécessaires (nom, description, licence, autoload).
  3. Le fichier README.md est complet et clair.
  4. Un fichier LICENSE est présent à la racine du projet.
  5. Le code respecte les standards PSR-12.
  6. Le versioning sémantique (SemVer) est utilisé pour les tags Git.

Publier sur Packagist

Suivez ces étapes pour rendre votre package disponible publiquement :

# Validez votre composer.json
composer validate

# Initialisez un dépôt Git et poussez vers GitHub
git init
git add .
git commit -m "Initial release v1.0.0"
git tag v1.0.0
git remote add origin https://github.com/vendor/my-package.git
git push origin main --tags

Ensuite, connectez-vous sur packagist.org, cliquez sur « Submit » et fournissez l'URL de votre dépôt GitHub. Packagist analysera automatiquement votre fichier composer.json et rendra votre package installable via la commande :

composer require vendor/my-package

Mettre en place l'intégration continue

Configurez GitHub Actions pour automatiser les tests à chaque commit et pull request. Voici un fichier de workflow minimal :

name: Tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        php: [8.1, 8.2, 8.3]
    steps:
      - uses: actions/checkout@v4
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
      - run: composer install --no-progress
      - run: ./vendor/bin/phpunit

Cette configuration teste votre package sur plusieurs versions de PHP, garantissant une compatibilité étendue.

Pièges et erreurs courantes

Voici les erreurs les plus fréquentes que commettent les développeurs lors de la création d'un package Laravel, et comment les éviter :

  • Tests insuffisants : ne pas tester suffisamment le package avant sa publication expose les utilisateurs à des bugs critiques. Utilisez Orchestra Testbench pour simuler un environnement Laravel complet.
  • Composer.json incomplet : oublier de mettre à jour le fichier composer.json avec les bonnes informations d'autoload ou les dépendances correctes provoque des erreurs d'installation.
  • Compatibilité ignorée : ne pas tester la compatibilité avec différentes versions de Laravel et PHP limite fortement l'adoption de votre package.
  • Documentation absente : publier sans documentation claire et détaillée décourage les développeurs potentiels et génère un afflux de questions.
  • Couplage fort : créer des dépendances rigides avec des classes concrètes au lieu d'utiliser des interfaces et l'injection de dépendances rend le package difficile à maintenir.
  • Absence de versioning : ne pas utiliser le versioning sémantique (SemVer) crée de la confusion lors des mises à jour et peut casser les projets dépendants.

Conclusion

Créer un package Laravel est une compétence essentielle pour tout développeur souhaitant optimiser et partager ses solutions. Ce guide vous a montré comment structurer, développer, tester et publier un package professionnel, en suivant les meilleures pratiques de l'écosystème Laravel.

Voici les points clés à retenir :

  • Comprendre la structure d'un package Laravel et choisir le type adapté à votre besoin.
  • Initialiser et configurer un package avec Composer et un Service Provider robuste.
  • Développer des fonctionnalités modulaires avec des Facades, des contrôleurs et des fichiers de configuration.
  • Tester rigoureusement avec PHPUnit et Orchestra Testbench pour garantir la fiabilité.
  • Documenter professionnellement votre package pour faciliter son adoption.
  • Publier sur Packagist et mettre en place l'intégration continue avec GitHub Actions.
  • Éviter les erreurs courantes comme le couplage fort et l'absence de versioning.

Pratiquez en créant votre premier package dès aujourd'hui. Commencez par un package utilitaire simple, puis évoluez vers des packages plus complexes. Partagez vos créations avec la communauté Laravel pour obtenir des retours et améliorer continuellement vos compétences en développement modulaire.

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