Ich habe mich gefragt, warum es nicht möglich ist, Plugins für protected
Methoden 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, public
bevor das Abfangen zugelassen wird. Es kann leicht durch die Schaffung eines geändert werden preference
in der di.xml
von 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 _getClassMethods
mit dem innerhalb der Methode \ReflectionMethod::IS_PUBLIC
geä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?