Написание CLI консольного приложения для Joomla 4



Консольные приложения в Joomla 4

Joomla 4 поставляется с обновленным способом написания команд CLI. Мы постараемся осветить здесь наиболее важные изменения и научим вас, как писать собственные команды CLI в Joomla 4.

Краткий обзор изменений в Joomla 4

Когда вы создавали приложение CLI в Joomla 4, вы создавали полный экземпляр приложения, расширяя JApplicationCli. В Joomla 4 вместо создания полностью нового экземпляра приложения мы создали новое приложение для CMS Joomla, которое использует Symfony Console component, чтобы сделать процесс интеграции ваших компонентов намного проще, чем это было ранее. Способ создания приложения Joomla 3 с помощью приложения JApplication будет работать в Joomla 4, однако он устарел и будет удален в Joomla 5.

Новый консольный пакет Console Package (новый пакет в версии 2 платформы Joomla Framework) содержит базовый код и расширен в CMS для добавления поддержки таких вещей, как использование JInput.

Преимущество нового способа заключается в том, что у нас есть одно приложение, которое означает, что использование JApplication::isClient('cli') будет работать. Внедрение интерфейса \\Joomla\\CMS\\Application\\CMSApplicationInterface означает, что все приложения в Joomla должны иметь согласованный набор методов, доступных для использования расширениями.

Создание консольной команды для Joomla 4

Самая элементарная команда просто выводит заголовок и некоторый текст в терминал.

	/**
	 * The default command name
	 *
	 * @var    string
	 * @since  4.0.0
	 */
	protected static $defaultName = 'commandgroup:commandname';

	/**
	 * Internal function to execute the command.
	 *
	 * @param   InputInterface   $input   The input to inject into the command.
	 * @param   OutputInterface  $output  The output to inject into the command.
	 *
	 * @return  integer  The command exit code
	 *
	 * @since   4.0.0
	 */
	protected function doExecute(InputInterface $input, OutputInterface $output): int
	{
		$symfonyStyle = new SymfonyStyle($input, $output);

		$symfonyStyle->title('Hello World Command Title');

		// You might want to do some stuff here in Joomla

		$symfonyStyle->success('Hello World!');

		return 0;
	}

	/**
	 * Configure the command.
	 *
	 * @return  void
	 *
	 * @since   4.0.0
	 */
	protected function configure(): void
	{
		$this->setDescription('This command prints hello world to whoever calls it');
		$this->setHelp(
			<<<EOF
The <info>%command.name%</info> command prints hello world to whoever calls it
<info>php %command.full_name%</info>
EOF
		);
	}

Давайте рассмотрим 3 части этого кода:

  • function configure():
    • Настраивает информацию о команде, настраивает информацию в классе, которая отображается, когда пользователь перечисляет справочную информацию для команды
  • function doExecute(InputInterface $input, OutputInterface $output):
    • Этот метод выполняет работу команды - обычно вы идете и выполняете компонент Joomla здесь и сейчас (т.о. отправляете диспетчер компонентов)
  • static $defaultName = 'commandgroup:commandname':
    • Это имя команды, которое выполняется при выполнении (помните, что мы вернемся к нему через секунду!)

Если вам нужна дополнительная помощь, есть отличное видео, созданное в рамках нашей программы GSOC 2018, которое поможет вам, при условии, что вы способны выносить иностранную речь на английском языке! (Для просмотра видео, просто кликните по картинке ниже:)

Создание консольной команды для Joomla 4

Добавление консольной команды в приложение с помощью плагина Joomla 4

Внутри вашего плагина вы собираетесь зарегистрироваться на событие \Joomla\Application\ApplicationEvents::BEFORE_EXECUTE, используя метод getSubscribedEvents. В следующем примере требуется команда RunHelloCommand и её регистрация.

class PlgsystemMyConsole extends CMSPlugin implements SubscriberInterface
{

    public static function getSubscribedEvents(): array
    {
        return [
            \Joomla\Application\ApplicationEvents::BEFORE_EXECUTE => 'registerCommands',
        ];
    }

    public function registerCommands(): void
    {
        $serviceId = 'hello.world';

        Factory::getContainer()->share(
            $serviceId,
            function (\Psr\Container\ContainerInterface $container) {
                // сделайте что-нибудь, чтобы создать класс консольной команды и вернуть его
                return new RunHelloCommand();
            },
            true
        );

        Factory::getContainer()->get(\Joomla\CMS\Console\Loader\WritableLoaderInterface::class)->add('hello:world', $serviceId);
    }

}

Этот метод registerCommands добавляет вашу команду в контейнер для внедрения зависимостей (Dependency Injection Container), а затем регистрирует эту команду по имени команды, когда она вызывается приложением Joomla CLI (обратите внимание, что первый параметр WritableLoaderInterface::add() должен совпадать со свойством defaultName в вашем классе команд.

Вызов консольной команды в CMS Joomla 4

Чтобы вызвать только что созданную команду, вам нужно запустить ее с помощью команды Joomla CLI:

php cli/joomla.php my:command

Перевод с английского официальной документации Joomla 4:
https://docs.joomla.org/J4.x:Writing_A_CLI_Application

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню