Data Patch Magento 2: criar atributo de produto sem InstallData

Copiou um Setup/InstallData.php de um tutorial de 2018, rodou bin/magento setup:upgrade no 2.4.8 e o atributo não apareceu em canto nenhum do admin. Não é bug do seu módulo: InstallData e UpgradeData foram descontinuados no 2.3 e, desde o 2.4, o module.xml não declara mais setup_version — sem ela o Magento nem procura essas classes. Quem cria atributo hoje é o Data Patch.

A classe em Setup/Patch/Data

O caminho é app/code/Roger/Catalogo/Setup/Patch/Data/AddCorPredominante.php. O nome completo da classe vira o identificador do patch, então escolha com carinho:

<?php
namespace RogerCatalogoSetupPatchData;

use MagentoCatalogModelProduct;
use MagentoEavModelEntityAttributeScopedAttributeInterface;
use MagentoEavSetupEavSetupFactory;
use MagentoFrameworkSetupModuleDataSetupInterface;
use MagentoFrameworkSetupPatchDataPatchInterface;

class AddCorPredominante implements DataPatchInterface
{
    public function __construct(
        private ModuleDataSetupInterface $moduleDataSetup,
        private EavSetupFactory $eavSetupFactory
    ) {
    }

    public function apply()
    {
        $eavSetup = $this->eavSetupFactory->create(['setup' => $this->moduleDataSetup]);
        $eavSetup->addAttribute(Product::ENTITY, 'cor_predominante', [
            'type' => 'varchar',
            'label' => 'Cor predominante',
            'input' => 'text',
            'required' => false,
            'sort_order' => 100,
            'global' => ScopedAttributeInterface::SCOPE_STORE,
            'group' => 'General',
            'used_in_product_listing' => true,
        ]);

        return $this;
    }

    public static function getDependencies(): array
    {
        return [];
    }

    public function getAliases(): array
    {
        return [];
    }
}

Rode bin/magento setup:upgrade e o Magento grava esse nome de classe na tabela patch_list. É essa linha que garante que o patch roda uma vez só, mesmo que você chame setup:upgrade dez vezes seguidas.

Quando o patch não roda de novo

Errou uma opção do addAttribute e quer testar outra vez? Editar a classe não adianta, porque o registro em patch_list continua lá. Confira o que vai sair, apague e só então mande o upgrade:

mysql -u magento -p magento -e "SELECT patch_name FROM patch_list WHERE patch_name LIKE '%AddCorPredominante%'"
mysql -u magento -p magento -e "DELETE FROM patch_list WHERE patch_name LIKE '%AddCorPredominante%'"
bin/magento setup:upgrade

Isso é coisa de máquina de desenvolvimento, com dump do banco feito antes. Em produção, para mexer em atributo que já existe, escreva outro patch chamando updateAttribute. E se um dia renomear a classe, ponha o nome antigo no getAliases: senão o Magento entende como patch inédito e cria o atributo de novo.

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 *