Метод withProgressBar
Метод withProgressBar применяется к экземпляру класса Command
и позволяет визуализировать прогресс выполнения длительных операций.
Первым параметром передаётся количество шагов (итераций), вторым -
замыкание (callable), которое будет выполнено для каждого шага.
Метод автоматически обновляет индикатор выполнения после каждой итерации
и возвращает массив результатов, собранных из замыкания.
Синтаксис
<?php
$res = $this->withProgressBar($steps, function ($item) {
// Обработка элемента
return $result;
});
?>
Пример
Давайте обработаем массив пользователей и выведем прогресс выполнения:
<?php
namespace AppConsoleCommands;
use IlluminateConsoleCommand;
class ProgressExample extends Command
{
protected $signature = 'app:progress';
protected $description = 'Test progress bar';
public function handle()
{
$users = ['user1', 'user2', 'user3', 'user4', 'user5'];
$res = $this->withProgressBar($users, function ($user) {
sleep(1);
return strtoupper($user);
});
$this->info('Processed: ' . implode(', ', $res));
}
}
?>
Результат выполнения команды:
"Processed: USER1, USER2, USER3, USER4, USER5"
Пример
Используем прогресс-бар для обработки записей из базы данных:
<?php
namespace AppConsoleCommands;
use IlluminateConsoleCommand;
use AppModelsArticle;
class UpdateArticles extends Command
{
protected $signature = 'app:update-articles';
protected $description = 'Update all articles';
public function handle()
{
$articles = Article::where('status', 'pending')->get();
$res = $this->withProgressBar($articles, function ($article) {
$article->status = 'published';
$article->save();
return $article->id;
});
$this->info('Updated articles: ' . count($res));
}
}
?>
Результат выполнения кода:
"Updated articles: 10"
Пример
Прогресс-бар с явным указанием количества итераций:
<?php
namespace AppConsoleCommands;
use IlluminateConsoleCommand;
class GenerateReports extends Command
{
protected $signature = 'app:generate-reports';
protected $description = 'Generate report files';
public function handle()
{
$total = 100;
$res = [];
$this->withProgressBar($total, function ($i) use (&$res) {
$res[] = "report_" . $i . ".pdf";
sleep(0.1);
});
$this->info('Generated ' . count($res) . ' reports');
}
}
?>
Результат выполнения кода:
"Generated 100 reports"