Custom Package Development in Laravel 11

Jayprakash Jangir
3 min readJul 10, 2024

Developing custom packages in Laravel allows you to modularize your code, share functionalities across multiple projects, and even distribute your packages to the broader Laravel community. In this blog post, we’ll walk through the process of creating, publishing, and distributing a custom Laravel package. This guide is designed to be accessible to beginners while also providing advanced details for experienced developers.

Creating Laravel Packages

Step 1: Setting Up Your Package Directory

First, create a directory for your package within the packages directory of your Laravel project:

mkdir -p packages/vendor/package-name

Replace vendor with your namespace (typically your GitHub username or company name) and package-name with the name of your package.

Step 2: Initializing Composer

Navigate to your package directory and initialize a new Composer package:

cd packages/vendor/package-name
composer init

Follow the prompts to set up your composer.json file.

Step 3: Service Provider

Create a service provider to register your package’s services. Laravel automatically discovers service providers within the src directory. Create the src directory and add your service provider:

<?php

namespace Vendor\PackageName;

use Illuminate\Support\ServiceProvider;

class PackageServiceProvider extends ServiceProvider
{
public function register()
{
// Register package services
}

public function boot()
{
// Bootstrap any package services
}
}

Step 4: Autoloading

Add the autoload section to your package’s composer.json:

"autoload": {
"psr-4": {
"Vendor\\PackageName\\": "src/"
}
}

Run composer dump-autoload to update the autoloader.

Step 5: Configuring Package Discovery

In your main Laravel application’s composer.json, add the package path to the repositories section and require it:

"repositories": [
{
"type": "path",
"url": "./packages/vendor/package-name"
}
],
"require": {
"vendor/package-name": "*"
}

Run composer update to install the package.

Publishing Package Assets

Packages often need to publish assets such as configuration files, views, and migrations to the main application. Laravel provides a way to handle this using the publishes method in the service provider.

Step 1: Publishing Configuration Files

Create a configuration file in your package’s src/config directory:

return [
'key' => 'value'
];

In your service provider, add the following:

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

Run the following command in the main application to publish the configuration file:

php artisan vendor:publish --provider="Vendor\PackageName\PackageServiceProvider"

Step 2: Publishing Views

Place your views in the src/resources/views directory. Then add the following to your service provider:

public function boot()
{
$this->publishes([
__DIR__.'/resources/views' => resource_path('views/vendor/package-name'),
]);
}

Distributing Packages

To distribute your package, you can host it on a version control system like GitHub and publish it to Packagist.

Step 1: Version Control

Initialize a Git repository in your package directory and push it to GitHub:

git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/yourusername/package-name.git
git push -u origin master

Step 2: Publishing to Packagist

Sign in to Packagist and submit your package by providing the GitHub repository URL. Packagist will automatically update your package whenever you push new tags to your repository.

Example: Creating a Simple Greeting Package

Let’s create a simple greeting package to demonstrate the steps.

Step 1: Set Up

Create the directory structure:

mkdir -p packages/yourname/greeting
cd packages/yourname/greeting
composer init

Step 2: Create the Service Provider

<?php

namespace YourName\Greeting;

use Illuminate\Support\ServiceProvider;

class GreetingServiceProvider extends ServiceProvider
{
public function register()
{
// Register services
}

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

Step 3: Create the Config File

Create src/config/greeting.php:

return [
'message' => 'Hello, World!'
];

Step 4: Autoload and Require the Package

Update the composer.json autoload section and add the package to your Laravel application's composer.json:

"autoload": {
"psr-4": {
"YourName\\Greeting\\": "src/"
}
}
"require": {
"yourname/greeting": "*"
}

Step 5: Publishing

Publish the configuration file:

php artisan vendor:publish --provider="YourName\Greeting\GreetingServiceProvider"

Conclusion

Creating custom packages in Laravel 11 allows for better code reuse and modularity. By following this guide, you can create, publish, and distribute your own packages. Whether you’re building tools for internal use or sharing with the Laravel community, packages can significantly streamline your development process.

--

--