Je me demandais pourquoi il n'était pas possible de créer des plugins pour les protectedméthodes. Il y a ce morceau de code dans 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;
}
Il vérifie si la méthode est publicavant de permettre son interception. Il peut être facilement modifié en créant un preferencedans le di.xmlpropre module, bien sûr, comme ceci:
<?xml version="1.0"?>
<config>
<preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>
et réécriture du _getClassMethodsavec le \ReflectionMethod::IS_PUBLICchangé à l' \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTEDintérieur de la méthode.
Mais je me demande pourquoi il n'est pas possible d'intercepter des méthodes protégées dans la définition de méthode d'origine? Cela a-t-il un impact majeur sur les performances, ou il y a une autre raison à cela, comme autoriser des modules tiers à rendre la logique de Magento trop "désordonnée"?