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

Zend Framework PHP Discussion :

Autoloading, ma library [ZF 1.8]


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut Autoloading, ma library
    Bonjour,

    J'ai une architecture comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /
    application/
    -------------/models/
    -----------------------/Tables
    -----------------------/Forms
    -------------------------------/Admin
    -------------------------------/Item
    library/Zend/...
    -------/Feng/...
    Jusqu'à présent je n'avais pas ma propre library, mais maintenant que j'en ai une (toute petite mais quand même :p), j'ai des difficultés à charger mes classes.

    Je voudrais appeler mes classes de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Appel du modèle de table des membres
    $membre = new Table_Membre();
     
    //Appel de mon Acl par exemple
    $acl = new Feng_Acl_Ini();
    Mais je ne veux pas avoir besoin de spécifier toute mon architecture dans l'autoloader, ça serait fastidieux !! (mais bon si c'est vraiment obligé...)

    Actuellement j'ai ça dans mon bootstrap (largement inspiré de Julien-Pauli):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    require_once "Zend/Loader/Autoloader.php";
     
    $application = new Zend_Loader_Autoloader_Resource(array(
     'basePath'      => APPLICATION_PATH . '/models',
     'namespace'     => '',
     'resourceTypes' => array('tables'=>array('path'=>'Tables/','namespace'=>'Table'),
                              'forms'=>array('path'=>'Forms/', 'namespace'=>'Form')
    )));
    $libs = new Zend_Loader_Autoloader_Resource(array(
     'basePath'      => APPLICATION_PATH . '../library/Feng',
     'namespace'     => 'Feng',
     'resourceTypes' => array('libs'=>array('path'=>'Feng/','namespace'=>'Feng'),
    )));
    Mais la partie librairie n'est pas cohérente, ça fait double namespace :/

    De plus pour les modèles, je dois donner tous les répertoires ...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    Apparement, Zend Framework 1.8.2 présente un gros "bug" au niveau du loader, en effet, la chaine d'autoloading des classes à implémenter pour arriver à Zend_Loader_Autoloader_Resource est brisé !!

    De plus, la classe ajoute des anti-slash qui rende impossible l'inclusion des fichiers, voyez plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Warning: Zend_Loader_Autoloader_Resource::include(/home/web/lepiredunet_v2/application/models/Tables//Item.php) [zend-loader-autoloader-resource.include]: failed to open stream: No such file or directory in /home/web/lepiredunet_v2/library/Zend/Loader/Autoloader/Resource.php on line 173
     
    Warning: Zend_Loader_Autoloader_Resource::include() [function.include]: Failed opening '/home/web/lepiredunet_v2/application/models/Tables//Item.php' for inclusion (include_path='/home/web/lepiredunet_v2/application/../library:.:/usr/share/php:/usr/share/pear') in /home/web/lepiredunet_v2/library/Zend/Loader/Autoloader/Resource.php on line 173
     
    Fatal error: Class 'Table_Item' not found in /home/web/lepiredunet_v2/application/controllers/IndexController.php on line 11
    Ce message d'erreur pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $application = new Zend_Loader_Autoloader_Resource(array(
     'basePath'      => APPLICATION_PATH . '/models',
     'namespace'     => '',
     'resourceTypes' => array('tables'=>array('path'=>'Tables','namespace'=>'Table'),
                              'forms'=>array('path'=>'Forms', 'namespace'=>'Form')
    )));
    Et je ne vous parle pas des require_once à ajouter pour qu'il ne vous dise pas que AutoLoader_Resource et et ses compagnons n'existent pas...

    J'ai envie de dire : WTF ?!!!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    Bon, j'ai fini par trouver :

    Bon, primo, il faut corriger le bug de double (voir triple) slash dans les chemins :

    Dans le fichier Zend/Loader/Autoloader/Resource.php , ligne 173, remplacer par ceci (je ne propose qu'une solution, je ne dis pas que c'est la meilleure) :

    Code Zend/Loader/Autoloader/Resource.php ; ligne 173 : Sélectionner tout - Visualiser dans une fenêtre à part
    return include $path . str_replace('_', '/', $final) . '.php';

    Ensuite, dans le bootstrap :

    Code bootstrap.php : 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
    defined('ROOT_PATH')
        or define('ROOT_PATH',realpath('../'));
     
    //-------------------- Autoloading ------------------//
     
    require_once ROOT_PATH.'/library/Zend/Loader/Autoloader.php';
    require_once ROOT_PATH.'/library/Zend/Loader/Autoloader/Resource.php';
     
    // Pour la librairie :
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace('Feng_');
     
    // Pour les ressources diverses :
     
    $foo = new Zend_Loader_Autoloader_Resource(array(
     'basePath'      => APPLICATION_PATH . '/models',
     'namespace'     => '',
     'resourceTypes' => array('tables'=>array('path'=>'Tables','namespace'=>'Table'),
                              'forms'=>array('path'=>'Forms', 'namespace'=>'Form')
    )));

    Voilà qui marche pour moi, j'espère que ça servira à d'autres

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

Discussions similaires

  1. [Autoloader?] Ne trouve pas la classe dans library
    Par IgiXphp dans le forum Autres composants
    Réponses: 4
    Dernier message: 03/08/2011, 20h27
  2. [JNI]problème option -Djava.library.path
    Par sylviiie dans le forum ANT
    Réponses: 2
    Dernier message: 18/05/2004, 08h54
  3. Réponses: 2
    Dernier message: 05/02/2004, 13h58
  4. Réponses: 2
    Dernier message: 26/01/2004, 20h11
  5. [Kylix] Chargement de libraries
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 14/03/2003, 09h07

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