Laravel Tutorials

Dependency Injection in Laravel Closure Commands

Published
Dependency Injection in Laravel Closure Commands image

Laravel's closure-based Artisan commands support full dependency injection, allowing you to inject services directly into command parameters alongside traditional arguments and options.

The service container automatically resolves dependencies when you type-hint them in your closure parameters:

use App\Services\EmailService;
 
Artisan::command('email:digest {recipient}', function (EmailService $emailer, string $recipient) {
$emailer->sendDigest($recipient);
});

This feature combines the convenience of inline commands with Laravel's powerful dependency resolution system.

use App\Services\ReportGenerator;
use App\Services\FileUploader;
use App\Models\Customer;
 
Artisan::command('reports:generate {customer_id} {--format=pdf}', function (
ReportGenerator $generator,
FileUploader $uploader,
string $customer_id
) {
$customer = Customer::findOrFail($customer_id);
$format = $this->option('format');
 
$this->info("Generating {$format} report for {$customer->name}");
 
$reportData = $generator->createCustomerReport($customer, $format);
 
$filename = "customer-{$customer_id}-report." . $format;
$uploadPath = $uploader->store($reportData, 'reports/' . $filename);
 
$this->info("Report generated successfully");
$this->line("File location: {$uploadPath}");
 
if ($this->confirm('Send report via email?')) {
$customer->notify(new ReportGeneratedNotification($uploadPath));
$this->info("Email notification sent");
}
});
 
Artisan::command('cleanup:temp-files {--days=7}', function (
FilesystemManager $filesystem,
CacheManager $cache
) {
$days = (int) $this->option('days');
$cutoffDate = now()->subDays($days);
 
$this->info("Cleaning files older than {$days} days");
 
$tempPath = storage_path('app/temp');
$files = $filesystem->disk('local')->allFiles('temp');
 
$deletedCount = 0;
foreach ($files as $file) {
$lastModified = $filesystem->disk('local')->lastModified($file);
 
if ($lastModified < $cutoffDate->timestamp) {
$filesystem->disk('local')->delete($file);
$deletedCount++;
}
}
 
$cache->tags(['temp-files'])->flush();
 
$this->info("Cleanup completed: {$deletedCount} files removed");
});

Dependency injection in closure commands enables rapid prototyping while maintaining clean architecture and testability throughout your command-line utilities.

Harris Raftopoulos photo

Senior Software Engineer • Staff & Educator @ Laravel News • Co-organizer @ Laravel Greece Meetup

Sponsored

laravelcloud logo
Laravel Cloud

Easily create and manage your servers and deploy your Laravel applications in seconds.

Visit Laravel Cloud

The latest

View all →
CPX: The Composer Package Executor for PHP image

CPX: The Composer Package Executor for PHP

Read article
Laravel AI SDK Adds Human-in-the-Loop Tool Approval image

Laravel AI SDK Adds Human-in-the-Loop Tool Approval

Read article
Pest 5 Released With Test Impact Analysis, Agent Verification, and Evals image

Pest 5 Released With Test Impact Analysis, Agent Verification, and Evals

Read article
Queue-SQL: Run Mass Deletes and Updates Across Parallel Queue Jobs image

Queue-SQL: Run Mass Deletes and Updates Across Parallel Queue Jobs

Read article
Blade Formatting in Laravel Pint image

Blade Formatting in Laravel Pint

Read article
Inertia DevTools Is Now on the Chrome Web Store image

Inertia DevTools Is Now on the Chrome Web Store

Read article