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

serpapi logo
SerpApi

The Web Search API for Your LLM and AI Applications

Visit SerpApi

The latest

View all →
Decide with Jev: Laravel AI That Answers with a Probability image

Decide with Jev: Laravel AI That Answers with a Probability

Read article
JetBrains Air: Run AI Coding Agents in JetBrains IDEs image

JetBrains Air: Run AI Coding Agents in JetBrains IDEs

Read article
Memoize Tagged Cache Reads in Laravel image

Memoize Tagged Cache Reads in Laravel

Read article
Eloquent Refreshes: Load Generated Columns After Save image

Eloquent Refreshes: Load Generated Columns After Save

Read article
Laravel AI SDK 1.0 Adds Classification and Tool Approvals image

Laravel AI SDK 1.0 Adds Classification and Tool Approvals

Read article
Tagged Memoized Cache and Model Refreshes in Laravel 13.33 image

Tagged Memoized Cache and Model Refreshes in Laravel 13.33

Read article