Через CLI (Интерфейс командной строки) очень удобно выполнять длительные и ресурсоёмкие задачи, а с помощью Artisan Console мы можем создавать для этого свои собственные команды. Обычно я делаю специальные команды для приложений, требующих первоначальную настройку, либо для запуска запросов к очень большим базам данных.
В этом уроке я покажу вам, как создать свою artisan-команду и рассчитать время выполнения этой команды.
Существует два способа создания: на основе Класса и на основе Замыкания.
Команда-Класс создается через artisan-команду make:command. Она генерирует Класс в папку app/Console/Commands и далее вы настраиваете его под свои нужды.
Команда-Замыкание создается внутри файла routes/console.php вашего приложении Laravel.
В этом уроке мы рассмотрим Команду-Замыкание.
Создание Кастомной Команды
Сделаем команду для рассылки электронных писем. Добавьте в файл routes/console.php следующее:
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Artisan;
Artisan::command('send:emails', function(){
$this->comment('Processing');
app(UserController::class)->sendEmails();
$this->comment('Processed');
});
Теперь мы можем запустить нашу новую команду:
php artisan send:emails
Расчёт времени выполнения
Чтобы узнать за сколько времени отработала наша команда мы можем использовать хелпер-метод now(). Он возвращает экземпляр Carbon и теперь мы можем использовать методы diffInSeconds() или diffInMinutes(), в зависимости от того, что хотим получить.
Сперва мы определим время начала, а затем вычислим разницу между ним и временем окончания выполнения команды.
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Artisan;
Artisan::command('send:emails', function(){
$start = now();
$this->comment('Processing');
app(UserController::class)->sendEmails();
$time = $start->diffInSeconds(now());
$this->comment("Processed in $time seconds");
});
Вот пример работы:

Теперь вы знаете, как создавать кастомные команды и можете с помощью них провести первичную инициализацию приложения или выполнить ресурсоёмкую задачу через консоль.
Автор: Stephen Jude
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.
