Інтерактивні команди консолі в Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 19 січня, 2025
Створення інструментів командного рядка в Laravel може ставити певні виклики, особливо при обробці неналежного чи відсутнього вводу від користувача. Дізнайтеся, як за допомогою інтерфейсу PromptsForMissingInput перетворити ваші Artisan команди в інтуїтивно зрозумілі діалоги, які полегшать взаємодію з користувачем!

При створенні командних інструментів у Laravel однією з поширених проблем є коректна обробка відсутнього або некоректного введення даних користувача. Трейти PromptsForMissingInput від Laravel вирішують цю ситуацію, перетворюючи стандартні команди Artisan на інтерактивні діалоги.

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

use Illuminate\Console\Command;
use Illuminate\Contracts\Console\PromptsForMissingInput;

class PublishContent extends Command implements PromptsForMissingInput
{
    protected $signature = 'content:publish {type} {status}';

    protected function promptForMissingArgumentsUsing(): array
    {
        return [
            'type' => 'Який тип контенту ви публікуєте?',
            'status' => 'Чи має це бути опублікованим як чернетка чи в реальному режимі?'
        ];
    }
}

Розглянемо практичний приклад команди для резервного копіювання бази даних з інтерактивними запитаннями:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Contracts\Console\PromptsForMissingInput;

class BackupDatabase extends Command implements PromptsForMissingInput
{
    protected $signature = 'db:backup
        {connection? : З\'єднання з базою даних для резервного копіювання}
        {--tables=* : Конкретні таблиці для резервного копіювання}
        {--compress : Стиснути резервну копію}';
        
    protected $description = 'Створити резервну копію бази даних';

    protected function promptForMissingArgumentsUsing(): array
    {
        return [
            'connection' => fn () => choice(
                'Яке з\'єднання до бази даних потрібно резервно копіювати?',
                [
                    'mysql' => 'Основна база даних MySQL',
                    'sqlite' => 'Тестова база даних SQLite',
                    'pgsql' => 'База даних PostgreSQL для аналітики'
                ],
                'mysql'
            ),
            '--tables' => fn () => multiChoice(
                'Виберіть таблиці для резервного копіювання (залиште порожнім для всіх):',
                $this->getAvailableTables()
            ),
            '--compress' => fn () => confirm(
                'Бажаєте стиснути резервну копію?',
                true
            )
        ];
    }

    private function getAvailableTables(): array
    {
        // Отримати таблиці з бази даних
        return ['users', 'posts', 'comments', 'orders'];
    }

    public function handle()
    {
        $connection = $this->argument('connection');
        $tables = $this->option('tables');
        $compress = $this->option('compress');
        $this->info("Розпочинаємо резервне копіювання бази даних {$connection}...");

        // Логіка резервного копіювання...
    }
}

Інтерфейс PromptsForMissingInput перетворює взаємодію командного рядка на зрозумілі діалоги, роблячи ваші команди Artisan більш інтуїтивними і легкими у використанні.