(Yaf >=1.0.0)
Yaf_Loader introduit une solution complète de chargement automatique pour Yaf.
Lors de la première récupération d'une instance de Yaf_Application, Yaf_Loader instancie un singleton et s'enregistre auprès de spl_autoload. Il est possible de récupérer une instance à l'aide de Yaf_Loader::getInstance()
Yaf_Loader ne tente de charger une classe qu'une
seule fois ; en cas d'échec, selon la valeur de yaf.use_spl_autoload, si cette
configuration est à On, Yaf_Loader::autoload()
retournera false, laissant ainsi sa chance à une autre fonction de
chargement automatique. Si elle est à Off (valeur par défaut),
Yaf_Loader::autoload() retournera true, et surtout
une alerte très utile sera déclenchée (très utile pour découvrir pourquoi
une classe n'a pas pu être chargée).
Note:
Il est recommandé de laisser yaf.use_spl_autoload à Off, à moins qu'une bibliothèque ne dispose de son propre mécanisme de chargement automatique et qu'il soit impossible de le réécrire.
Par défaut, Yaf_Loader suppose que toutes les bibliothèques (les scripts définissant des classes) sont stockées dans le répertoire global des bibliothèques, qui est défini dans le php.ini (yaf.library).
Pour que Yaf_Loader recherche certaines classes (bibliothèques) dans le répertoire local des classes (qui est défini dans application.ini, et qui vaut par défaut application.directory . "/library"), il faut enregistrer le préfixe de classe à l'aide de Yaf_Loader::registerLocalNameSpace()
Voici quelques exemples (en supposant que APPLICATION_PATH vaut application.directory) :
Exemple #1 Exemple de configuration
// En supposant la configuration suivante dans le php.ini : yaf.library = "/global_dir" // En supposant la configuration suivante dans application.ini application.library = APPLICATION_PATH "/library"
Exemple #2 Enregistrement d'un espace de noms local
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initLoader($dispatcher) {
Yaf_Loader::getInstance()->registerLocalNameSpace(array("Foo", "Bar"));
}
}
?>Exemple #3 Exemple de chargement de classe
class Foo_Bar_Test => // APPLICATION_PATH/library/Foo/Bar/Test.php class GLO_Name => // /global_dir/Glo/Name.php class BarNon_Test // /global_dir/Barnon/Test.php
Exemple #4 Exemple de chargement d'une classe avec namespace
class \Foo\Bar\Dummy => // APPLICATION_PATH/library/Foo/Bar/Dummy.php class \FooBar\Bar\Dummy => // /global_dir/FooBar/Bar/Dummy.php
Il est à noter que tous les dossiers commencent par une majuscule ; il est possible de les mettre en minuscules en définissant yaf.lowcase_path = On dans le php.ini
Yaf_Loader est également conçu pour charger les classes MVC, et la règle est la suivante :
Exemple #5 Exemple de chargement de classes MVC
Controller Classes => // APPLICATION_PATH/controllers/ Model Classes => // APPLICATION_PATH/models/ Plugin Classes => // APPLICATION_PATH/plugins/
Exemple #6 Distinction des classes MVC
Controller Classes =>
// ***Controller
Model Classes =>
// ***Model
Plugin Classes =>
// ***Plugin
Exemple #7 Exemple de chargement MVC
class IndexController
// APPLICATION_PATH/controllers/Index.php
class DataModel =>
// APPLICATION_PATH/models/Data.php
class DummyPlugin =>
// APPLICATION_PATH/plugins/Dummy.php
class A_B_TestModel =>
// APPLICATION_PATH/models/A/B/Test.php
de plus, le répertoire sera affecté par yaf.lowcase_path.Note:
À partir de la version 2.1.18, Yaf gère le chargement automatique des contrôleurs côté script utilisateur (c'est-à-dire le chargement automatique déclenché par un script PHP utilisateur, par exemple l'accès à une propriété statique d'un contrôleur dans le Bootstrap ou dans les plugins), mais le chargeur automatique ne cherche le script de la classe du contrôleur que dans le dossier du module par défaut, à savoir "APPLICATION_PATH/controllers/".
$local_library_path = null, string $global_library_path = null): Yaf_Loader|false$namespace, string $path = null): Yaf_Loader|falsePar défaut, cette valeur est application.directory . "/library" ; il est possible de la modifier soit dans le fichier application.ini (application.library), soit par un appel à Yaf_Loader::setLibraryPath()