<?php declare(strict_types=1);
namespace Shopware\Core\Framework\DataAbstractionLayer\Command;
use Shopware\Core\Framework\Event\ProgressAdvancedEvent;
use Shopware\Core\Framework\Event\ProgressFinishedEvent;
use Shopware\Core\Framework\Event\ProgressStartedEvent;
use Shopware\Core\Framework\Log\Package;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Style\SymfonyStyle;
#[Package('core')]
trait ConsoleProgressTrait
{
/**
* @var SymfonyStyle|null
*/
protected $io;
/**
* @var ProgressBar|null
*/
protected $progress;
/**
* @return array<string, string>
*/
public static function getSubscribedEvents(): array
{
return [
ProgressStartedEvent::NAME => 'startProgress',
ProgressAdvancedEvent::NAME => 'advanceProgress',
ProgressFinishedEvent::NAME => 'finishProgress',
];
}
public function startProgress(ProgressStartedEvent $event): void
{
if (!$this->io) {
return;
}
$this->progress = $this->io->createProgressBar($event->getTotal());
$this->progress->setFormat("<info>[%message%]</info>\n%current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%");
$this->progress->setMessage($event->getMessage());
}
public function advanceProgress(ProgressAdvancedEvent $event): void
{
if (!$this->progress) {
return;
}
$this->progress->advance($event->getStep());
}
public function finishProgress(ProgressFinishedEvent $event): void
{
if (!$this->io) {
return;
}
if (!$this->progress) {
return;
}
if (!$this->progress->getMaxSteps()) {
return;
}
$this->progress->setMessage($event->getMessage());
$this->progress->finish();
$this->io->newLine(2);
}
}