При створенні командних інструментів у 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 більш інтуїтивними і легкими у використанні.