Magento 2:var / generation中的Interceptors文件是什么?


24

所以我注意到其中的一些Interceptor.php文件var/generation

我知道此文件夹包含为以下内容即时创建的生成的类:

  • 工厂工厂
  • 代理人
  • 外挂程式

我假设拦截器文件链接到插件文件,但是有时我不知道这些文件是如何生成的。例如,我有,var/generation/Magento/Framework/App/Response/Http/Interceptor.php但此文件似乎与任何现有类都不匹配。

因此,我正在寻找有关Interceptor.php文件如何生成的详细解释的工作流程?

Answers:


32

拦截器类是拦截器设计模式的实现。拦截器是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但是我们将其留给读者练习。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.