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


20

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

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中,我应该创建什么类文件来读取这些作用域配置文件。从Magento 2来源尚不清楚实现此目的的“正确”方法是什么。核心代码采用多种方法,并且都没有用@api方法标记。这使得很难知道如何继续执行此通用模块开发人员任务。作为次要的副作用,这也使得很难知道Magento模块开发人员应如何从核心配置文件读取

一方面,看起来“正确”的事情是创建文件系统读取器对象。例如,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

还有使用这些阅读器的“作用域数据”类。

#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模块开发人员应该以自己的方式采取的措施,而由此造成的混乱/非标准配置-负载只是做生意的成本?

官方文件确实涵盖了一些可用类的好工作,但没有什么调和的事实有哪个具体实现我们假设在使用没有明确的指导,或者如果期望是每一个模块决定如何做到这一点在其拥有。


我认为这会有所帮助:magento.stackexchange.com/q/51915/146
Marius

您是否通过@vinai github.com/magento/magento2/pull/1410看过此PR ?我认为,如果您没有特殊要求,则可以只使用虚拟类型来滚动自己的配置文件。
克里斯托夫在Fooman,2015年

Answers:


4

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

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

  • \Magento\Framework\Config\Data -对于仅在一个作用域中加载才有意义的配置类型(仅在全局范围内eav_attributes.xml)
  • \Magento\Framework\Config\Data\Scoped -对于可以在不同作用域上加载的配置类型(events.xml-全局和按区域)

每种配置类型都应该具有预先配置的Config\DataInterface对象。可以使用虚拟类型或继承来完成配置。

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

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

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

每个都应Config\DataInterface具有的单独配置实例Config\ReaderInterface。与系统中的任何实例一样,可以使用虚拟类型或继承配置特定的读取器。Magento文档描述所有Filesystem依赖项。

该链中的每个元素都是可选的(“配置类型类”本身除外),并且可以用更具体的实现代替。


1

看起来官方文档已经回答了您的问题。


1
感谢您的答复,但是我不确定文档是否确实回答了我的问题。它列出了许多可用的接口(有用的,为此+1),但是并没有调和这些接口(Magento\Framework\Config\DataMagento\Framework\App\Config)的具体实现都没有用@api标记的事实。如果仅保留该文档,那么我将假定,作为模块开发人员,没有创建和读取配置文件的标准系统,并且我可以做我想做的任何事情。那似乎不对。
艾伦·风暴

您能否描述需要阅读其他模块的配置的情况?对我而言,配置阅读器是模块的专用API。
KAndy 2015年

如果开发人员想为Magento核心做出贡献。如果开发人员在多个模块上工作,而不是他们控制的所有模块,并且不想解开UML图表以从配置文件中读取值。另请参阅-大多数其他具有配置系统的PHP框架。无论如何,如果Magento 2核心团队的意图是模块配置每个模块的私有和自定义,则应在某处说明。
艾伦·风暴

另外-(稍微不同/切向的)Magento后端的“系统配置”部分-基于现有部分的配置构建功能。
艾伦·风暴

2
任何未使用@api注释的api都是私有的,这意味着如果您使用它,那么您将负责向后兼容/ api更改问题。\ Magento \ Framework \ Config \ ReaderInterface具有\ @api注释。
康迪(Kandy)

0

在撰写本文时,似乎还没有一个标准来读取Magento 2中的合并配置树。每个模块都实现自己的配置读取类,这意味着每个开发人员都可以自行决定如何合并。即将发生。尽管Magento提供了一些股票类来执行此操作,但是即使在核心代码中,这些类的用法也不一致。

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.