Написание собственных команд отличается от написания команд для Symfony Console только классом-родителем. Для работы с BxConsole классы команд нужно наследовать от:
\App\BxConsole\BxCommandИмя и описание команды задаются через PHP 8 атрибут #[Command]:
<?php
namespace Acme\Cli;
use App\BxConsole\Annotations\Command;
use App\BxConsole\BxCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
#[Command(
name: 'acme:hello',
description: 'Тестовая команда'
)]
class HelloCommand extends BxCommand
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
$output->writeln('<info>Hello, Bitrix!</info>');
return self::SUCCESS;
}
}Symfony Console поддерживает теги для окраски вывода:
$output->writeln('<info>Успешно</info>'); // зелёный
$output->writeln('<comment>Внимание</comment>'); // жёлтый
$output->writeln('<error>Ошибка</error>'); // красныйДля батч-обработки удобно использовать ProgressBar. Паттерн clear()/display() позволяет
выводить сообщения прямо во время работы прогрессбара без визуальных артефактов:
use Symfony\Component\Console\Helper\ProgressBar;
$progressBar = new ProgressBar($output, $total);
$progressBar->setFormat('%current%/%max% [%bar%] %percent:3s%% | %message%');
$progressBar->setMessage('ok=0 err=0 skip=0');
$progressBar->start();
foreach ($items as $item) {
try {
$this->processItem($item);
$ok++;
} catch (\Throwable $e) {
$err++;
// clear убирает строку прогрессбара, display — восстанавливает её после вывода
$progressBar->clear();
$output->writeln(sprintf('<error>ERROR: %s</error>', $e->getMessage()));
$progressBar->display();
}
$progressBar->setMessage(sprintf('ok=%d err=%d', $ok, $err));
$progressBar->advance();
}
$progressBar->finish();
$output->writeln(''); // перенос строки после завершения прогрессбараПолный пример команды с прогрессбаром — examples/merchant.php.
if (!\Bitrix\Main\Loader::includeModule('acme.module')) {
$output->writeln('<error>Не удалось подключить модуль acme.module</error>');
return self::FAILURE;
}По аналогии с Console Jedi, свои консольные команды
можно размещать в модулях Битрикс. Для этого в файле vendor.module/.cli.php нужно описать команды:
<?php
return [
'commands' => [
new \Acme\Module\Command\HelloCommand(),
],
];BxConsole автоматически загрузит команды всех установленных модулей при старте.