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では、A 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
マリウス

@vinai github.com/magento/magento2/pull/1410によるこのPRを見ましたか?特別な要件がない場合は、仮想タイプのみで独自の構成ファイルをロールできると思います。
クリストフ、フーマンで

回答:


4

新しい構成タイプを作成するには、モジュール開発者は、構成のクライアントが使用する構成タイプクラスを作成する必要があります。

これらの型クラスをできるだけ単純にするために、構成ファイルの読み取りとデータのキャッシュのすべての動作は\Magento\Framework\Config\DataInterface、2つの再利用可能な実装に移行されました。

  • \Magento\Framework\Config\Data -1つのスコープでのみロードする意味がある構成タイプの場合(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は1つの汎用リーダーのみを出荷します\Magento\Framework\Config\Reader\Filesystem

\Magento\Framework\Config\Reader\Filesystem モジュラーファイルシステムからファイルを読み取るために必要なすべての操作を実行します:ファイルの読み取り、マージ、および検証。

すべてConfig\DataInterfaceがのインスタンスを個別に構成することになっていますConfig\ReaderInterface。システムのインスタンスとして、特定のリーダーは仮想タイプまたは継承のいずれかで構成できます。MagentoのドキュメントすべてのFilesystem依存関係について説明しています。

このチェーンのすべての要素はオプションで(Config Type Class自体を除く)、より具体的な実装に置き換えることができます。


1

以下のように見える公式ドキュメントは、あなたの質問に対する答えを持っています。


1
返信いただきありがとうございますが、ドキュメントが私の質問に答えているかどうかはわかりません。利用可能な多くのインターフェース(有用であり、そのために+1)がリストされていますが、これらのインターフェース(Magento\Framework\Config\DataおよびMagento\Framework\App\Config)の具体的な実装が@apiでマークされていないという事実を調整していません。そのドキュメントだけが残っている場合、モジュール開発者として、構成ファイルを作成および読み取るため標準的なシステムがなく、私がやりたいことは何でもできるという仮定の下にいるでしょう。それは正しくないようです。
アランストーム

他のモジュールの構成を読み取る必要がある場合について説明できますか?私にとって、構成リーダーはモジュールのプライベートAPIです。
カンディ

開発者がMagentoコアに貢献したい場合。開発者が複数のモジュールで作業し、それらすべてが制御しているわけではなく、UMLチャートを解いて構成ファイルから値を読み取ることを望まない場合。参照-設定システムを備えた他のほとんどのPHPフレームワーク。とにかく、Magento 2コアチームの意図がモジュール構成モジュールごとのプライベートおよびカスタムである場合、どこかに記載する必要があります。
アランストーム

また、(わずかに異なる/接線)Magentoのバックエンドのシステム構成セクション-既存のセクションの構成に基づいて機能を構築します。
アランストーム

2
@apiの注釈が付いていないAPIは、それを使用すると下位互換性/ APIの変更の責任を負うという意味でプライベートです。\ Magento \ Framework \ Config \ ReaderInterfaceには\ @api注釈があります。
カンディ

0

この記事の執筆時点では、Magento 2でマージされた構成ツリーを読み取ることは標準ではありませんでした。各モジュールは独自の構成読み取りクラスを実装します。発生する。Magentoはこれを行うためにいくつかのストッククラスを提供していますが、コアコード間でもこれらのクラスの使用は一貫性がありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.