How to Develop a Package in Laravel

Laravel package development allows you to create reusable functionality that can be shared across multiple projects. Start by creating a custom folder structure under the packages/ directory. Define your composer.json, service provider, and class files inside a src/ folder. Register autoload paths and service providers to integrate with the main app. This enables clean separation of features like APIs, helpers, or tools into modular packages.

1. Set Up a Packages Directory

Inside your Laravel project:

Put this comment in your project terminal:


mkdir -p packages/VendorName/PackageName

Example:


packages/MyCompany/MyPackage

2. Create composer.json for Your Package

Inside packages/MyCompany/MyPackage/, create a composer.json:


{
  "name": "mycompany/mypackage",
  "description": "A custom Laravel package.",
  "type": "library",
  "autoload": {
    "psr-4": {
      "MyCompany\\MyPackage\\": "src/"
    }
  },
  "require": {
    "php": "^8.0",
    "illuminate/support": "^9.0"
  }
}

3. Create the Package Structure

Inside packages/MyCompany/MyPackage/:


src/
├── MyPackageServiceProvider.php
└── Helpers/
    └── MyHelper.php

4. Create a Service Provider

Create src/MyPackageServiceProvider.php:


<?php

namespace MyCompany\MyPackage;

use Illuminate\Support\ServiceProvider;

class MyPackageServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // Load routes, views, migrations, etc.
    }

    public function register()
    {
        // Bind services or classes
    }
}

5. Autoload the Package

In your main Laravel app’s composer.json, add:


"autoload": {
    "psr-4": {
        "App\\": "app/",
        "MyCompany\\MyPackage\\": "packages/MyCompany/MyPackage/src/"
    }
}

Then run:

Put this comment in your project terminal:


composer dump-autoload

6. Register the Service Provider (if not using auto-discovery)

In config/app.php, manually add:


'providers' => [
    MyCompany\MyPackage\MyPackageServiceProvider::class,
],

7. Use Your Package

Now you can use any helper, class, or service you’ve created in your package like:


use MyCompany\MyPackage\Helpers\MyHelper;

MyHelper::doSomething();

Bonus: Publishable Resources

In your service provider:

packages/VendorName/PackageName/src/MyPackageServiceProvider.php


public function boot()
{
    $this->publishes([
        __DIR__.'/../config/mypackage.php' => config_path('mypackage.php'),
    ], 'config');
}

Summary

Step Description
Create folders packages/Vendor/Package
Add composer.json Define package metadata and autoload
Write service provider Bootstrap your package
Register autoload Update Laravel to recognize your package
Dump autoload composer dump-autoload