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 |