我想知道为什么无法为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逻辑过于“混乱”?