Installation:
composer require lubusin/laravel-decomposer
Publish the config (optional):
php artisan vendor:publish --provider="Lubusin\LaravelDecomposer\LaravelDecomposerServiceProvider"
First Command: Generate a basic report immediately:
php artisan decomposer:report
Outputs a markdown report to storage/app/public/decomposer-report.md.
First Use Case: Debug dependency conflicts or environment inconsistencies during onboarding or deployments. Example:
use Lubusin\LaravelDecomposer\Facades\Decomposer;
$report = Decomposer::getReport();
dd($report['packages']['installed']); // Inspect installed packages
Dependency Inspection:
// Check for a specific package version
$report = Decomposer::getReport();
$laravelVersion = $report['laravel']['version'];
$composerPackages = $report['packages']['installed'];
if (version_compare($laravelVersion, '10.0.0', '<')) {
throw new \RuntimeException("Unsupported Laravel version");
}
Environment Validation:
// Validate PHP extensions
$extensions = $report['php']['extensions'];
if (!in_array('pdo_mysql', $extensions)) {
throw new \RuntimeException("PDO MySQL extension required");
}
Automated Reporting:
php artisan decomposer:report --format=json --output=custom-report.json
use Lubusin\LaravelDecomposer\Events\DecomposerGenerated;
public function handle(DecomposerGenerated $event) {
$report = $event->report;
// Log or process report (e.g., send to monitoring)
}
CI/CD Integration:
# Example GitHub Actions step
- name: Generate Decomposer Report
run: php artisan decomposer:report --format=json > report.json
- name: Upload Report
uses: actions/upload-artifact@v3
with:
name: decomposer-report
path: report.json
config/decomposer.php):
'custom_fields' => [
'app' => [
'name' => env('APP_NAME'),
'env' => env('APP_ENV'),
],
],
Route::get('/report', function () {
return response()->json(Decomposer::getReport());
});
public function boot() {
$this->app->singleton('decomposer.report', function () {
return Decomposer::getReport();
});
}
Performance Overhead:
$report = Cache::remember('decomposer.report', now()->addHours(1), function () {
return Decomposer::getReport();
});
config('app.key')).Dependency Resolution:
composer.json changes. Run composer install first if discrepancies arise.composer.json can cause infinite loops in the report. Validate your composer.json separately.Environment Mismatches:
phpversion(), exec('uname')). Ensure these match your deployment environment to avoid "works on my machine" issues.Version Skew:
php artisan decomposer:report --verbose
DecomposerServiceProvider is registered in config/app.php.AppServiceProvider is overriding the report.Custom Report Formatters:
Implement the Lubusin\LaravelDecomposer\Contracts\ReportFormatter interface:
use Lubusin\LaravelDecomposer\Contracts\ReportFormatter;
class CustomFormatter implements ReportFormatter {
public function format(array $report): string {
return "Custom: " . json_encode($report);
}
}
Register in config/decomposer.php:
'formatters' => [
'custom' => \App\Services\CustomFormatter::class,
],
Filtering Packages: Exclude specific packages from the report:
Decomposer::setExcludedPackages(['vendor/package-to-exclude']);
Hooks:
Listen for DecomposerGenerated events to modify reports dynamically:
event(new DecomposerGenerated($report));
Compare Environments: Use the JSON output to diff reports between dev/staging/prod:
php artisan decomposer:report --format=json > prod-report.json
Then compare with jq or a diff tool.
Documentation:
Embed the markdown report in your project’s README.md as a "Setup Requirements" section:
## Environment Requirements
```include storage/app/public/decomposer-report.md```
Security: Restrict access to report endpoints in production:
Route::middleware(['auth:sanctum'])->get('/report', function () {
return Decomposer::getReport();
});
How can I help you explore Laravel packages today?