Bonsoir à tous,
J'ai une application modulaire dont la structure est la suivante :
Rien de particulier en soit. Voici également mon fichier de configuration :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 --application ----modules ------default ------admin --public --library
Et mon fichier de Bootstrap :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 [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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 <?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; } }
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 :
Voici la classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // On ajoute l'autoloder des classes Mv $mvAutoloader = new Mv_Loader_Autoloader(); $autoloader->pushAutoloader($mvAutoloader);
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 <?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); } }
De là me vienne deux questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 ( ! ) 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
- 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
Partager