Magento. Процесс загрузки конфигурационных файлов

от автора

Добрый день, хабрасообщество.
Это моя первая статья, поэтому не судите строго. Несколько лет я занимаюсь разработкой интернет магазинов на базе Magento. За это время у меня накопилось много информации относительно работы данной платформы, которую невозможно вечно держать в голове, поэтому я решил структурировать ее в виде серии статей.
Кому интересно, добро пожаловать под кат.

Любое обращение к страницам в интернет магазине на базе Magento начинается с обработки index.php. В данном файле производится первичная проверка, в том числе версии PHP, объявляются константы и подключается файл Mage.php с базовым классом Mage. Данный класс реализует множество интересных методов, которые будут рассмотрены в дальнейших статья, а на данный момент нас интересует метод
run, отвечающий за запуск магазина. Чтобы понять, как происходит загрузка конфигурационных файлов, рассмотрим данный метод:

self::$_app = new Mage_Core_Model_App(); if (isset($options['request'])) {      self::$_app->setRequest($options['request']); } if (isset($options['response'])) {      self::$_app->setResponse($options['response']); } self::$_events = new Varien_Event_Collection(); self::_setIsInstalled($options); self::_setConfigModel($options); self::$_app->run(array(      'scope_code' => $code,      'scope_type' => $type,      'options'    => $options, )); 

Видно, что в методе создается новый класс Mage_Core_Model_App и для него вызывается метод run, где и происходит вызов методов первоначальной загрузки конфигурационных файлов.

Рассмотрим данный метод:

public function run($params)     {         $options = isset($params['options']) ? $params['options'] : array();         $this->baseInit($options);         Mage::register('application_params', $params);           if ($this->_cache->processRequest()) {             $this->getResponse()->sendResponse();         } else {             $this->_initModules();             $this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);               if ($this->_config->isLocalConfigLoaded()) {                 $scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';                 $scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';                 $this->_initCurrentStore($scopeCode, $scopeType);                 $this->_initRequest();                 Mage_Core_Model_Resource_Setup::applyAllDataUpdates();             }               $this->getFrontController()->dispatch();         }         return $this;     } 

Метод baseInit отвечает за инициализацию свойства _config и загрузку базовых конфигураций. Базовая конфигурация загружается в методе _initBaseConfig, который в дальнейшем вызывает loadBase метод из класса Mage_Core_Model_Config.
Метод loadBase парсит и сохраняет в свойство _xml объекта Mage_Core_Model_Config данные из файлов app/etc/local.xml и app/etc/config.xml. В данных файлах содержатся доступы к БД и базовые настройки интернет магазина.
После чего происходит загрузка конфигурационных файлов модулей. За это отвечает метод _initModules, который, в свою очередь, вызывает метод loadModules из класса Mage_Core_Model_Config.
Для загрузки конфигурационных файлов модулей сначала загружается список всех файлов из папки app/etc/modules и производится разбор этих файлов. За это отвечает метод _loadDeclaredModules. В методе loadModules производится обработка только трех типов файлов из папки etc в директории модуля:

  • 1. confix.xml
  • 2. config.{resource_name}.xml (в нашем случае config.mysql4.xml)
  • 3. local.xml

Для загрузки первых двух типов вызывается метод loadModulesConfiguration, которому в качестве $fileName передается массив с именами файлов (config.xml и config.mysql4.xml)
image
Далее производится парсинг и загрузка данных в свойство _xml для всех активных модулей:

$modules = $this->getNode('modules')->children(); foreach ($modules as $modName=>$module) {     if ($module->is('active')) {         if ($disableLocalModules && ('local' === (string)$module->codePool)) {             continue;         }         if (!is_array($fileName)) {             $fileName = array($fileName);         }         foreach ($fileName as $configFile) {             $configFile = $this->getModuleDir('etc', $modName).DS.$configFile;             if ($mergeModel->loadFile($configFile)) {                 $mergeToObject->extend($mergeModel, true);             }         }     } } 

С помощью файла local.xml можно вносить свои изменения в базовую конфигурацию интернет магазина.
На этом загрузка конфигурации завершается, и запускаются соответствующие процессы, в зависимости от роутера страницы на которую вы перешли.

Спасибо за внимание, с удовольствием жду вашей критики.

ссылка на оригинал статьи http://habrahabr.ru/post/204166/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *