Skip to content

Latest commit

 

History

History
112 lines (84 loc) · 3.62 KB

File metadata and controls

112 lines (84 loc) · 3.62 KB

Создание команд

Написание собственных команд отличается от написания команд для 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 автоматически загрузит команды всех установленных модулей при старте.


к содержанию