Comando CLI Magento 2: criar a classe e registrar no di.xml

A classe do comando está escrita, o módulo está habilitado e o bin/magento list continua sem citar ele. O Magento 2 não descobre comando por convenção de pasta: enquanto a classe não entrar no array de MagentoFrameworkConsoleCommandListInterface pelo di.xml, o console não sabe que ela existe.

A classe

Em app/code/MeuVendor/Sync/Console/Command/ProdutoSync.php, estendendo o Command do Symfony:

<?php
namespace MeuVendorSyncConsoleCommand;

use MagentoFrameworkConsoleCli;
use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;

class ProdutoSync extends Command
{
    protected function configure(): void
    {
        $this->setName('meuvendor:produto:sync');
        $this->setDescription('Sincroniza produtos com o ERP');
        parent::configure();
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $output->writeln('Sincronizando...');

        return Cli::RETURN_SUCCESS;
    }
}

O registro em etc/di.xml

Este é o trecho que faltava, em app/code/MeuVendor/Sync/etc/di.xml. É o di.xml global mesmo, não o de adminhtml nem o de frontend: o console roda na área crontab/global. O name do item é livre, mas precisa ser único na instalação inteira, senão um módulo sobrescreve o comando do outro.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="MagentoFrameworkConsoleCommandListInterface">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="meuvendor_produto_sync" xsi:type="object">MeuVendorSyncConsoleCommandProdutoSync</item>
            </argument>
        </arguments>
    </type>
</config>

Sem o xmlns:xsi declarado no config o arquivo não passa na validação do XSD e o setup:upgrade reclama. Por baixo o CommandList recebe esse array pelo construtor e entrega tudo pro MagentoFrameworkConsoleCli, que monta a aplicação do Symfony. O próprio core faz assim: o cron:run está registrado nesse formato no etc/di.xml do Magento_Cron.

Fazer o console enxergar

Com o módulo declarado no registration.php e no etc/module.xml, é essa sequência:

bin/magento module:enable MeuVendor_Sync
bin/magento setup:upgrade
bin/magento cache:clean config
bin/magento list | grep meuvendor

Em modo produção o di já está compilado, então cache:clean não basta: rode bin/magento setup:di:compile depois de qualquer mexida no di.xml. Se ainda não aparecer, apague generated/metadata e generated/code — em produção só com a loja em manutenção, porque até o setup:di:compile terminar o site fica fora do ar. É quase sempre metadado velho grudado, não erro no seu XML.

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *