Впровадження залежностей у замиканні команд Laravel

0
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 03 липня, 2025
Ви коли-небудь замислювалися, як максимально ефективно використовувати Artisan команди в Laravel? Досліджте, як впровадження залежностей у команди на основі closure може значно спростити вашу розробку і підвищити тестованість вашого коду

Команди Artisan на основі closures у Laravel підтримують повну ін'єкцію залежностей, що дає змогу впроваджувати сервіси безпосередньо в параметри команд разом із традиційними аргументами та опціями.

Контейнер сервісів автоматично розв'язує залежності, якщо ви вказуєте їх у параметрах closures:

use App\Services\EmailService;

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

Ця функція поєднує зручність інлайн-команд із потужною системою розв'язання залежностей Laravel.

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("Генерація звіту у форматі {$format} для {$customer->name}");

    $reportData = $generator->createCustomerReport($customer, $format);

    $filename = "customer-{$customer_id}-report." . $format;
    $uploadPath = $uploader->store($reportData, 'reports/' . $filename);

    $this->info("Звіт успішно згенеровано");
    $this->line("Розташування файлу: {$uploadPath}");

    if ($this->confirm('Відправити звіт електронною поштою?')) {
        $customer->notify(new ReportGeneratedNotification($uploadPath));
        $this->info("Сповіщення надіслано");
    }
});

Artisan::command('cleanup:temp-files {--days=7}', function (
    FilesystemManager $filesystem,
    CacheManager $cache
) {
    $days = (int) $this->option('days');
    $cutoffDate = now()->subDays($days);

    $this->info("Очищення файлів старше {$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("Очищення завершено: видалено {$deletedCount} файлів");
});

Ін'єкція залежностей у командних closures дозволяє швидко презентувати ідеї, зберігаючи чисту архітектуру та тестованість ваших командних утиліт.

Популярні

Logomark Logotype

Що нового в PHP 8.5

PHP 8.5 обіцяє безліч нових можливостей, таких як оператор Pipe, функції `array_first()` та `array_last()`, а також нове розширення URI. Чи готові ви дізнатися, як ці функції можуть спростити вашу розробку? Читайте далі, щоб дізнатися більше про ці захоплюючі нововведення

Logomark Logotype

Обробка геопросторових даних за допомогою Laravel Magellan

Ви готові відкрити нові горизонти у роботі з геопросторовими даними в Laravel? Дізнайтеся, як за допомогою PostGIS та пакету Laravel-Magellan можна легко зберігати, запитувати та маніпулювати інформацією про розташування, перетворюючи ваші проекти на вражаючі рішення у сфері картографії та геолокації!

Logomark Logotype

Перетворення даних у типобезпечні DTO за допомогою пакету Data Model

Досліджуйте новий пакет Data Model для PHP, який спрощує процес гідратації об'єктів без зайвих складнощів! Дізнайтеся, як впровадження типобезпечних об'єктів може революціонізувати ваш підхід до розробки, читаючи нашу статтю