Cenário: Sou desenvolvedor do módulo Magento 2. Eu quero criar um arquivo de configuração no app/etc
. Quero que este arquivo tenha "escopo" por área
app/etc/my_file.xml
app/etc/frontend/my_file.xml
app/etc/adminhtml/my_file.xml
No Magento 1, eu apenas criava um config.xml
e estava a caminho. O escopo da área aconteceu no próprio arquivo XML. No entanto, o Magento 2 aborda isso de maneira muito diferente
No Magento 2, quais arquivos de classe devo criar para ler esses arquivos de configuração com escopo definido. Não está claro pela fonte do Magento 2 qual é a maneira "certa" de fazer isso. O código principal usa várias abordagens e nenhuma delas é marcada com um @api
método. Isso dificulta saber como proceder com esta tarefa comum de desenvolvedor de módulo. Como efeito colateral secundário, também torna difícil saber como um desenvolvedor de módulo Magento deve ler os arquivos de configuração principais.
Por um lado, parece que "a coisa certa" a fazer é criar um objeto leitor de sistema de arquivos. Por exemplo, o Magento parece carregar o import.xml
arquivo com as seguintes
#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
);
}
//...
}
A Magento\Framework\Config\Reader\Filesystem
classe base parece ter código para resolver o escopo da área.
No entanto, alguns dos arquivos de configuração do Magento parecem evitar esse padrão. Embora existam leitores para esses arquivos ( event.xml
neste exemplo)
vendor/magento/framework/Event/Config/Reader.php
Há também classes de "dados com escopo" que usam esses leitores.
#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);
}
}
Isso faz parecer que as classes de leitores com escopo definido são o que um desenvolvedor de módulos deve criar. Mas nem todos os arquivos de configuração possuem esses leitores com escopo.
Existe um caminho claro para os desenvolvedores do módulo Magento 2 seguirem? Ou isso é algo que os desenvolvedores do módulo Magento 2 devem abordar à sua maneira, e o caos resultante / carregamento de configuração não-padrão é apenas o custo de fazer negócios?
A documentação oficial faz um bom trabalho ao cobrir algumas das classes disponíveis, mas nada que concilie o fato de que não há uma orientação clara sobre qual implementação concreta devemos usar, ou se a expectativa é de que todo módulo decida como fazer isso por conta própria. próprio.