Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonsoir à tous,
J'ai une application modulaire dont la structure est la suivante :
--application ----modules ------default ------admin --public --library
Rien de particulier en soit. Voici également mon fichier de configuration :
[production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Application" pluginPaths.ZendX_Application_Resource = "ZendX/Application/Resource/" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" resources.frontController.params.displayExceptions = 0 resources.modules[] = "default" resources.layout.layout = "default" resources.layout.layoutPath = APPLICATION_PATH "/layouts" resources.view.encoding = "UTF-8" resources.view[] = "" resources.Jquery.noconflictmode = true resources.Jquery.version = 1.4.2 resources.Jquery.uienable = true resources.Jquery.uiversion = 1.8.1 resources.Jquery.cdn_ssl = false resources.Jquery.rendermode = 255 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1
Et mon fichier de Bootstrap :
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initPlugins() { // On s'assure que les namespaces soient initialisés $this->bootstrap('namespaces'); // On récupère l'instance du Controlleur Frontal de l'application $frontController = Zend_Controller_Front::getInstance(); // On ajoute les différents Plugin au Controlleur Frontal } /** * Initialise les namespaces de l'application * @access protected * @return Zend_Loader_Autoloader */ protected function _initNamespaces() { // On récupère l'autoloader de l'application $autoloader = Zend_Loader_Autoloader::getInstance(); // On ajoute le namespace "Mv" $autoloader->registerNamespace('Mv_'); // On ajoute l'autoloder des classes Mv $mvAutoloader = new Mv_Loader_Autoloader(); $autoloader->pushAutoloader($mvAutoloader); // On retourne l'autoloader return $autoloader; } }
Jusque là pas de problème non plus. En lançant l'application, tout est correct. J'accède bien à tous mes modules, tous mes contrôleurs. Mon "Layout" et mes "Views" sont correctement initialisés.
Ensuite je me suis dis, tiens je vais essayer d'utiliser des classes externes (dont la convention de nommage n'a aucun rapport avec Zend, et qui sont situées sur un autre endroit de mon disque). Je fouille alors dans la documentation de Zend et je trouve une méthode dans Zend_Loader_Autoloader : pushAutoloader. Je me dis "cool elle permet d'utiliser d'autres Autoloader en même temps que celui de Zend".
Je fait alors une classe Mv_Loader_Autoloader et c'est à ce moment là que je rajoute ces lignes dans le _initNamespaces de mon Bootstrap :
// On ajoute l'autoloder des classes Mv $mvAutoloader = new Mv_Loader_Autoloader(); $autoloader->pushAutoloader($mvAutoloader);
Voici la classe :
<?php /** * @TODO : Informations sur la licence * * @category Mv * @package Mv * @copyright * @license */ /** * @category Mv * @package Mv * @copyright * @license */ class Mv_Loader_Autoloader implements Zend_Loader_Autoloader_Interface { protected $_basePath = ''; /** * Constructeur de la classe * @access public * @return Void */ public function __construct() { $this->_basePath = '/srv/mv'; } /** * Déclenchée pour autocharger une classe de MyVisit' * @access public * @param String $class Nom de la classe à charger * @return Void */ public function autoload($class) { // On inclut le fichier correspondant au nom de la classe en recherchant dans le chemin de base Zend_Loader::loadFile($class.'.php', $this->_basePath, true); } }
Jusque là, aucun problème ne plus, je peut instancier ces classes externes. Maintenant j'avais besoin de faire certains traitement dans les Bootstrap de mes modules (qui n'existaient pas). Je crée un Boostrap par module (sans aucun code, juste la définition de la classe) et là ça va plus. Voilà les erreurs que je retrouve :
( ! ) Warning: include_once(FrontController.php) [function.include-once]: failed to open stream: No such file or directory in D:\usr\share\zend\1.10.4\library\Zend\Loader.php on line 146 Call Stack # Time Memory Function Location 1 0.0009 93224 {main}( ) ..\index.php:0 2 0.0471 1115360 Zend_Application->bootstrap( ) ..\index.php:27 3 0.0471 1115632 Zend_Application_Bootstrap_BootstrapAbstract->bootstrap( ) ..\Application.php:355 4 0.0471 1115832 Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap( ) ..\BootstrapAbstract.php:582 5 0.1260 2922864 Zend_Application_Bootstrap_BootstrapAbstract->_executeResource( ) ..\BootstrapAbstract.php:622 6 0.1261 2924576 Zend_Application_Resource_Modules->init( ) ..\BootstrapAbstract.php:679 7 0.1331 2973200 Zend_Application_Module_Bootstrap->__construct( ) ..\Modules.php:106 8 0.1339 2979520 Zend_Application_Bootstrap_BootstrapAbstract->hasPluginResource( ) ..\Bootstrap.php:82 9 0.1339 2979672 Zend_Application_Bootstrap_BootstrapAbstract->getPluginResource( ) ..\BootstrapAbstract.php:314 10 0.1340 2982304 class_exists ( ) ..\BootstrapAbstract.php:354 11 0.1340 2982592 Zend_Loader_Autoloader::autoload( ) ..\Autoloader.php:0 12 0.1341 2983456 Mv_Loader_Autoloader->autoload( ) ..\Autoloader.php:120 13 0.1341 2983896 Zend_Loader::loadFile( ) ..\Autoloader.php:59
De là me vienne deux questions :
- Le pushAutoloader (comme son nom l'indique), ajoute bien un autoloader ? Il n'écrase pas l'autoloader de Zend ?
- Pourquoi le problème apparait seulement quand j'utiliser des bootstrap de module et pas avant ? Un conflit peut être avec Zend_Application_Module_Bootstrap qui doit s'embrouiller avec mon autoloader perso ?
Merci d'avance pour vos réponse
[EDIT]
Aucune prétention à chercher dans le bugtracker de Zend, mais je me demande si ce n'est pas lié. A vous de juger ...
En commentant les lignes suivantes (76 à 84) dans Zend_Application_Module_Bootstrap je n'ai plus de problème.
// ZF-6545: ensure front controller resource is loaded if (!$this->hasPluginResource('FrontController')) { $this->registerPluginResource('FrontController'); } // ZF-6545: prevent recursive registration of modules if ($this->hasPluginResource('modules')) { $this->unregisterPluginResource('modules'); }
Hors ligne
Pages: 1