Ich habe mich gefragt, warum es nicht möglich ist, Plugins für protectedMethoden zu erstellen . Es gibt diesen Code in 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;
}
Es wird geprüft, ob die Methode aktiviert ist, publicbevor das Abfangen zugelassen wird. Es kann leicht durch die Schaffung eines geändert werden preferencein der di.xmlvon eigenen Modul, natürlich, wie folgt aus :
<?xml version="1.0"?>
<config>
<preference for="Magento\Framework\Interception\Code\Generator\Interceptor" type="MyVendor\MyModule\Model\MyInterceptorModel" />
</config>
und das Umschreiben _getClassMethodsmit dem innerhalb der Methode \ReflectionMethod::IS_PUBLICgeänderten \ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED.
Aber ich frage mich, warum es nicht möglich ist, geschützte Methoden in der ursprünglichen Methodendefinition abzufangen. Hat es einen großen Einfluss auf die Leistung oder gibt es einen anderen Grund dafür, zum Beispiel zuzulassen, dass Module von Drittanbietern die Magento-Logik zu "chaotisch" machen?