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 :

Mélange autoload et require


Sujet :

Zend Framework PHP

  1. #1
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut Mélange autoload et require
    Bonjour à tous

    J'ai un petit souci avec l'autoload... Je l'active par défaut sur toutes mes pages utilisant le ZF, et tout va bien quand je n'utilise que des classes du ZF...
    Problème : sur certaines pages, j'ai besoin à la fois de classes du ZF et de classes tierces (FPDF par exemple). (*) Donc je mets un require_once("/path/to/fpdf.php"); en début de mon script de génération de pdf... Et ça ne marche pas, j'ai un message d'erreur du Zend_Loader qui me dit qu'il ne trouve pas la classe FPDF ! J'avais eu la même chose sur une autre page avec une classe de mon cru.

    La question est donc : est-il possible de mélanger des requires classiques et l'autoload de ZF et si oui comment ?




    (*) je sais qu'il existe une classe pdf pour zf, mais c'est un projet existant que je reprends et la création de pdf était déjà faite en utilisant fpdf... De toute façon le problème survient avec d'autres classes aussi.

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Salut,

    par défaut le chargeur fourni par Zend ne fonctionne effectivement qu'avec les classes Zend ; si tu souhaites en disposer pour des classes tierces, tu vas devoir créer ton propre loader, une classe descendante de Zend_Loader, et définir ses méthodes loadClass() et autoload(). Il ne faudra pas oublier d'appeler Zend_Loader::registerAutoload('ton_chargeur') pour le référencer. Tu trouveras des exemples de code dans le chapitre 22 de la doc.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    Oula ok

    Mais il n'y a pas moyen de faire des require manuels pour les autres classes que le ZF alors ? Si on a activé l'autoload, on est obligé de continuer avec le Zend_Loader et bannir tous les require de classes ?

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Si, tu peux utiliser require_once() pour tes propres classes, sans problème.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Au début de mon projet, j'ai mélangé les require_once avec le Zend_Loader de ZF.
    Par la suite il m'a parru bien plus aisé de changer l'architecture de mes dossiers pour que l'autoload se charge de mes classes perso.
    Voici ce que j'ai fait :

    La strucuture de mes dossiers

    /application
    /default
    /controllers
    /views
    /helpers
    /scripts
    /My
    /Db
    /Table
    /Form
    /Plugin
    /library
    /Zend
    /web

    Le code dans le bootstrap.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    define('APPLICATION', '../application');
     
    ini_set('include_path',
    	'../library'
    	.PATH_SEPARATOR.APPLICATION
    	.PATH_SEPARATOR.get_include_path()
    );
    Quelques explications supplémentaires

    Toutes mes classes dérivées ou non des classes Zend se trouvent dans le repertoire 'My'.
    Par exemple, j'ai créé une classe facade pour appel à la base de donnée. De plus elle gère les éffacements de la cache en de création ou d'update de record.
    Cette classe se trouve dans le répertoire /application/My/Db/Facade.php.
    Pour que le loader puisse la retrouver et la charger je dois obligatoirement l'appeler 'My_Db_Facade'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class My_Db_Facade {
    ...
    }
    Il faut bien comprendre comment le loader de ZF fonctionne.
    A l'instanciation d'une nouvelle classe, il découpe le nom de celle-ci en fonction des '_' et les remplace pas des séparateur de dossier et ajoute l'extension '.php' à la fin.
    Ce qui pour new My_Db_Facade() : My/Db/Facade.php.
    Puis il parcourt les dossiers se trouvant dans l'include_path de php.ini et essait pour chacun d'eux de trouver ce chemin.
    Il faut donc bien faire attention au Majuscule et au _ dans le nom de sa classe et dans les noms de dossiers et de fichiers (évitez les _ dans leurs noms).

    Voilà, j'espère que ça a pu t'aider.

    A+,
    Olivier

  6. #6
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    OK moi en fait j'avais un message d'erreur du loader ZF quand je faisais des require, mais bon sur le seul fichier où j'avais ce problème, je l'ai résolu autrement (c'était un cas un peu particulier en fait).

    Faudra que je retente sur un fichier standard pour voir si ça le refait ou pas

    Merci pour vos réponses en tout cas

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez à consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les règles.

    Je n'ai rien à voir avec la société www.ovh.com !

  7. #7
    Modérateur

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

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    @oliviercuyp , tu n'es pas obliger de créer un nouveau répertoire , le répertoire /library est là pour ça.

    Effectivement Zf suit une certaine nomenclature pour la gestion de ses classes, ils suffit donc de suivre cette convention pour éviter les require.

    @ovh : donc si tu met ta classe FPDF.php à la racine du répertoire /library, tu pourras l'appeler de partout dans ton projet (si le class path est configuré correctement).

    Exemple dans le bootstrap.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    set_include_path
    (
    '.' 								. PATH_SEPARATOR . 
    './library' 						. PATH_SEPARATOR .
    './application/default/models/' 	. PATH_SEPARATOR . 
    get_include_path()
    );
    Par exemple mes fichier pdf, gérer par FPDF, je le fais ainsi.

    ma classe fpdf est dans /libary
    Je crée un répertoire /libray/My/Pdf
    Je crée un fichier /library/My/Pdf/Toto.php dans lequel je fais mon pdf

    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
     
    <?php
    /**
     * Classe de generation du PDF Toto
     * @copyright  2008 Developpez.com Technologies
     * @author     g-ernaelsten.developpez.com  Ernaelsten Gerard
     * @category   Exemple Developpez.com
     * @package    My_Pdf
     * @subpackage Toto
     */
    class My_Pdf_Toto
    {
    	/**
    	* Genere le pdf
    	* @method pdf
    	* @param array $rows
    	* @return pdf
    	*/
    	public static function pdf()
    	{
     
    		$pdf = new FPDF('L', 'mm', 'A4');
     
    			$pdf->AddPage();
    			$pdf->SetFont('Arial', '', 18);
     
    			$pdf->SetXY(240, 5);
                $pdf->Cell('', '', utf8_decode('Date de création:') . date());
     
    		ob_end_clean();
    		$pdf->Output();
    	}
    }
    ?>
    ensuite dans un controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    	public function affichePdfAction ()
    	{
    		$this->_helper->resetHelpers();//annule la vue
            	My_Pdf_Toto::pdf($xml);//génère le pdf
    	}

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 93
    Points
    93
    Par défaut
    @MaitrePylos :

    MaitrePylos, dans la conception de mon site, j'utilise 2 repertoires pour stocker mes classes personnelles:

    Pour toutes les classes réutilisables génériques, je les stock dans /library/Custom (histoire de se distinguer du repertoire Zend).
    Exemple, j'ai créer de nouveaux filtres qui se trouvent dans /library/Custom/Filter/monFiltre.php

    Pour toutes les classes orientées, spécifiques au projet et donc non-réutilisables. Je les stockent dans /application/My.
    Exemple ma facade qui contient des methodes relatives à ma base de données, je la stock dans /application/My/Db/facade.php

    Histoire que pour mon prochain projet, je puisse prendre tout le repertoire /library sans me posé de question.

    Note: Il est important d'avoir des noms de dossier différents pour des questions de performance de l'autoload (My/Custom). Si les 2 dossiers s'appelait 'My', l'autoload pourrait perdre son temps à chercher ma facade dans /library/My...

    A+

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/03/2014, 08h42
  2. Error : a column definition list is required ....
    Par chico_du_33 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 13/01/2006, 17h35
  3. Erreur : '800a01a8' Object Required
    Par kiks dans le forum ASP
    Réponses: 4
    Dernier message: 01/12/2004, 13h58
  4. [Forms6i], required item
    Par orcl dans le forum Forms
    Réponses: 4
    Dernier message: 25/05/2004, 17h31
  5. Bug sur la prorpiété required d'un TField avec ADO ???
    Par denrette dans le forum Bases de données
    Réponses: 6
    Dernier message: 04/11/2003, 11h04

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