Fiquei me perguntando por que não é possível criar plugins para protectedmétodos. Há esse pedaço de código no Magento\Framework\Interception\Code\Generator\Interceptor:
protected function _getClassMethods()
{
$methods = [$this->_getDefaultConstructorDefinition()];
$reflectionClass = new \ReflectionClass($this->getSourceClassName());
$publicMethods = $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC);
foreach ($publicMethods as $method) {
if ($this->isInterceptedMethod($method)) {
$methods[] = $this->_getMethodInfo($method);
}
}
return $methods;
}
Ele verifica se o método está publicantes de permitir sua interceptação. Ele pode ser facilmente alterado através da criação de um preferenceno di.xmlde próprio módulo, é claro, como este:
<?xml version="1.0"?>
<config>
<preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>
e reescrevendo o _getClassMethodscom o \ReflectionMethod::IS_PUBLICalterado para \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTEDdentro do método.
Mas eu me pergunto por que não é possível interceptar métodos protegidos na definição do método original? Isso tem um grande impacto no desempenho ou há outra razão para isso, como permitir que módulos de terceiros tornem a lógica do Magento muito "bagunçada"?