Впровадження залежностей у замиканні команд 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

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

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

Logomark Logotype

4 поширені помилки Vite у Laravel

Використання Vite для створення фронтенд-ресурсів у вашому додатку Laravel може бути захоплюючим, але іноді ви можете стикнутися з певними помилками. У цій статті ми розглянемо чотири поширені помилки, з якими ви можете зіткнутися, а також підкажемо способи їх усунення, щоб ви могли знову зосередитися на розробці вашого додатку