:::: MENU ::::

Inicialización de Magento: index.php y Mage.php

4.25 avg. rating (81% score) - 4 votes

Cualquier petición a un sistema Magento, es derivada por medio del fichero .htaccess hacia el un punto de entrada común en el fichero index.php.

Allí podemos ver como tras algunas comprobaciones iniciales (aplicación instalada, modo mantenimiento, etc.), enseguida es llamado el fichero Mage.php, encargado de la mayor parte de la inicialización del sistema:

$mageFilename = MAGENTO_ROOT . '/app/Mage.php';
... 
require_once $mageFilename;

Con la inclusión del fichero app/Mage.php se inicializan varias cosas importantes para el funcionamiento del sistema Magento.

Magento include path

Las rutas de inclusión de ficheros determinan dónde Magento buscará clases que necesite instanciar para el funcionamiento del sistema. Existen dos posibilidades para las rutas.

Si el modo compilación está activado, la única ruta de inclusión será la carpeta includes/src del raiz de la instalación de Magento. Cuando la compilación está activada, todas las clases a utilizar se copian a dicha carpeta.

Si el modo compilación está desactivado, entonces entran en juego los codepools, y las rutas de inclusión de archivos son varias. El siguiente fragmento de Mage.php muestra dichas rutas.

$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local';
$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community';
$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core';
$paths[] = BP . DS . 'lib';
$appPath = implode(PS, $paths); 
set_include_path($appPath . PS . Mage::registry('original_include_path'));

Una vez determinadas las rutas de inclusión de ficheros, se llama a la función de PHP set_include_path que configura PHP para buscar los ficheros de clases en dichas rutas.

Observar el orden de inclusión, que es el que da prioridad a los ficheros existentes en el codepool local, frente al codepool community y frente al core.

Magento Autoloader

Otra parte importante de la inicialización de Magento, es el Autoloader.

El Autoloader (una característica de PHP5) permite a Magento cargar clases para instanciar objetos sin necesidad de utilizar las llamadas de PHP include o require, lo que dado el número de clases y archivos existentes en Magento, sería simplemente una locura.

El Autoloader de Magento se inicia también en el archivo app/Mage.php, con la llamada a:

 Varien_Autoload::register();

Si echamos un vistazo a ese método, veremos que simplemente llama a una función de PHP estándar que proporciona acceso a dicha característica:

    static public function register() {
        spl_autoload_register(array(self::instance(), 'autoload'));
    }

A partir de ese momento, para cualquier creación de objetos en el sistema, si PHP no conoce la ubicación del archivo de clase, se llamará a la función Varien_Autoload::autoload, que si echamos un vistazo, veremos que contiene:

public function autoload($class) { 
    if ($this->_collectClasses) { 
        $this->_arrLoadedClasses[self::$_scope][] = $class; 
    }
    if ($this->_isIncludePathDefined) { 
        $classFile = COMPILER_INCLUDE_PATH . DIRECTORY_SEPARATOR . $class;
    }
    else {
        $classFile = str_replace(' ', DIRECTORY_SEPARATOR, ucwords(str_replace('_', ' ', $class)));
    }
    $classFile.= '.php';
    return include $classFile;
}

Básicamente la función autoload, vuelve a comprobar el uso del compilador o no, para obtener la ruta de inclusión correspondiente. Al final de la función puede verse la inclusión del correspondiente fichero.

 return include $classFile;

El cómo se obtiene la ruta correspondiente sería motivo de otro artículo.




Hey! Qué opinas sobre el artículo?