Bonsoir à tous,

J'ai une application modulaire dont la structure est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
--application
----modules
------default
------admin
--public
--library
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
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
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
 
<?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 :
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);
Voici la classe :
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);
	}
 
}
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
 
( ! ) 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