Certificación Magento-Varien Autoload

Para saber qué es Autoload tenemos que remontarnos a versiones de PHP anteriores a la 5 y recordar aquellos desarrollos iniciales realizados con PHP y POO en los cuales era necesario ir realizando una serie de includes para añadir las clases necesarias que se iban a utilizar.

En PHP5 cada vez que se intente crear una clase/interfaz que no haya sido definida será invocada automáticamente la función __autoload().

Para poner en funcionamiento un Autoload es necesario registrar la función que se va a encargar de la autocarga, estó se realiza invocando a:

  • spl_autoload_register(): registra una función con la pila __autoload() proporcionada de spl. Si la pila aún no ha sido activa será activada.

A continuación un pequeño ejemplo del  autoload de PHP

  1. <?php
  2. // function __autoload($clase) {//     include 'clases/' . $clase . '.clase.php';// }
  3. function mi_autocargador($clase) {    include 'clases/' . $clase . '.clase.php';}
  4. spl_autoload_register('mi_autocargador');
  5. // O, usando una función anónima a partir de PHP 5.3.0spl_autoload_register(function ($clase) {    include 'clases/' . $clase . '.clase.php';});
  6. ?>

En el ejemplo cada vez que se intente crear una clase que no este incluida irá a buscarla al directorio clases/nombreDeLaClase.clase.php

Autoload Magento:

Una vez visto el autoload a grandes rasgos, centrémonos en cómo realiza dicha  implementación Magento.

En Magento el autoload lo tenemos especificado en la clase Varien_Autoload. Esta clase la podremos encontrar en el directorio lib/varien/autoload.php del raíz de nuestra aplicación Magento.  En esta clase tenemos que prestar atención a la siguiente función:

  1. public function autoload($class)    {
  2. if ($this->_collectClasses) {
  3. $this->_arrLoadedClasses[self::$_scope][] = $class;        }
  4. if ($this->_isIncludePathDefined) {            $classFile = $class;        }
  5. else {
  6. $classFile = str_replace(' ', DIRECTORY_SEPARATOR, ucwords(str_replace('_', ' ', $class)));
  7. }
  8. $classFile.= '.php';        //echo $classFile;die();
  9. return include $classFile;
  10. }

Veamos paso a paso dicha función:

if ($this->_collectClasses) { $this->_arrLoadedClasses[self::$_scope][] = $class;        } : en caso de que ya haya una instancia de la clase Autoload introduciremos la clase en un array con las clases que ya han sido cargadas para el $_scope indicado.

if ($this->_isIncludePathDefined) {            $classFile = $class;        }

la variable $this->_isIncludePathDefined va a estar a true si en Magento está activada la compilación.

¿Qué quiere decir esto? Cuando activamos la compilación lo que hacemos es juntar en cuatro grandes scopes (default, cms, catalog y checkout) una serie de clases, estos scopes los podemos ver si en el backend en la sección sistemas->herramientas->compilación.

Ahora las clases no van a estar en sus directorios habituales, sino que van a estar dentro de la carpeta include/src  y el nombre de la clase va a ser el nombre del fichero, por ello realizamos la siguiente asignación $classFile = $class;

$classFile = str_replace(‘ ‘, DIRECTORY_SEPARATOR, ucwords(str_replace(‘_’, ‘ ‘, $class)));

Ya estamos en la línea que nos va a dar la clave del Autoload y aquí veremos el convenio adoptado a la hora de dar el nombre a una clase y su relación con éste.

Imaginemos el ejemplo de que se quiere instanciar la siguiente clase Mage_Core_Model_Config y se van a realizar los siguientes pasos:

  1. Reemplazar los “_” por espacios. Esto nos dará como resultado la cadena “Mage Core Model Config”
  2. Pasamos a mayúscula el primer caracter de cada palabra contenida en una cadena, si no me equivoco esto debe de estar ya así si hemos seguido el convenio.
  3. Vamos a Reemplazar los espacios en nuestra cadena por DIRECTORY_SEPARATOR, que dependerá en el sistema en el que estemos corriendo la aplicación. Para mi caso el caracter “/”. Esto nos dará el resultado de Mage/Core/Model/Config

$classFile.= ‘.php’;

Último paso en la generación del nombre de la clase, y solo es añadirle la extensión.

El ejemplo descrito anteriormente me permitiría realizar operaciones del tipo new Mage_Core_Model_Config sin la necesidad de realizar un include(“Mage_Core_Model_Config.php”);

Aquí me falta algo:

Examinando estos ejemplos había una pieza que no me terminaba de encajar en todo esto; si has estado atento verás que falta algo. El caso es que la clase que estamos incluyendo está en parte en el directorio  Mage_Core_Model_Config.

¿Donde esta la parte que me falta?

Realmente el archivo esta en localizado en app/code/core/Mage/Core/Model/Config.php

Para poder encontrar la pieza que nos falta tenemos que ir al archivo app/Mage.php y examinar el siguiente conjunto de líneas:

  1. </p>
  2. <p style="text-align: justify;">/**     * Set include path     */</p>
  3. $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local';
  4. $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community';
  5. $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core';
  6. $paths[] = BP . DS . 'lib';
  7. $appPath = implode(PS, $paths);
  8. set_include_path($appPath . PS . Mage::registry('original_include_path'));

Con la función set_Include_path() vamos a modificar la variable de PHP include_path en tiempo de ejecución. Entonces cuando realicemos un include() irá examinando en los diferentes directorios para localizar la clase en el orden en el que han sido pasados (local->community->core->lib).

Así que el autoload funcionará para los directorios:

  • app/code/local
  • app/code/comunnity
  • app/code/core
  • lib

Con todo esto queda visto el funcionamiento del Autoload. Si tienes cualquier duda, ves algo erróneo, o quieres dejar tu opinión, agradecería mucho la colaboración en la parte de comentarios.

2 comentarios sobre “Certificación Magento-Varien Autoload”

  1. Hola Selo,

    estoy desarrollando una tienda web con MagentoGo, además estoy aprendiendo todo lo que puedo de MagentoCommunity, tengo dos cuestiones:

    1- Tienes idea de como suprimir el logo de MagentoGo dentro del Skin del admin??
    Queda muy feo cuando se conecta alguien al admin y ve cómo “de fácil” desarrollas la tienda, en el aspecto comercial.

    2- Estoy interesado en recibir clases particulares o algún curso específico sobre Magento, para aprender en condiciones, MagentoGo está muy limitado. Puedes contactar al email para orientarme?

    Muchas gracias y gran Blog

    Antonio

  2. Buenas David,

    los ejemplos de código no se acaban de ver bien por el formato supongo del módulo.

    Muy buena información y blog, estoy guardando en favoritos alguna página, un saludo :)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *