Magento 2: How Should Module Developers Read their Own Configuration Files
To create new configuration type, module developer should create a configuration type class that will be used by clients of configuration.
To make these type classes as simple as possible, all behavior of reading configuration files and caching data was moved to \Magento\Framework\Config\DataInterface
with two reusable implementations:
\Magento\Framework\Config\Data
- for configuration types that only make sense to be loaded in one scope (eav_attributes.xml only in global)\Magento\Framework\Config\Data\Scoped
- for configuration types that can be loaded on different scopes (events.xml - global and per-area)
Every configuration type is supposed to have pre-configured Config\DataInterface
object. Configuration can be done either with Virtual Type or with inheritance.
Although module developer can technically inherit their configuration type from Config\DataInterface
implementation, it's recommended not to extend from core classes. Always better to use composition.
Now \Magento\Framework\Config\Data
and Data\Scoped
only do caching and delegate configuration reading to \Magento\Framework\Config\ReaderInterface
. ReaderInterface
is supposed to provide valid configuration in format of PHP array for requested scope (if configuration is scoped). Multiple implementations of ReaderInterface
are possible (for example read configuration from DB) but Magento only ships one generic reader: \Magento\Framework\Config\Reader\Filesystem
.
\Magento\Framework\Config\Reader\Filesystem
does all operations required for reading files from modular filesystem: read files, merge and validate.
Every Config\DataInterface
is supposed to have separately configured instance of Config\ReaderInterface
. As any instance in system, specific reader can be configured either with Virtual Type or with inheritance. Magento Documentation Describes all Filesystem
dependencies.
Every element in this chain is optional (except for Config Type Class itself) and can be substituted with more specific implementation.