Мені було цікаво, чому неможливо створити плагіни для 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 занадто "брудною"?