Me preguntaba por qué no es posible crear complementos para protectedmé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 publicantes de permitir que sea interceptado. Se puede cambiar fácilmente mediante la creación de una preferenceen el di.xmlde 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 _getClassMethodscon el \ReflectionMethod::IS_PUBLICcambio al \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTEDinterior 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"?