Мне было интересно, почему невозможно создать плагины для 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 слишком «грязной»?