Мне было интересно, почему невозможно создать плагины для protectedметодов. Этот фрагмент кода есть в 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;
}
Он проверяет, есть ли метод, publicпрежде чем разрешить его перехват. Это может быть легко изменено путем создания preferenceв di.xmlсобственном модуле, конечно, так:
<?xml version="1.0"?>
<config>
<preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>
и переписать _getClassMethodsс \ReflectionMethod::IS_PUBLICизмененным \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTEDвнутри метода.
Но мне интересно, почему невозможно перехватить защищенные методы в исходном определении метода? Влияет ли это на производительность или есть какая-то другая причина, например, позволяющая сторонним модулям делать логику Magento слишком «грязной»?