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
in di.xml
ofのモジュールを作成することで簡単に変更できます。
<?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のロジックを「乱雑」にできるようにするなど、他の理由がありますか?