patinthehat/laravel-package-manager
Installation:
composer require patinthehat/laravel-package-manager
Add the service provider to config/app.php:
'providers' => [
// ...
LaravelPackageManager\LaravelPackageManagerServiceProvider::class,
],
First Use Case:
Install and register a package (e.g., spatie/laravel-permission) with all dependencies:
artisan package:require spatie/laravel-permission
This runs composer require and auto-registers providers/facades from the package’s composer.json.
Package Installation & Registration:
package:require for production (--dev flag for dev-only):
artisan package:require vendor/package --dev
artisan package:require vendor/package --register-only
Cleanup:
artisan package:unregister vendor/package
Integration with CI/CD:
package:require in deployment pipelines to ensure consistent package registration across environments.Custom Package Metadata:
Extend the package’s composer.json to define custom registration logic via the extra.laravel-package-manager key (e.g., for conditional providers).
Post-Install Hooks:
Use Laravel’s booted event in a package’s service provider to trigger actions after registration:
public function boot()
{
if (app()->environment('local')) {
// Local-only setup
}
}
Dependency Management:
Chain package:require commands to install multiple packages atomically:
artisan package:require package1 && artisan package:require package2
Provider/Facade Conflicts:
App\Services\FooService) may cause runtime errors. Use --register-only to debug conflicts manually.Composer Autoloader Cache:
package:require, clear Composer’s autoloader cache if classes aren’t found:
composer dump-autoload
Dev vs. Prod Dependencies:
--dev for development-only packages (e.g., laravel/tinker) will fail in production builds.-v flag for detailed logs:
artisan package:require vendor/package -v
composer.json changes before installing:
composer require vendor/package --dry-run
Custom Commands: Extend the package by publishing its config and creating custom Artisan commands:
php artisan vendor:publish --provider="LaravelPackageManager\LaravelPackageManagerServiceProvider"
Package-Specific Logic:
Override the default registration behavior by binding a custom PackageManager instance:
$this->app->bind(
LaravelPackageManager\Contracts\PackageManager::class,
CustomPackageManager::class
);
Environment-Specific Registration:
Use Laravel’s whenIs() or unlessIs() in service providers to conditionally register based on environment variables.
config/app.php:
Before bulk-registering packages, backup config/app.php to revert manual changes if needed.composer.json:
Define package-specific metadata in extra.laravel-package-manager to control registration behavior:
{
"extra": {
"laravel-package-manager": {
"providers": ["App\\Providers\\CustomProvider"],
"facades": ["App\\Facades\\CustomFacade"]
}
}
}
laravel-zero:
For CLI tools, use package:require to install dependencies without a full Laravel install:
composer require patinthehat/laravel-package-manager --dev
How can I help you explore Laravel packages today?