Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-05-2010 12:35:23

ze-pequeno
Nouveau membre
Date d'inscription: 16-11-2009
Messages: 3

Zend_Loader_Autoloader, Modules et Personnalisation

Bonsoir à tous,

J'ai une application modulaire dont la structure est la suivante :

Code:

--application
----modules
------default
------admin
--public
--library

Rien de particulier en soit. Voici également mon fichier de configuration :

Code:

[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:

<?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:

// On ajoute l'autoloder des classes Mv
$mvAutoloader        = new Mv_Loader_Autoloader();
$autoloader->pushAutoloader($mvAutoloader);

Voici la classe :

Code:

<?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:

( ! ) 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.

Code:

// 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

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages