마 젠토 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
Marius

@vinai github.com/magento/magento2/pull/1410 이 PR을 보셨습니까 ? 특별한 요구 사항이 없다면 가상 유형으로 자신의 구성 파일을 롤링 할 수 있다고 생각합니다.
Kristof at Fooman

답변:


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\ReaderInterface. ReaderInterface요청 된 범위에 대해 PHP 배열 형식으로 유효한 구성을 제공해야합니다 (구성 범위가 지정된 경우). 여러 구현 ReaderInterface이 가능하지만 (예 : DB의 읽기 구성) Magento는 하나의 일반 리더 만 제공 \Magento\Framework\Config\Reader\Filesystem합니다.

\Magento\Framework\Config\Reader\Filesystem 모듈 식 파일 시스템에서 파일을 읽는 데 필요한 모든 작업 : 파일 읽기, 병합 및 유효성 검사

모든 Config\DataInterface인스턴스는 별도로 구성되어 있어야합니다 Config\ReaderInterface. 시스템의 모든 인스턴스와 같이 특정 리더는 가상 유형 또는 상속으로 구성 할 수 있습니다. 마 젠토 문서 모든 Filesystem의존성을 설명합니다 .

이 체인의 모든 요소는 선택적이며 (구성 유형 클래스 자체 제외)보다 구체적인 구현으로 대체 할 수 있습니다.


1

과 같은 공식 문서는 질문에 대한 답을 가지고있다.


1
답변 해 주셔서 감사합니다. 그러나 문서가 내 질문에 답하지 않을 수 없습니다. 사용 가능한 많은 인터페이스 (유용한 +1)가 나열되어 있지만 해당 인터페이스 ( Magento\Framework\Config\DataMagento\Framework\App\Config) 의 구체적인 구현이 @api로 표시되지 않았다는 사실을 조정하지는 않습니다 . 해당 문서 만 남으면 모듈 개발자로서 구성 파일을 작성하고 읽는 표준 시스템 이 없으며 원하는 모든 것을 할 수 있다고 가정합니다. 옳지 않은 것 같습니다.
Alan Storm

다른 모듈의 구성을 읽어야 할 경우를 설명 할 수 있습니까? 나에게 구성 리더는 모듈의 전용 API입니다.
KAndy

개발자가 Magento 코어에 기여하고자하는 경우 개발자가 모든 모듈을 제어하는 ​​것이 아니라 여러 모듈에서 작업하는 경우 UML 차트를 연결 해제하여 구성 파일에서 값을 읽지 않으려는 경우. 구성 시스템이있는 대부분의 다른 PHP 프레임 워크도 참조하십시오. 그럼에도 불구하고, Magento 2 핵심 팀의 의도가 모듈 구성 모듈 대한 개인 및 사용자 정의라면 어딘가에 명시해야합니다.
Alan Storm

또한 Magento 백엔드의 시스템 구성 섹션 (약간 다른 / 접선)도 기존 섹션의 구성을 기반으로 기능을 빌드합니다.
Alan Storm

2
@api로 주석을 달지 않은 모든 API는 비공개입니다.이를 사용하면 이전 버전과의 호환성 / API 변경 문제가 발생합니다. \ Magento \ Framework \ Config \ ReaderInterface에는 \ @api 주석이 있습니다.
KAndy

0

이 문서를 작성할 당시 Magento 2에서 병합 된 구성 트리를 읽는 것이 표준 인 것으로 보이지는 않습니다. 각 모듈은 자체 구성 판독 클래스를 구현하므로 각 개발자가이 병합 방법을 결정할 수 있습니다. 일어날. Magento는이를 수행하기 위해 일부 스톡 클래스를 제공하지만 핵심 코드에서도 이러한 클래스의 사용이 일치하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.