IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres composants PHP Discussion :

Zend_Loader_Autoloader, Modules et Personnalisation


Sujet :

Autres composants PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 144
    Par défaut Zend_Loader_Autoloader, Modules et Personnalisation
    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

  2. #2
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 144
    Par défaut
    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // 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');
            }
    http://framework.zend.com/issues/browse/ZF-7900

Discussions similaires

  1. [PrestaShop] module de personnalisation
    Par bernard3333 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 15/11/2013, 11h32
  2. [1.x] Personnaliser le module d'identification
    Par sylvain640 dans le forum Symfony
    Réponses: 20
    Dernier message: 23/05/2011, 13h41
  3. Réponses: 1
    Dernier message: 22/08/2008, 10h19
  4. [Joomla!] Position personnalisée d'un module créé
    Par masseur dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 10/08/2008, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo