Desenvolvimento Magento 2

Plugin do Magento 2 não executa: método final, private ou objeto novo

Você declarou o plugin no di.xml, limpou cache, e o before continua sem disparar. Nem um error_log() na primeira linha aparece. Antes de reescrever o módulo, confirme se o Magento chegou a gerar o interceptor: isso já elimina metade das hipóteses.

O interceptor existe?

Toda classe interceptada ganha uma classe filha em generated/code/. Se o arquivo não existe, ou existe mas não traz o seu método, o Magento nem tentou chamar você:

cd /var/www/loja
ls generated/code/Magento/Catalog/Model/Product/Interceptor.php
sudo -u www-data php bin/magento dev:di:info 'MagentoCatalogModelProduct'

# em production mode nada é gerado em runtime
sudo -u www-data rm -rf generated/code generated/metadata
sudo -u www-data php bin/magento setup:di:compile

Rode o rm e o compile como o usuário do PHP e em janela de manutenção: arquivo gerado com dono errado derruba a loja com erro de permissão, e enquanto o compile roda a loja fica sem interceptor nenhum.

O dev:di:info devolve a preference aplicada, os parâmetros do construtor e uma tabela de plugins com as colunas Plugin, Method e Type. Repare no cabeçalho da saída: ele lê só a área GLOBAL. Plugin declarado em etc/frontend/di.xml ou etc/adminhtml/di.xml não aparece nessa lista, então a ausência sozinha não condena a sua declaração.

As três causas de sempre

  1. Método final, private, protected ou static, ou a classe inteira marcada como final. O interceptor herda a classe e sobrescreve o método público; o que é final não dá pra sobrescrever. Construtor e destrutor também ficam de fora.
  2. O objeto foi criado com new no código que chama. Plugin só pega instância entregue pelo ObjectManager, ou seja, injetada no construtor ou vinda de uma factory gerada.
  3. di.xml na área errada. Plugin em etc/adminhtml/di.xml não roda no frontend nem em chamada REST. Se precisa valer em todo canto, o lugar é etc/di.xml.

Sobrou tudo certo e ainda passa reto? Procure por disabled="true" em outros módulos usando o mesmo valor de name no seu plugin: qualquer módulo carregado depois pode desligar o seu com uma linha só.

Post Recentes

Creation of dynamic property: deprecated no PHP 8.3 com WordPress 6.9

debug.log crescendo em gigabytes com avisos de propriedade dinâmica. Veja como isolar o plugin culpado, corrigir a classe e silenciar…

2 horas atrás

Criar swapfile no Ubuntu: parar o OOM killer de matar o MySQL

VPS de 2 GB onde o mysqld morre de madrugada e o site volta com erro de conexão. Como confirmar…

2 dias atrás

Grupos nomeados no preg_match: pare de contar índice de $matches

Regex com cinco parênteses e ninguém lembra se a data é $matches[2] ou $matches[3]. Nomeie os grupos e leia o…

3 dias atrás

Token de integração da API do Magento 2: gerar e usar no header Bearer

Erro The consumer isn't authorized to access resources ao chamar a REST do Magento 2.4.8? Ative a integração, libere os…

3 dias atrás

Rate limit no wp-login.php com nginx: barrar força bruta antes do PHP

Bots batendo centenas de POST por minuto no login derrubam a CPU. Configure limit_req_zone no nginx e devolva 429 antes…

4 dias atrás

Anonimizar IP no nginx: mascarar o último octeto do log para a LGPD

Seu access.log guarda o IP inteiro dos visitantes há meses sem necessidade. Mascare o último octeto com map e log_format…

5 dias atrás