当前位置: 首页>>技术问答>>正文


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

webfans 技术问答 , , , , 去评论

问题描述

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

我知道这个文件夹包含为即时创建的生成的类:

  • 工厂

  • 代理

  • 插件

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

所以我正在寻找一个关于如何生成Interceptor.php文件的详细解释工作流程?

最佳解决办法

拦截器类是the interceptor design pattern的实现。拦截器是Magento 2的object system如何实现plugin system的方式。

作为客户端开发人员,理论上你不需要担心拦截器 – 你向对象管理器询问X类型的对象,并将它返回给你。您要求的对象可能是也可能不是拦截器,但从客户端程序员的角度来看,它的行为与non-interceptor版本相同。对象管理器如何决定在实现细节中返回或不返回拦截器。

对于对该实现细节感兴趣的人 – 如果该类或该类的父类配置了插件,则对象管理器返回一个拦截器。你可以在这里看到开发者模式拦截器类

#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 pre-scans系统在编译模式下,并记下哪些类需要插件。

至于实际生成,Magento使用PHP自动加载器处理这个问题。如果开发人员实例化一个类(或以其他方式触发带有类名的PHP自动加载事件(在类型提示中,class_exists类等),并且基于作曲家的自动加载器找不到类文件,则第二个注册的自动加载器

Magento\Framework\Code\Generator\Autoloader::load

被触发。这个自动加载器

vendor/magento/framework/Code/Generator/Autoloader.php

将(通过Magento\Framework\Code\Generator类间接)扫描类的某些命名模式。如果类名以Interceptor结尾,则Magento最终通过此类中的generateClass方法生成拦截器

vendor/magento/framework/Code/Generator.php

还有其他类/对象可以从Magento\Framework\Code\Generator中找出 – 但我们会将其作为练习留给读者。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2014.html,转载请务必附带本地址声明。