Programmer's Reference Guide
| Charger les fichiers et les classes dynamiquement |
Chargeur de Plugins
Zend Framework vous propose l'utilisation de composants 'pluggables', que vous
créez vous même. Ceux-ci ne sont pas forcément dans l'include_path. De même,
ils ne suivent pas forcément les mêmes règles de nommage que les composants de
Zend Framework.Zend_Loader_PluginLoader propose une solution à ce
problème.
PluginLoader suit la convention 'une classe par fichier' et les
underscores sont utilisés comme séparateurs de dossiers. Il accepte aussi qu'un
préfixe optionnel lui soit passé, afin de charger une classe. Tous les chemins
sont analysés en ordre LIFO. Grâce à ces deux spécificités, vous pouvez 'namespacer'
vos plugins, et écraser les plugins enregistrés plus tôt.
Utilisation basique
Même si nous parlons de 'plugins', ce n'est pas reservé aux plugins de contrôleur frontal, mais bien à toute classe étant utilisée avec Zend Framework. Imaginons une structure de repertoires comme suit, dans laquelle les dossiers 'application' et 'library' sont dans l'include_path :
application/
modules/
foo/
views/
helpers/
FormLabel.php
FormSubmit.php
bar/
views/
helpers/
FormSubmit.php
library/
Zend/
View/
Helper/
FormLabel.php
FormSubmit.php
FormText.php
Maintenant créons un chargeur de plugins pour utiliser les différentes classes d'aides de vue:
<?php
$loader = new Zend_Loader_PluginLoader();
$loader->addPrefixPath('Zend_View_Helper', 'Zend/View/Helper/')
->addPrefixPath('Foo_View_Helper', 'application/modules/foo/views/helpers')
->addPrefixPath('Bar_View_Helper', 'application/modules/bar/views/helpers');
?>Il devient alors possible de charger une aide de vue en spécifiant juste le nom de sa classe:
<?php
// charge l'aide 'FormText' :
$formTextClass = $loader->load('FormText'); // 'Zend_View_Helper_FormText';
// charge l'aide 'FormLabel' :
$formLabelClass = $loader->load('FormLabel'); // 'Foo_View_Helper_FormLabel'
// charge l'aide 'FormSubmit' :
$formSubmitClass = $loader->load('FormSubmit'); // 'Bar_View_Helper_FormSubmit'
?>Une fois chargée, la classe devient instanciable.
Note: Plusieurs dossiers peuvent être assignés à un même prefixe
Vous pouvez 'namespacer' vos composants en enregistrant plusieurs chemins pour un même préfixe.Zend_Loader_PluginLoadercherchera alors en ordre LIFO (dernier arrivé, premier sorti). Ceci est pratique pour court-circuiter ses composants et utiliser ceux en incubateur, par exemple.
Note: Paramétrage des chemins dans le constructeur
En constructeur, passez un tableau de paires prefix / path ou prefix / paths -- plusieurs dossiers par préfixe :
<?php $loader = new Zend_Loader_PluginLoader(array( 'Zend_View_Helper' => 'Zend/View/Helper/', 'Foo_View_Helper' => 'application/modules/foo/views/helpers', 'Bar_View_Helper' => 'application/modules/bar/views/helpers' )); ?>
Zend_Loader_PluginLoader peut aussi permettre de partager des plugins
grâce au registre. Indiquez le nom du registre de cette manière :
<?php // Stocke les plugins dans le registre à l'index 'foobar': $loader = new Zend_Loader_PluginLoader(array(), 'foobar'); ?>
Si un autre composant instancie le PluginLoader en utilisant le même
nom de registre, alors tous les chemins et plugins déja chargés seront disponibles.
Manipulation des chemins des Plugins
Pour afficher ou supprimer des chemins déja enregistrés, utilisez l'une des méthodes suivantes :
getPaths($prefix = null)retourne les chemin sous la forme prefix / path si$prefixn'est pas renseigné. Sinon, ce sont les chemins enregistrés pour le prefixe en question qui sont renvoyés.clearPaths($prefix = null)va effacer tous les chemins. Si$prefixest passé, ce sont les chemins correspondants à ce préfixe qui seront supprimés.removePrefixPath($prefix, $path = null)permet de supprimer un chemin précis, d'un préfixe spécifié. Si$pathn'est pas renseigné, tous les chemins du préfixe seront effacés.
Test des Plugins et récupération des noms de classe
Lorsque vous voulez savoir si une classe de plugin a été chargée, isLoaded()
prend en paramètre le nom du plugin, et retourne sont statut.
Une autre utilisation de PluginLoader peut être de récupérer le nom des classes
des plugins chargés.getClassName() vous le permet. Utilisée en conjonction avec
isLoaded(), vous pouvez écrire par exemple ceci :
<?php
if ($loader->isLoaded('Adapter')) {
$class = $loader->getClassName('Adapter');
$adapter = call_user_func(array($class, 'getInstance'));
}
?>| Charger les fichiers et les classes dynamiquement |
