Zastanawiałem się, dlaczego nie można tworzyć wtyczek dla protectedmetod. Ten fragment kodu znajduje się w 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;
}
Sprawdza, czy metoda jest publicprzed zezwoleniem na przechwycenie. To może być łatwo zmieniona przez stworzenie preferencew di.xmlwłasnego modułu, oczywiście, jak to:
<?xml version="1.0"?>
<config>
<preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>
i przepisanie _getClassMethodsze \ReflectionMethod::IS_PUBLICzmienionym na \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTEDwewnątrz metody.
Ale zastanawiam się, dlaczego nie jest możliwe przechwycenie chronionych metod w oryginalnej definicji metody? Czy ma to duży wpływ na wydajność, czy może ma to jakiś inny powód, na przykład pozwala innym modułom sprawić, że logika Magento będzie zbyt „nieuporządkowana”?