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 :

Application modulaire avec ZEND [ZF 1.10]


Sujet :

MVC PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut Application modulaire avec ZEND
    Bonjour tous le monde,

    La question doit être redondante, mais je suis bloqué depuis plusieurs jours sur le chargement de mes classes.

    Mon architecture est similaire à celle proposé par julien : http://julien-pauli.developpez.com/t...d-application/

    En local (sous xampp 1.7.3 / PHP 5.3), je n'ai aucun souci, tout tourne bien.

    Par contre, lorsque j'upload le tout en prod, sur une Fedora / php 5.2, mes classes ne sont plus retrouvées, et la PHP me lance une erreur:

    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Class 'Default_Model_DbTable_Businessunit' not found in /home/zend/application/modules/default/controllers/MenuController.php  on line 9


    Voici le contenu de mon fichier de conf: application.ini

    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
    [production]
     
    # initilisation du report d'erreurs pour le mode production 
    phpSettings.display_startup_errors = 0
    phpSettings.display_errors = 0
     
     
    #definition de la timezone
    phpSettings.date.timezone = "Europe/Paris"
     
     
    # Include path
    includePaths.library = APPLICATION_PATH "/../library"
     
    # Bootstrap
    bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
    bootstrap.class = "Bootstrap"
     
    #initialisation des modules
    resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    resources.modules[] = ""
     
    # Layout
    resources.layout.layout = "default"
    resources.layout.layoutPath = APPLICATION_PATH "/modules/default/layouts/scripts"
     
    # Views
    resources.view.encoding = "UTF-8"
     
    # connexion à une base de données
    resources.db.adapter = "pdo_mysql"
    resources.db.params.host = "localhost"
    resources.db.params.username = "xxxxx"
    resources.db.params.password = "xxxxxxxx"
    resources.db.params.dbname = "xxxxxxx"
    resources.db.isDefaultTableAdapter = true
     
    [staging : production]
     
    [testing : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
     
    [development : production]
    # initilisation du report d'erreurs pour le mode developpement
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
    Voici mon fichier index.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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?php
     
    // Define path to application directory
    defined('APPLICATION_PATH')
        || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
     
    // Define application environment
    defined('APPLICATION_ENV')
        || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
     
    // Ensure library/ is on include_path
    set_include_path(implode(PATH_SEPARATOR, array(
        realpath(APPLICATION_PATH . '/../library'),
        get_include_path(),
    )));
     
     
     
    /** Zend_Application */
    require_once 'Zend/Application.php';
     
    require_once 'Zend/Loader/Autoloader.php';
    Zend_Loader_Autoloader::getInstance();
     
     
     
    //On lance la session
    require_once 'Zend/Session.php';
    Zend_Session::start();
     
     
    // Create application, bootstrap, and run
    $application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );
    $application->bootstrap()
                ->run();
    Mon fichier Bootstrap.php principal

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
     
        protected function _initDefaultNamespace()
        {
            $this->bootstrap('frontcontroller');
            $fc = $this->getResource('frontcontroller');
            $defaultModule = $fc->getControllerDirectory($fc->getDefaultModule());
     
            new Zend_Application_Module_Autoloader(array(
                               'namespace' => '',
                               'basePath'  => APPLICATION_PATH . $defaultModule,
            ));
     
        }
     
        protected function _initAutoload() {
            $autoloader = new Zend_Application_Module_Autoloader(array(
                            'namespace' => '',
                            'basePath' => APPLICATION_PATH . '/modules/default',
            ));
            return $autoloader;
        }
     
        protected function _initSession() {
     
            try {
                $sessionAdmin = new Zend_Session_Namespace('Admin');
     
            } catch (Zend_Session_Exception $e) {
                echo "Cannot instantiate this namespace ";
            }
     
            return $sessionAdmin;
        }
     
        protected function _initView() {
            $layout = $this->bootstrap('layout')->getResource('layout');
            $view = $layout->getView();
     
            $view->addHelperPath('ZendX/JQuery/View/Helper/', 'ZendX_JQuery_View_Helper');
            $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
            $viewRenderer->setView($view);
            Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
     
            $view->jQuery()->setLocalPath('/js/jQuery/js/jquery-1.4.2.min.js')
                    ->setUiLocalPath('/js/jQuery/js/jquery-ui-1.8.custom.min.js')
                    ->addStyleSheet('/js/jQuery/css/jquery-ui-1.8.custom.css');
     
        }
     
        protected function _initViewHelpers() {
            $layout = $this->bootstrap('layout')->getResource('layout');
            $view = $layout->getView();
     
            $view->headTitle('Titre');
            $view->headTitle()->setSeparator(' - ');
            $view->doctype('XHTML1_STRICT');
            $view->headMeta()->appendHttpEquiv('Content-Type',
                    'text/HTML; charset=UTF-8')
                    ->appendHttpEquiv('Content-Language', 'fr-FR');
            $view->headScript()->appendFile('/ckeditor/ckeditor.js')
                                ->appendFile('/ckeditor/adapters/jquery.js')
                                ->appendFile('/js/my.js');
        }
     
    }
    J'ai deux modules "default" et "extranet" dans lesquels se trouvent un fichier fichier Boostrap.php.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Default_Bootstrap extends Zend_Application_Module_Bootstrap
    {
     
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Extranet_Bootstrap extends Zend_Application_Module_Bootstrap
    {
    }

    Voila, j'espère que vous allez pouvoir m'aider à résoudre ce problème, qui est certe redondant mais que je n'arrive pas à résoudre, je pense avoir fait comme il faut, ça tourne en local, mais pas sur la machine de prod qui est une fédora.

    Merci!

  2. #2
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    Salut!

    Tu as un problème dans ton bootstrap :
    1- tu instancie deux fois le module default, ça ne sert à rien et en plus je pense pas que le chemin soit correct...
    De plus Si tu ne met pas de namespace à ton module default c'est pour ne pas appeler ta classe 'Default_Model_DbTable_Businessunit' mais 'Model_DbTable_Businessunit'.

    Commence par virer ta methode _initAutoLoad et crée une methode _initDefaultNamespace qui ressemble à ceci (fonctionne chez moi):

    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
     
    protected function _initDefaultNamespace() {
    $this->bootstrap('frontcontroller');
    $front = $this->getResource('frontcontroller');
    $defaultModule = $front->getDefaultModule();
     
    new Zend_Application_Module_Autoloader(array( 'namespace' => '', // pas de namespace 'basePath' => APPLICATION_PATH . '/modules/' . $defaultModule,
    ));
     
    new Zend_Application_Module_Autoloader(array( 'namespace' => 'Admin',
    'basePath' => APPLICATION_PATH . '/modules/admin',
    ));
     
    new Zend_Application_Module_Autoloader(array( 'namespace' => 'User',
    'basePath' => APPLICATION_PATH . '/modules/user',
    ));
    new Zend_Application_Module_Autoloader(array( 'namespace' => 'Catalog',
    'basePath' => APPLICATION_PATH . '/modules/catalog',
    ));
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut
    Merci manuscule,

    Effectivement; je me demandais pourquoi je ne pouvais pas appeler mes class en faisant un "new Model_DbTable_Class()"

    En faisant un echo de APPLICATION_PATH . '/modules/' . $defaultModule
    j'obtient bien le bon path.

    Ce problème d'instanciation etant maintenant résolu, je garde toujours le meme soucis en prod.

    Fatal error: Class 'Model_DbTable_Businessunit' not found in /home/zend/application/modules/default/controllers/BusinessunitController.php on line 17
    Plusieurs choses :
    Je me demandais si cela pourrait provenir de la conf d'apache?

    J'ai déjà fait un chmod 777 sur tous les fichiers.
    (provisoire).

    Merci.

  4. #4
    Membre chevronné Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Par défaut
    je compare avec ce que j'ai chez moi...

    #initialisation des modules
    resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
    resources.modules[] = ""

    chez moi j'ai resources.frontcontroller.moduleDirectory

    Sinon pour la classe Model_DbTable_Businessunit, le fichier s'appelle bien Businessunit.php et se trouve dans le path application/modules/default/models/DbTable ?

    Si c'est pas ça je comprend pas pourquoi ça ne marche pas....

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut
    manuscule, tu as bien vu!

    En effet, je vois que les conventions de nommage de mes classes est très important!

    Les fichiers de mes classes commençaient avec une minuscule, qui est une grossière erreur!

    J'ai donc renommer le tout avec une majuscule, donc

    "businessunit.php" => "Businessunit.php"
    Ca tourne nickel!

    Merci beaucoup!

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

Discussions similaires

  1. Application modulaire avec JSF
    Par drlim dans le forum JSF
    Réponses: 1
    Dernier message: 25/11/2012, 00h15
  2. Développer une application modulaire avec JTheque Core
    Par Baptiste Wicht dans le forum Utilities
    Réponses: 6
    Dernier message: 19/01/2010, 12h39
  3. créer une application exemple avec Zend
    Par Jcpan dans le forum Zend Framework
    Réponses: 15
    Dernier message: 06/02/2009, 18h12
  4. Débugger une application MVC avec Zend Studio
    Par StefC30 dans le forum Zend Studio
    Réponses: 5
    Dernier message: 16/04/2008, 22h47

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