Módulo Magento 2

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.

Post Recentes

Layout XML do Magento 2: remover bloco de módulo de terceiro

Um módulo de terceiro plantou um banner no topo da loja e você não quer desinstalar nada: tire o bloco…

2 horas atrás

Restaurar dump do Magento 2 em outro servidor: trocar a base_url no SQL

Importou o banco de produção e o site pula para o domínio antigo? Rode o UPDATE em core_config_data, limpe o…

24 horas atrás

Criar exceção customizada em PHP: quando estender Exception compensa

Seu catch trata pedido inexistente e banco fora do ar do mesmo jeito. Veja como criar exceção customizada em PHP…

2 dias atrás

DataProvider Magento 2: form do admin abre com campos vazios ao editar

O form do admin salva mas abre em branco na edição: veja o getData() indexado pelo id da entidade e…

3 dias atrás

register_post_meta com show_in_rest: campo personalizado no /wp-json

O meta está no banco mas some do /wp-json/wp/v2/posts. Veja o register_post_meta certo, com single, type, schema de array e…

3 dias atrás

IntlDateFormatter: data por extenso em pt-BR sem array de meses

Escreva 31 de agosto de 2026 em PHP 8.3 sem aquele array com os doze meses, usando IntlDateFormatter com pattern…

4 dias atrás