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


Magento 2:模块开发人员应该如何阅读自己的配置文件

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

问题描述

场景:我是Magento 2模块开发人员。我想在app/etc中创建配置文件。我希望这个文件按区域为”scoped”

app/etc/my_file.xml
app/etc/frontend/my_file.xml
app/etc/adminhtml/my_file.xml

在Magento 1中,我只是创建一个config.xml并继续前进。区域范围发生在XML文件本身中。然而,Magento 2的处理方式截然不同

在Magento 2中,我应该创建什么类文件(s?)来读取这些作用域配置文件。从Magento 2来源不清楚”the right”的做法是什么。核心代码采用多种方法,并且没有一种方法用@api方法标记。这使得很难知道如何继续这个常见的模块开发人员任务。作为辅助side-effect,它还使得很难知道Magento模块开发人员应该如何从核心配置文件中读取。

一方面,看起来像”the right”做的事情就是创建一个文件系统读者对象。例如,Magento似乎使用以下内容加载import.xml文件

#File: vendor/magento/module-import-export/Model/Import/Config/Reader.php
namespace Magento\ImportExport\Model\Import\Config;

class Reader extends \Magento\Framework\Config\Reader\Filesystem
{

    public function __construct(
        //...
        $fileName = 'import.xml',
        //...
    ) {
        parent::__construct(
            $fileResolver,
            $converter,
            $schemaLocator,
            $validationState,
            $fileName,
            $idAttributes,
            $domDocumentClass,
            $defaultScope
        );
    }
    //...
}        

基本Magento\Framework\Config\Reader\Filesystem类看起来像是有代码来解析区域范围。

但是,一些Magento配置文件似乎避开了这种模​​式。虽然有这些文件的读者(本例中为event.xml)

vendor/magento/framework/Event/Config/Reader.php

还有使用这些阅读器的”scoped data”类。

#File: vendor/magento/framework/Event/Config/Data.php
class Data extends \Magento\Framework\Config\Data\Scoped
{
    public function __construct(
        \Magento\Framework\Event\Config\Reader $reader,
        //...
    ) {
        parent::__construct($reader, $configScope, $cache, $cacheId);
    }
}

这使得看起来像范围的读者类是模块开发人员应该创建的。但并非所有配置文件都具有这些范围的读者。

是否有明确的Magento 2模块开发人员可以遵循的路径?或者这只是Magento 2模块开发人员应该以自己的方式处理的事情,而由此产生的混乱/non-standard-configuration加载只是开展业务的成本?

official documentation可以很好地覆盖一些可用的类,但没有任何东西可以协调我们没有明确的指导我们假设使用哪个具体实现,或者期望是每个模块决定如何自己做这个。

最佳解决方法

要创建新的配置类型,模块开发人员应创建配置客户端将使用的配置类型类。

为了使这些类型类尽可能简单,读取配置文件和缓存数据的所有行为都被移动到\Magento\Framework\Config\DataInterface,并带有两个可重用的实现:

  • \Magento\Framework\Config\Data – 用于仅在一个范围内加载的配置类型(仅在全局范围内为eav_attributes.xml)

  • \Magento\Framework\Config\Data\Scoped – 适用于可以加载到不同范围的配置类型(events.xml – global和per-area)

每个配置类型都应该有pre-configured Config\DataInterface对象。可以使用Virtual Type或继承进行配置。

虽然模块开发人员可以在技术上从Config\DataInterface实现继承其配置类型,但建议不要从核心类扩展。总是更好地使用组合物。

现在,\Magento\Framework\Config\DataData\Scoped仅对\Magento\Framework\Config\ReaderInterface执行缓存和委托配置读取。 ReaderInterface应该以PHP数组的格式为请求的范围提供有效配置(如果配置是作用域的)。可以实现ReaderInterface的多种实现(例如,从DB读取配置),但Magento仅提供一个通用读取器:\Magento\Framework\Config\Reader\Filesystem

\Magento\Framework\Config\Reader\Filesystem执行从模块化文件系统读取文件所需的所有操作:读取文件,合并和验证。

每个Config\DataInterface都应该有单独配置的Config\ReaderInterface实例。与系统中的任何实例一样,可以使用Virtual Type或继承配置特定的reader。 Magento文档描述了所有Filesystem依赖项。

此链中的每个元素都是可选的(Config Type Class本身除外),可以用更具体的实现代替。

次佳解决方法

在撰写本文时,似乎没有在Magento 2中读取合并配置树的标准。每个模块都实现了自己的配置读取类,这意味着由每个开发人员决定他们希望如何合并即将发生。虽然Magento提供了一些库存类来实现这一点,但即使在核心代码中,这些类的使用也是不一致的。

参考资料

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