Fiquei me perguntando por que não é possível criar plugins para protected
mé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á public
antes de permitir sua interceptação. Ele pode ser facilmente alterado através da criação de um preference
no di.xml
de 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 _getClassMethods
com o \ReflectionMethod::IS_PUBLIC
alterado para \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED
dentro 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"?