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

MVC PHP Discussion :

Bootstrap et autoloader [ZF 1.9]


Sujet :

MVC PHP

  1. #1
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Août 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2008
    Messages : 28
    Par défaut Bootstrap et autoloader
    Bonjour,

    A l'heure actuelle, j'essaye de passé une application déjà développer avec un bootsrap de type "tous dans le fichier index.php" à un boostrap de type "Zend_Application". Pour ce faire j'ai utilisé les divers tuto trouvé sur le net et l'aide de manuscle (encore merci ) j'ai réalisé ceci :

    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
    // index.php
     
    error_reporting(E_ALL|E_STRICT);
     
    // Définit l'environnement de l'application 
    defined('APPLICATION_PATH')
        || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
     
    defined('APPLICATION_ENV') 
        || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
     
    set_include_path(implode(PATH_SEPARATOR, array(
        realpath('/home/wwwroot/library'),
        realpath(APPLICATION_PATH.'/modules'),
        get_include_path()
    )));
     
    require_once 'Zend/Loader/Autoloader.php';
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->setFallbackAutoloader(true);
     
    // Création de l'application
    $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH.'/../config/config2.ini');
    $application->bootstrap()->run();
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    // application/Bootstrap.php
     
    <?php
    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
    {
        protected $_registry;
        protected $_config;
     
        protected function _initDefaultNamespace(){
            $this->bootstrap('frontcontroller');
            $fc = $this->getResource('frontcontroller');
            $defaultModule = $fc->getControllerDirectory($fc->getDefaultModule());
            new Zend_Application_Module_Autoloader(
                array(
                    'namespace' => '', // pas de namespace
                    'basePath'  => APPLICATION_PATH . $defaultModule,
                 )
            );
            new Zend_Application_Module_Autoloader(
                array(
                    'namespace' => 'Admin_', // pas de namespace
                    'basePath'  => APPLICATION_PATH . '/modules/admin',
                 )
            );        
        }
     
        //initilisation de la configuration
        protected function  _initConfiguration(){
            $config = new Zend_Config($this->getOptions(), 'production');
            $this->_config = $config;
            $this->_registry = Zend_Registry::getInstance();
            $this->_registry->set('config', $config);
     
            return $config;
        }
     
        //initilisation de la structure MVC
        protected function _initView(){
     
            Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml');
     
            $view = new Zend_View();
            $view->setEncoding('UTF-8');
            $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
            Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
            Zend_Layout::startMvc(array('layout'=>'front-office' ,'layoutPath'=>APPLICATION_PATH."/../layouts/site/"));
            $mvc = Zend_Layout::getMvcInstance();
            $this->_registry->set('mvc', $mvc);
            return $view;
        }
     
    }
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    // application/module/admin/bootstrap.php 
     
    class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
    {
        protected $_config;
        protected $_registry;
     
        public function __construct($application){
            parent::__construct($application);
     
            $this->_config = Zend_Registry::get('config');
            $this->_registry = Zend_Registry::getInstance();
        }
     
        //initilisation des connection a la base de donnée
        public function activeInitDatabase(){
            try{
                $db = Zend_Db::factory($this->_config->db);
                //on test si la connection se fait
                $db->getConnection();
            } catch( Exception $e ){
                exit( $e -> getMessage() );
            }
            Zend_Db_Table::setDefaultAdapter($db);
            $this->_registry->set('dbAdapter', $db);
            return $db;
        }
     
     
        //initilisation de l'authentification
        public function activeInitAuth(){
     
            $storage = new Zend_Auth_Storage_Session();
            $sessionNamespace = new Zend_Session_Namespace($storage->getNamespace());
            $sessionNamespace->setExpirationSeconds(3600);
            $this->_registry->set('session', $sessionNamespace);
     
            $auth = Zend_Auth::getInstance();
            $auth->setStorage($storage);
            $acl = new AccessRules($auth);
            $this->_registry->set('auth', $auth);
            $this->_registry->set('acl', $acl);
            return $auth;
        }
     
        //initilisation des controller frontal
        public function activeInitFrontController(){
            $frontController = $this->getApplication()->bootstrap('frontController')->getResource('frontController');
            $frontController->registerPlugin(new Common_Plugin_AuthAnnonces($this->_registry->get('auth'), $this->_registry->get('acl')))
                ->registerPlugin(new Common_Plugin_Layout($this->_registry->get('auth'), $this->_registry->get('mvc')))
                ->registerPlugin(new Plugins_Famille($this->_registry->get('auth')))
                ->setControllerDirectory(APPLICATION_PATH.'/modules/admin/controllers');            
            return $frontController;
        }
    }
    et le config de tous ça (avec 2/3 infos de moins (qui a dis infos de connexion à la db ? ) )
    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
     
    [production]
    ;définition des variable pour l'environement de production
     
    # initilisation du report d'erreurs pour le mode production 
    phpSettings.display_startup_errors = 0
    phpSettings.display_errors = 0
    phpsettings.date.timezone = "Europe/Paris"
     
    # Bootstrap
    bootstrap.path  = APPLICATION_PATH "/Bootstrap.php"
    bootstrap.class = "Bootstrap"
     
    resources.frontController.throwexceptions = true
    resources.frontController.plugins.Common_Plugin_ModuleConfig = Common_Plugin_ModuleConfig
    resources.frontController.plugins.Common_Plugin_IncludePath = Common_Plugin_IncludePath
    resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    resources.frontController.moduleControllerDirectoryName = "controllers"
    resources.frontController.defaultControllerName = "index"
    resources.frontController.defaultAction = "index"
    resources.frontController.defaultModule = "default"
     
     
    resources.modules[] = "";
    resources.modules.admin = APPLICATION_PATH "/modules/admin"
    Mais voila, j'ai bien l'affichage de mon layout, mais avec dedans un chouette "warning" php (qui me pose problème pour la gestion de la session de mon module admin) qui me dit :

    Warning: Zend_Loader::include(FrontController.php) [zend-loader.include]: failed to open stream: No such file or directory in /home/wwwroot/library/Zend/Loader.php on line 83

    Warning: Zend_Loader::include() [function.include]: Failed opening 'FrontController.php' for inclusion (include_path='/home/wwwroot/library:/home/wwwroot/aws-annonce/application/modules:.:/usr/share/php:/usr/share/pear') in /home/wwwroot/library/Zend/Loader.php on line 83
    Du coup, j'ai essayé plusieurs choses, comme faire un FrontController personnalisé (vide...), écrire une fonction d'initialisation "_init" à la mano mais la impossible de charger quoi que se soit....

    Ah oui, je précise aussi que j'utilise un plugin de pour exécuter les fonctions des bootstraps de modules "on demand" ( celui donnée dans le blog de BinaryKitten ( merci à lui ) )

    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
    45
    46
    47
    48
    49
    50
    51
    52
     
    // plugin de chargement du bootstrap spécifique de BinaryKitten
     
    <?php
    class Common_Plugin_ModuleConfig extends Zend_Controller_Plugin_Abstract
    {
        public function routeShutdown(Zend_Controller_Request_Abstract $request)
        {
            $activeModuleName = $request->getModuleName();
     
            $frontController = Zend_Controller_Front::getInstance();
            $bootstrap =  $frontController->getParam('bootstrap');
            //$application = Zend_Registry::get('application');
            //$bootstrap = $application->getResource('frontController');
     
            $moduleList = $bootstrap->getResource('modules');
     
            $moduleInitName = strtolower($activeModuleName)."Init";
            $moduleInitNameLength = strlen($moduleInitName);
     
            if (isset($moduleList[$activeModuleName])) {
                $activeModule = $moduleList[$activeModuleName];
     
                $bootstrapMethodNames = get_class_methods($bootstrap);
                foreach ($bootstrapMethodNames as $key=>$method) {
                    $runMethod = false;
                    $methodNameLength = strlen($method);
                    if ($moduleInitNameLength < $methodNameLength &&
                        $moduleInitName == substr($method, 0, $moduleInitNameLength)) {
                        call_user_func(array($bootstrap,$method));
                    }
                }
            } else {
                $activeModule = $bootstrap;
            }
     
            $methodNames = get_class_methods($activeModule);
            foreach ($methodNames as $key=>$method) {
                $runMethod = false;
                $methodNameLength = strlen($method);
                if (10 < $methodNameLength && 'activeInit' === substr($method, 0, 10)) {
                    $runMethod = true;
                } elseif ($moduleInitNameLength < $methodNameLength &&
                        $moduleInitName == substr($method, 0, $moduleInitNameLength)) {
                    $runMethod = true;
                }
                if ($runMethod) {
                    call_user_func(array($activeModule,$method));
                }
            }
        }
    }
    et un second de mon cru qui me permet juste de rajouter le path de mes models et library spécifique par modules dans l'include path php

    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
     
    <?php
    class Common_Plugin_IncludePath extends Zend_Controller_Plugin_Abstract
    {
        public function routeShutdown(Zend_Controller_Request_Abstract $request)
        {
            $activeModuleName = $request->getModuleName();
     
            $moduleList = explode(PATH_SEPARATOR, get_include_path());
     
            foreach($moduleList as $lepath){
                $regR = array();
     
                if(ereg("^.*\/modules\/([a-zA-Z0-9]*)\/[a-zA-Z0-9]*$", $lepath, $regR)){
                    $lepath = "";
                }
            }
     
            $moduleList[] = APPLICATION_PATH."/modules/".$activeModuleName."/models";
            $moduleList[] = APPLICATION_PATH."/modules/".$activeModuleName."/library";
     
            set_include_path(implode(PATH_SEPARATOR, $moduleList));        
        }
    }
    Donc voila, si quelqu'un a une idée....

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Je dit peut-être une bêtise, mais le répertoire /library, ne serait pas plutôt dans

    /home/wwwroot/aws-annonce que dans /home/wwwroot/ ?

  3. #3
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Août 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2008
    Messages : 28
    Par défaut
    Bonjour,

    Non, non, me chemin vers les Libs et bien le bon, car je n'ai qu'une seule instance (copie... ) du framework Zend sur mon serveur (j'ai plusieurs application qu'il l'utilise, et j'ai eu la flemme de faire des liens symboliques....).

    Cependant, j'ai résolu mon p^problème grâce a une issues du BugTrackeur de Zend (celle ci... ).

    Je met donc le sujet pour résolu.

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ZF 1.9] Autoloader dans bootstrap
    Par jfrag dans le forum Zend Framework
    Réponses: 2
    Dernier message: 11/12/2009, 14h07
  2. Réponses: 8
    Dernier message: 09/04/2008, 14h09
  3. Pb JBoss "Started jndi bootstrap jnpPort=1099, rmiPort=1098"
    Par wayle dans le forum Wildfly/JBoss
    Réponses: 7
    Dernier message: 28/08/2007, 15h58
  4. [POO] Probleme avec static et autoload
    Par laetyboop dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2006, 14h46
  5. exemple de script avec autoloader
    Par djibril dans le forum Modules
    Réponses: 4
    Dernier message: 24/11/2005, 17h53

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