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.
fonte
Respostas:
Para criar um novo tipo de configuração, o desenvolvedor do módulo deve criar uma classe de tipo de configuração que será usada pelos clientes de configuração.
Para tornar essas classes de tipos o mais simples possível, todo o comportamento de ler arquivos de configuração e dados em cache foi movido para
\Magento\Framework\Config\DataInterface
duas implementações reutilizáveis:\Magento\Framework\Config\Data
- para tipos de configuração que só fazem sentido serem carregados em um escopo (eav_attributes.xml apenas em global)\Magento\Framework\Config\Data\Scoped
- para tipos de configuração que podem ser carregados em escopos diferentes (events.xml - global e por área)Todo tipo de configuração deve ter um
Config\DataInterface
objeto pré-configurado . A configuração pode ser feita com Tipo Virtual ou com herança.Embora o desenvolvedor do módulo possa herdar tecnicamente seu tipo de configuração da
Config\DataInterface
implementação, é recomendável não se estender das classes principais. Sempre melhor usar composição.Agora
\Magento\Framework\Config\Data
eData\Scoped
só fazem cache e delegado leitura de configuração para\Magento\Framework\Config\ReaderInterface
.ReaderInterface
deve fornecer configuração válida no formato da matriz PHP para o escopo solicitado (se a configuração tiver escopo definido). Várias implementaçõesReaderInterface
são possíveis (por exemplo de configuração de leitura do DB), mas Magento única navios um leitor genérico:\Magento\Framework\Config\Reader\Filesystem
.\Magento\Framework\Config\Reader\Filesystem
faz todas as operações necessárias para ler arquivos do sistema de arquivos modular: ler arquivos, mesclar e validar.Todo mundo
Config\DataInterface
deve ter uma instância configurada separadamente deConfig\ReaderInterface
. Como qualquer instância do sistema, um leitor específico pode ser configurado com o Tipo virtual ou com herança. Documentação Magento Descreve todas asFilesystem
dependências.Cada elemento nesta cadeia é opcional (exceto a própria Classe de tipo de configuração) e pode ser substituído por uma implementação mais específica.
fonte
Parece que a documentação oficial tem respostas para sua pergunta.
fonte
Magento\Framework\Config\Data
eMagento\Framework\App\Config
) não está marcada com @api. Se restasse apenas essa documentação, eu assumiria que, como desenvolvedor de módulos, não existe um sistema padrão para criar e ler arquivos de configuração e que eu posso fazer o que quiser. Isso não parece certo.No momento, este artigo não parece ser o padrão para ler uma árvore de configuração mesclada no Magento 2. Cada módulo implementa suas próprias classes de leitura de configuração, o que significa que cada desenvolvedor decide como deseja essa mesclagem. acontecer. Enquanto o Magento oferece algumas classes de ações para fazer isso, mesmo entre o código principal, o uso dessas classes é inconsistente.
fonte