Answers:
拦截器类是拦截器设计模式的实现。拦截器是Magento 2的对象系统如何实现插件系统的方式。
作为客户开发人员,理论上是您不必担心拦截器-您向对象管理器询问X类型的对象,然后将其返回给您。您要求的对象可能是也可能不是拦截器,但是从客户端程序员的角度来看,它的行为与非拦截器版本相同。对象管理器如何决定在实现细节中返回或不返回拦截器。
对于对此实现细节感兴趣的人-如果某个类或该类的父类配置了插件,则对象管理器将返回拦截器。您可以在开发人员模式拦截器类中看到这一点
#File: vendor/magento/framework/Interception/ObjectManager/Config/Developer.php
public function getInstanceType($instanceName)
{
$type = parent::getInstanceType($instanceName);
if ($this->interceptionConfig && $this->interceptionConfig->hasPlugins($instanceName)
&& $this->interceptableValidator->validate($instanceName)
) {
return $type . '\\Interceptor';
}
return $type;
}
对于生产环境(即编译模式),Magento在编译模式下预扫描系统,并记下哪些类需要插件。
对于实际的一代,Magento用PHP自动加载器来处理。如果开发人员实例化一个类(或以类名(在类型提示,class_exists
类等中)触发PHP自动加载事件,并且基于作曲家的自动加载器找不到该类文件,则第二个注册的自动加载器
Magento\Framework\Code\Generator\Autoloader::load
被触发。该自动装带器
vendor/magento/framework/Code/Generator/Autoloader.php
将(间接通过Magento\Framework\Code\Generator
该类)扫描该类以查找某些命名模式。如果类名以结尾Interceptor
,Magento最终通过generateClass
此类中的方法生成一个Interceptor
vendor/magento/framework/Code/Generator.php
还有其他类/对象可以从中追溯出来,Magento\Framework\Code\Generator
但是我们将其留给读者练习。