Scenario: sono uno sviluppatore di moduli Magento 2. Voglio creare un file di configurazione in app/etc
. Voglio che questo file sia "ambito" per area
app/etc/my_file.xml
app/etc/frontend/my_file.xml
app/etc/adminhtml/my_file.xml
In Magento 1 avrei appena creato un config.xml
e sarei sulla buona strada. L'ambito scoping è avvenuto nel file XML stesso. Tuttavia, Magento 2 si avvicina in modo molto diverso
In Magento 2, quali file di classe dovrei creare per leggere questi file di configurazione con ambito. Dalla fonte di Magento 2 non è chiaro quale sia il modo "giusto" per farlo. Il codice principale utilizza più approcci e nessuno di essi è contrassegnato da un @api
metodo. Ciò rende difficile sapere come procedere con questa attività comune per gli sviluppatori di moduli. Come effetto collaterale secondario, rende anche difficile sapere come uno sviluppatore del modulo Magento dovrebbe leggere dai file di configurazione di base.
Da un lato, sembra che la cosa "giusta" da fare sia creare un oggetto lettore di file system. Ad esempio, Magento sembra caricare il import.xml
file con il seguente
#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
);
}
//...
}
La Magento\Framework\Config\Reader\Filesystem
classe base sembra avere un codice per risolvere l'ambito dell'area.
Tuttavia, alcuni dei file di configurazione di Magento sembrano eludere questo schema. Mentre ci sono lettori per questi file ( event.xml
in questo esempio)
vendor/magento/framework/Event/Config/Reader.php
Esistono anche classi di "dati con ambito" che utilizzano questi lettori.
#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);
}
}
Questo fa sembrare che le classi di lettori con ambito siano ciò che uno sviluppatore di moduli dovrebbe creare. Ma non tutti i file di configurazione hanno questi lettori con ambito.
C'è un percorso chiaro per gli sviluppatori del modulo Magento 2 da seguire? O è solo qualcosa che gli sviluppatori del modulo Magento 2 dovrebbero affrontare a modo loro, e il conseguente caos / caricamento della configurazione non standard è solo il costo di fare affari?
La documentazione ufficiale fa un buon lavoro nel coprire alcune delle classi disponibili, ma nulla che riconcilia il fatto che non esiste una guida chiara su quale implementazione concreta supponiamo di usare, o se l'aspettativa è che ogni modulo decide come fare questo sul suo proprio.