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.