Condividi!

Il metodo loadModules() si occupa di caricare le singole configurazioni di tutti i moduli dichiarati.

Prima di addentrarci nel codice, è bene fare un riepilogo “a priori” di quelli che sono gli step che il metodo stesso effettuerà:

  1. Con “l’aiuto” del metodo _loadDeclaredModules(), memorizza un elenco di tutti i parametri dei moduli dichiarati.
    Per moduli dichiarati si intendono tutti i moduli dei quali abbiamo comunicato l’esistenza a Magento con gli appositi file all’interno della cartella app/etc/modules.
    Per tutti i parametri si intendono i vari tag impostati all’interno dei singoli file xml di dichiarazione (version, codepool, active, depends)
  2. Con “l’aiuto” del metodo loadModulesConfiguration() effettua il caricamento vero e proprio di tutti i singoli file di configurazione di ogni singolo modulo, solo se questo è stato dichiarato attivo, ciclando i file config.xml
    I singoli di file di configurazione sono contenuti nella cartella etc dei singoli moduli.

DOVE e COME Magento memorizza tutte le informazioni estratte dai vari file di configurazione?

Il metodo loadModulesConfiguration() non si limita a leggere e caricare i singoli file di configurazione, ma da luogo ad una ulteriore operazione, chiamata “merging”, con la quale, in sostanza, unifica il contenuto dei file di configurazione dei singoli moduli all’interno di una unica struttura gerarchica.
Molto spesso si legge che Magento, in questa fase, unisce i singoli file di configurazione formandone uno che contenga tutte le informazioni di configurazione. Tale assunto, seppur efficace in termini astratti al fine di dipingere lo stato delle cose, è del tutto errato e fuorviante. Il metodo loadModules() infatti non da assolutamente luogo alla creazione di un nuovo ed unico “file” di configurazione, ma genera una struttura gerarchica costituita da singoli oggetti ti tipo Mage_Core_Model_Config_Element, ognuno dei quali rappresenta un particolare nodo nei file di configurazione.
Per descrivere meglio quanto esposto, è sufficiente dare un occhiata alle seguenti immagini, tratte da una sessione di debug, che rappresentano la situazione prima e dopo che il metodo loadModules() venga eseguito (il metodo, in realtà, viene richiamato all’interno del metodo run() dell’oggetto Mage_Core_Model_App, tramite l’apposito metodo _initModules() ).

 

Step 1: situazione della proprietà _config PRIMA della chiamata al metodo loadModules()

 

Oggetto Config prima che loadModules() venga eseguito

Oggetto Config prima che loadModules() venga eseguito

Oggetto Config prima che loadModules() venga eseguito

Step 2: situazione della proprietà _config DOPO la chiamata al metodo loadModules()

Situazione della proprietà _config dopo la chiamata al metodo loadModules()

Situazione della proprietà _config dopo la chiamata al metodo loadModules()

Si vede chiaramente che, una volta eseguito il metodo loadModules(), la struttura della proprietà _xml all’interno della proprietà _config, cioè l’oggetto “configurazione”, contiene nuovi oggetti di tipo Mage_Core_Model_Config_Element, generati in seguito al merging dei singoli file config.xml. Questi oggetti, strutturati utilizzando la gerarchia dei parametri di configurazione comuni (frontend, adminhtml, install, stores ecc..), contengono le configurazioni dei singoli moduli.

Ad esempio, ogni modulo dovrebbe contenere nel suo file config.xml l’impostazione relativa ai suoi routers. In questo caso abbiamo preso, a titolo di esempio, il file config.xml del modulo  CATALOG.
L’immagine seguente mostra il nodo routers all’interno del file config.xml ed il modo in cui Magento, attraverso il metodo loadModules(), lo abbia “memorizzato” all’interno della proprietà _config nella struttura gerarchica _config->_xml->frontend->routers->catalog

Configurazione router del modulo Catalogo

Particolare del nodo “routers” del file config.xml del modulo Catalog e del modo in cui Magento lo memorizzi ed “incolli” all’interno dell’oggetto Mage_Core_Model_Config

Dove viene richiamato il metodo loadModules()?

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);

Il metodo run() della classe Mage_Core_Model_App esegue il metodo _initModules(), il quale a sua volta richiama il metodo loadModules() dell’oggetto Mage_Core_Model_Config, ma soltanto qualora la configurazione non sia già presente e disponibile nella cache.
In quel caso, la configurazione viene reperita direttamente dalla cache, bypassando la chiamata al metodo loadModules().

protected function _initModules()
    {
        if (!$this->_config->loadModulesCache()) {
            $this->_config->loadModules();
            ...

Il metodo loadModules(), dunque, appare così costituito:

    public function loadModules()
    {
        Varien_Profiler::start('config/load-modules');
        $this->_loadDeclaredModules();

        $resourceConfig = sprintf('config.%s.xml', $this->_getResourceConnectionModel('core'));
        $this->loadModulesConfiguration(array('config.xml',$resourceConfig), $this);

        /**
         * Prevent local.xml directives overwriting
         */
        $mergeConfig = clone $this->_prototype;
        $this->_isLocalConfigLoaded = $mergeConfig->loadFile($this->getOptions()->getEtcDir().DS.'local.xml');
        if ($this->_isLocalConfigLoaded) {
            $this->extend($mergeConfig);
        }

        $this->applyExtends();
        Varien_Profiler::stop('config/load-modules');
        return $this;
    }