123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- <?php
- /**
- * Filesystem configuration loader. Loads configuration from XML files, split by scopes
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- *
- */
- namespace Magento\Framework\Config\Reader;
- /**
- * @SuppressWarnings(PHPMD.NumberOfChildren)
- * @api
- * @since 100.0.2
- */
- class Filesystem implements \Magento\Framework\Config\ReaderInterface
- {
- /**
- * File locator
- *
- * @var \Magento\Framework\Config\FileResolverInterface
- */
- protected $_fileResolver;
- /**
- * Config converter
- *
- * @var \Magento\Framework\Config\ConverterInterface
- */
- protected $_converter;
- /**
- * The name of file that stores configuration
- *
- * @var string
- */
- protected $_fileName;
- /**
- * Path to corresponding XSD file with validation rules for merged config
- *
- * @var string
- */
- protected $_schema;
- /**
- * Path to corresponding XSD file with validation rules for separate config files
- *
- * @var string
- */
- protected $_perFileSchema;
- /**
- * List of id attributes for merge
- *
- * @var array
- */
- protected $_idAttributes = [];
- /**
- * Class of dom configuration document used for merge
- *
- * @var string
- */
- protected $_domDocumentClass;
- /**
- * @var \Magento\Framework\Config\ValidationStateInterface
- */
- protected $validationState;
- /**
- * @var string
- * @since 100.0.3
- */
- protected $_defaultScope;
- /**
- * @var string
- * @since 100.0.3
- */
- protected $_schemaFile;
- /**
- * Constructor
- *
- * @param \Magento\Framework\Config\FileResolverInterface $fileResolver
- * @param \Magento\Framework\Config\ConverterInterface $converter
- * @param \Magento\Framework\Config\SchemaLocatorInterface $schemaLocator
- * @param \Magento\Framework\Config\ValidationStateInterface $validationState
- * @param string $fileName
- * @param array $idAttributes
- * @param string $domDocumentClass
- * @param string $defaultScope
- */
- public function __construct(
- \Magento\Framework\Config\FileResolverInterface $fileResolver,
- \Magento\Framework\Config\ConverterInterface $converter,
- \Magento\Framework\Config\SchemaLocatorInterface $schemaLocator,
- \Magento\Framework\Config\ValidationStateInterface $validationState,
- $fileName,
- $idAttributes = [],
- $domDocumentClass = \Magento\Framework\Config\Dom::class,
- $defaultScope = 'global'
- ) {
- $this->_fileResolver = $fileResolver;
- $this->_converter = $converter;
- $this->_fileName = $fileName;
- $this->_idAttributes = array_replace($this->_idAttributes, $idAttributes);
- $this->validationState = $validationState;
- $this->_schemaFile = $schemaLocator->getSchema();
- $this->_perFileSchema = $schemaLocator->getPerFileSchema() && $validationState->isValidationRequired()
- ? $schemaLocator->getPerFileSchema() : null;
- $this->_domDocumentClass = $domDocumentClass;
- $this->_defaultScope = $defaultScope;
- }
- /**
- * Load configuration scope
- *
- * @param string|null $scope
- * @return array
- */
- public function read($scope = null)
- {
- $scope = $scope ?: $this->_defaultScope;
- $fileList = $this->_fileResolver->get($this->_fileName, $scope);
- if (!count($fileList)) {
- return [];
- }
- $output = $this->_readFiles($fileList);
- return $output;
- }
- /**
- * Read configuration files
- *
- * @param array $fileList
- * @return array
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- protected function _readFiles($fileList)
- {
- /** @var \Magento\Framework\Config\Dom $configMerger */
- $configMerger = null;
- foreach ($fileList as $key => $content) {
- try {
- if (!$configMerger) {
- $configMerger = $this->_createConfigMerger($this->_domDocumentClass, $content);
- } else {
- $configMerger->merge($content);
- }
- } catch (\Magento\Framework\Config\Dom\ValidationException $e) {
- throw new \Magento\Framework\Exception\LocalizedException(
- new \Magento\Framework\Phrase(
- 'The XML in file "%1" is invalid:' . "\n%2\nVerify the XML and try again.",
- [$key, $e->getMessage()]
- )
- );
- }
- }
- if ($this->validationState->isValidationRequired()) {
- $errors = [];
- if ($configMerger && !$configMerger->validate($this->_schemaFile, $errors)) {
- $message = "Invalid Document \n";
- throw new \Magento\Framework\Exception\LocalizedException(
- new \Magento\Framework\Phrase($message . implode("\n", $errors))
- );
- }
- }
- $output = [];
- if ($configMerger) {
- $output = $this->_converter->convert($configMerger->getDom());
- }
- return $output;
- }
- /**
- * Return newly created instance of a config merger
- *
- * @param string $mergerClass
- * @param string $initialContents
- * @return \Magento\Framework\Config\Dom
- * @throws \UnexpectedValueException
- */
- protected function _createConfigMerger($mergerClass, $initialContents)
- {
- $result = new $mergerClass(
- $initialContents,
- $this->validationState,
- $this->_idAttributes,
- null,
- $this->_perFileSchema
- );
- if (!$result instanceof \Magento\Framework\Config\Dom) {
- throw new \UnexpectedValueException(
- "Instance of the DOM config merger is expected, got {$mergerClass} instead."
- );
- }
- return $result;
- }
- }
|