Mi chiedevo perché non fosse possibile creare plugin per protectedmetodi. C'è questo pezzo di codice nel 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;
}
Verifica se il metodo è publicprima di consentirne l'intercettazione. Può essere facilmente modificato creando un preferencein nel di.xmlproprio modulo, ovviamente, in questo modo:
<?xml version="1.0"?>
<config>
<preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>
e riscrivendo il _getClassMethodscon il \ReflectionMethod::IS_PUBLICmodificato \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTEDall'interno del metodo.
Ma mi chiedo perché non sia possibile intercettare metodi protetti nella definizione del metodo originale? Ha un impatto notevole sulle prestazioni, o c'è qualche altra ragione per questo, come consentire ai moduli di terze parti di rendere la logica di Magento troppo "disordinata"?