Me preguntaba por qué no es posible crear complementos para protected
métodos. Hay esta pieza de código en 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;
}
Comprueba si el método es public
antes de permitir que sea interceptado. Se puede cambiar fácilmente mediante la creación de una preference
en el di.xml
de módulo propio, por supuesto, como este:
<?xml version="1.0"?>
<config>
<preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>
y reescribiendo _getClassMethods
con el \ReflectionMethod::IS_PUBLIC
cambio al \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED
interior del método.
Pero me pregunto por qué no es posible interceptar métodos protegidos en la definición de método original. ¿Tiene un impacto importante en el rendimiento, o hay alguna otra razón para eso, como permitir que los módulos de terceros hagan que la lógica de Magento sea demasiado "desordenada"?