Escenario: Soy un desarrollador de módulos de Magento 2. Quiero crear un archivo de configuración en app/etc
. Quiero que este archivo tenga "ámbito" por área
app/etc/my_file.xml
app/etc/frontend/my_file.xml
app/etc/adminhtml/my_file.xml
En Magento 1, simplemente crearía ay seguiría config.xml
mi camino. El alcance del área ocurrió en el archivo XML en sí. Sin embargo, Magento 2 aborda esto de manera muy diferente
En Magento 2, ¿qué archivo (s) de clase debo crear para leer estos archivos de configuración de ámbito. No está claro por la fuente de Magento 2 cuál es la forma "correcta" de hacer esto. El código central adopta múltiples enfoques, y ninguno de ellos está marcado con un @api
método. Esto dificulta saber cómo proceder con esta tarea común de desarrollador de módulos. Como efecto secundario secundario, también hace que sea difícil saber cómo debe leer un desarrollador de módulos de Magento de los archivos de configuración principales.
Por un lado, parece que "lo correcto" es crear un objeto lector de sistema de archivos. Por ejemplo, Magento parece cargar el import.xml
archivo con lo siguiente
#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
Parece que la clase base tiene código para resolver el alcance del área.
Sin embargo, algunos de los archivos de configuración de Magento parecen evitar este patrón. Si bien hay lectores para estos archivos ( event.xml
en este ejemplo)
vendor/magento/framework/Event/Config/Reader.php
También hay clases de "datos con alcance" que utilizan estos lectores.
#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);
}
}
Esto hace que parezca que las clases de lectores con alcance son lo que un desarrollador de módulos debería crear. Pero no todos los archivos de configuración tienen estos lectores de ámbito.
¿Existe un camino claro para que sigan los desarrolladores de módulos de Magento 2? ¿O es esto algo que los desarrolladores de módulos de Magento 2 deberían abordar a su manera, y el caos resultante / carga de configuración no estándar es solo el costo de hacer negocios?
La documentación oficial hace un buen trabajo al cubrir algunas de las clases disponibles, pero nada que concilie el hecho de que no hay una guía clara sobre qué implementación concreta se supone que debemos usar, o si la expectativa es que cada módulo decida cómo hacer esto en su propio.