Condividi!

Come noto, Magento è costruito sul framework Zend, il quale definisce la “naming convention” per le classi in esso contenute.

Per “naming convention” si intende uno “standard” pre-definito da rispettare rigorosamente ogni qualvolta si assegna un nome ad una nuova classe.
In Magento, il nome di una classe ricalca esattamente quello che è il percorso, all’interno del file system, nel quale essa è collocata, a partire dal suo namespace.

Si richiede che il nome della classe sia scritto secondo il seguente formato:

<NameSpace>_<ModuleName>_<ClassType>_<ClassName>
Esempio: Mage_Catalog_Model_Product

Quando e perchè tutto ciò diventa utile? Considerando l’immenso numero di classi all’interno della piattaforma, sarebbe folle pensare di utilizzare manualmente i comandi “include” o “require” per includere all’interno di ogni singolo script le classi necessarie all’istanziamento dei corrispettivi oggetti.
Proprio per questo motivo, rispettando tale standard, possiamo utilizzare il sistema di “autoloading” integrato in Magento, per la precisione nella classe lib/Varien/Autoload.php.
Come si evince dal termine stesso, questa funzione provvede ad includere automaticamente una classe ogni qualvolta si tenta di istanziare un nuovo oggetto da essa derivante.

/*
 * Creazione di un oggetto
 */

//Ambiente sprovvisto di autoloading
include 'path/nomeFileClasse.php';
$oggetto = new nomeClasse();

//Ambiente provvisto di autoloading (Zend/Magento standard)
$oggetto = new NameSpace_Modulo_TipoClasse_NomeClasse;

Come funziona il metodo autoload()?

Il metodo autoload si trova nel file app/Mage.php, ed esegue i seguenti step:

  1. Il nome della classe viene passato al metodo autoload($class)
  2. Il metodo sostituisce il carattere “_” con la costante DIRECTORY_SEPARATOR “/”, ed aggiunge, infine, la stringa “.php” alla stringa precedente formata, dunque, ad esempio, trasforma “Mage_Catalog_Model_Product” in “Mage/Catalog/Model/Product.php”
  3. Il metodo, infine, si occupa automaticamente di effettuare l’include della classe appena rintracciata.
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';
        //echo $classFile;die();
        return include $classFile;
    }

 

Guardando la struttura della cartella app, che contiene i tre codepools “Core, Community e Local” sorge spontanea una domanda: se è vero che Magento riesce a rintracciare la classe attraverso il metodo autoload(), come fa però a stabilire il percorso base ed i codepools nei quali essa si trova? La classe Mage_Catalog_Model_Product, infatti, potrebbe anche trovarsi nel codepool Local per un eventuale override (metodo naturalmente inopportuno…)

Il compito di tale azione è riservato al file app/Mage.php, che viene incluso dal file index.php praticamente all’inizio del processo di avvio dell’applicazione, eseguendo sin da subito alcune operazioni molto importanti:

  1. Definisce i 4 percorsi all’interno dei quali il metodo autoload effettuerà la sua ricerca, secondo un ordine specifico: prima il codepool local, poi il community, e successivamente il codepool core, mentre solo alla fine cercherà la classe all’interno della cartella lib (che contiene le librerie).
  2. Salva i quattro percorsi all’interno della variabile di tipo array $appPath
  3. Salva all’interno del registro (immaginatelo come un insieme di variabili globali) tali path di inclusione, aggiungendoli ad eventuali path di inclusione originali
  4. Include “manualmente” la classe Varien_Autoload
  5. Infine richiama il metodo statico register() della classe Varien_Autoload, il quale non fa altro che definire il metodo autoload() come quello predisposto alle operazioni di autoinclusione delle classi.
if (defined('COMPILER_INCLUDE_PATH')) {
    $appPath = COMPILER_INCLUDE_PATH;
    set_include_path($appPath . PS . Mage::registry('original_include_path'));
    include_once COMPILER_INCLUDE_PATH . DS . "Mage_Core_functions.php";
    include_once COMPILER_INCLUDE_PATH . DS . "Varien_Autoload.php";
} else {
    /**
     * Set include path
     */
    $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'));
    include_once "Mage/Core/functions.php";
    include_once "Varien/Autoload.php";
}
Varien_Autoload::register();