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 :

ZF 1.10.8 Comment utiliser une classe à soi dans un controleur (include ? où mettre son fichier ?) [ZF 1.10]


Sujet :

Zend Framework PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut ZF 1.10.8 Comment utiliser une classe à soi dans un controleur (include ? où mettre son fichier ?)
    Bonjour,

    j'essaie de refaire le tuto présent ici : http://alain-sahli.developpez.com/tu...erer-un-projet à savoir une calculatrice.

    Voici mon fichier calculatrice.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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <?php
    **
    * Classe permettant de réaliser des calculs arithmétiques simples
    * @author Alain Sahli
    * @name Calculatrice
    * @package calc
    * @version 1.0
    *
    */
    class Calculatrice
    {
    	/**
    	* Additionne deux nombres
    	* @param double $nb1
    	* @param double $nb2
    	* @return double
    	*/
    	public function addition($nb1, $nb2){
    		return $nb1 + $nb2;
    	}
     
    	/**
    	* Soustrait deux nombres
    	* @param double $nb1
    	* @param double $nb2
    	* @return double
    	*/
    	public function soustraction($nb1, $nb2){
    		return $nb1 - $nb2;
    	}
     
    	/**
    	* Multiplie deux nombres
    	* @param double $nb1
    	* @param double $nb2
    	* @return double
    	*/
    	public function multiplication($nb1, $nb2){
    		return $nb1 * $nb2;
    	}
     
    	/**
    	* Divise deux nombres
    	* @param double $nb1
    	* @param double $nb2
    	* @return double
    	*/
    	public function division($nb1, $nb2){
    		if($nb2 != 0)
    		{
    			return $nb1 / $nb2;
    		}
    		else
    		{
    			throw new Exception('Division par zéro');
    		}
    	}
    }
    Et voici mon fichier indexcontroller.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
    <?php
     
    class IndexController extends Zend_Controller_Action
    {
     
        public function init()
        {
            /* Initialize action controller here */
        }
     
        public function indexAction()
        {
            // action body
        }
     
        /**
    	 * @see Zend_Controller_Action::preDispatch()
    	 *
    	 */
    	public function preDispatch()
       {
    		parent::preDispatch();
    		$this->calc = new Calculatrice();
    	}
    }
    Comme vous pouvez le lire, dans indexcontroller, j'instancie une calculatrice. La ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->calc = new Calculatrice();
    ne passe pas, ma page internet est blanche. Si j'enlève cette instruction, ma page internet s'affiche.

    Je pense que le problème se situe au niveau de l'include. indexController ne connait pas calculatrice car pas inclu. Mais pourtant il me semble que je ne dois pas faire d'include ? qu'il suffit juste de mettre une fonction _initAutoload() dans le bootstrap comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
    {
       protected function _initAutoload()
    	{
    		$moduleLoader = new Zend_Application_Module_Autoloader(array(
    			'namespace' => '',
    			'basePath' => APPLICATION_PATH));
    		return $moduleLoader;
    	}
     
    }
    Et c'est ce que j'ai fait.

    Du coup je tourne en rond sur un truc de base, Utiliser une classe à nous dans un controleur.

    Merci à qui saura (ou tentera de) m'éclairer.

  2. #2
    Membre habitué
    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
    Points : 171
    Points
    171
    Par défaut
    Slt,

    Il ne faut pas confondre autoload des modèles d'un module, avec l'autoload des classes de ta librarie perso. Pour les modules c'est comme tu as fais, pour ta propre librarie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->registerNamespace('Feng_');
    Moi j'ai mis Feng_ en préfixe mais à toi de mettre ce que tu veux, comme "My_" . Ta librarie doit se trouver dans le même répertoire que Zend, en général : /library .

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut
    Bonjour et merci pour ton aide.

    Moi, Zend, je l'ai mis dans C:\php5\pear sinon, ZendTool ne fonctionne pas.
    Et le phpinfo() me renvoi C:\php5\pear comme include path même si dans le php.ini je rends la ligne include_path active.

    Mon appli s'apelle testzf et voici les dossiers de 1er niveau générés par ZendTool (avec la commande zf create project depuis le chemin courant C:\wamp_2_0\www) :

    appplication
    docs
    library
    public
    tests
    Mon fichier calculatrice.php doit en théorie être dans le dossier library ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut
    Si je met ma classe calculatrice, dans le fichier indexcontroller.php, ma page s'affiche correctement.

    Donc le problème est bien la non trouvaille du fichier calculatrice.php. Et non pas une erreur dans le code source de ce fichier comme certains l'auraient peut-être soupçonné.

  5. #5
    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
    Je pense que tu as mal compris le post de Feng-Huang

    Ta classe perso tu dois la mettre dans le répertoire /library, mais comme tout est histoire de convention, je vais te donner le principe.

    Dans le répertoire /library tu crées un sous répertoire, nous le nommerons "My".
    Ceci fait, il faut déclarer à ZF d'aller voir dans ce sous répertoire si il n'existe pas des classes, ceci ce fait par exemple dans ton fichier application.ini :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ; Espaces d'autoload à charger
    autoloadernamespaces[] = "My_"
    ceci étant fait, enregistre ta classe, dans le sous répertoire "My", en appelant ton fichier "Calculatrice.php".

    Ensuite renomme ta classe comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class My_Calculatrice
    {
    Ainsi nous suivons les convention de nommage de ZF

    donc dans ton controller, tu instancies ton objet comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function preDispatch()
    {
    parent::preDispatch();
    $this->calc = new My_Calculatrice();
    }
    et maintenant cela fonctionne

  6. #6
    Membre régulier Avatar de ToxiK
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 73
    Points
    73
    Par défaut
    Merci pour l'explication

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut
    Merci maitre pylos pour ton intervention mais ça ne fonctionne pas plus en suivant tes indications.

    J'ai modifié le fichier application.ini que j'ai trouvé à cet emplacement là
    C:\wamp_v2.0\www\test2\application\configs
    . J'ai ajouté la ligne que tu m'as invité à mettre, je l'ai mise dans chaque section pour être sûr et vu que je ne sais pas en quel "mode" je suis :

    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
    [production]
    phpSettings.display_startup_errors = 0
    phpSettings.display_errors = 0
    phpSettings.date.timezone = "Europe/Paris"
    includePaths.library = APPLICATION_PATH "/../library"
    bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
    bootstrap.class = "Bootstrap"
    appnamespace = "Application"
    resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
    resources.frontController.params.displayExceptions = 0
    ; Espaces d'autoload à charger
    autoloadernamespaces[] = "Perso_"
    
    [staging : production]
    
    [testing : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
    ; Espaces d'autoload à charger
    autoloadernamespaces[] = "Perso_"
    
    [development : production]
    phpSettings.display_startup_errors = 1
    phpSettings.display_errors = 1
    resources.frontController.params.displayExceptions = 1
    ; Espaces d'autoload à charger
    autoloadernamespaces[] = "Perso_"
    Mais faire ceci n'équivaut-il pas pas faire cela en dynamique dans son bootstrap.php ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $moduleLoader->addResourceType('perso', 'perso/', 'Perso');
    qui se trouve ici chez moi (C:\wamp_v2.0\www\test2\application\bootstrap.php)


    Et voici ma fonction predispatch :

    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
    public function preDispatch()
        {
    		parent::preDispatch();
     
          echo "ici";
          $this->calc = new Perso_CalculateurImc();
          //$this->calc = new Application_Model_CalculateurImc();
          echo "ici2";
          //$this->calc = new Application_Model_Calcmodel();
     
    		/*
          echo "ici";
          try
          {
             //$this->calc = new CalculateurImc();
          }
          catch()
          {
             echo "erreur";
          }
          */
    	  }
    Comme tu peux le voir, j'ai entouré l'instanciation de ma classe par deux echo.
    Et je n'ai que le "ici" qui s'affiche à l'écran, le "ici2" ne s'affiche pas. J'en conclu donc que ça plante sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->calc = new Perso_CalculateurImc();
    J'ai essayé de mettre ma classe calculateurimc.php ici
    C:\wamp_v2.0\www\test2\library
    puis là
    C:\wamp_v2.0\www\test2\application\perso
    .

    Je ne pense pas que le système d'autoload tient compte de la casse ?

  8. #8
    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
    Ta classe devrais se trouver ici et porter se nom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C:\wamp_v2.0\www\test2\library\Perso\calculateurImc.php
    Donc ne pas oublier le camelCase de ta classe

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 71
    Points : 58
    Points
    58
    Par défaut
    Merci MaitrePylos, ça fonctionne. Il y avait plusieurs problèmes

    _ l'absence de la ligne
    autoloadernamespaces[] = "Perso_"
    dans le application.ini. En effet, si je la retire, ça ne "re-fonctionne" plus.

    _ mais il y avait aussi un autre problème dû à un malheureux copié-collé du tuto duquel je m'inspire.

    Cherchez l'erreur dans le code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    **
    * Classe permettant de réaliser des calculs arithmétiques simples
    * @author Alain Sahli
    * @name Calculatrice
    * @package calc
    * @version 1.0
    *
    */
    Au tout début, il manque la 1ère barre oblique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    /**
    * Classe permettant de réaliser des calculs arithmétiques simples
    * @author Alain Sahli
    * @name Calculatrice
    * @package calc
    * @version 1.0
    *
    */
    et j'ai tourné en rond longtemps pour m'en apercevoir.

    Merci bien en tout cas.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/12/2012, 03h26
  2. Comment utiliser une classe Java dans une appli PB ?
    Par bobychezA56 dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 09/04/2008, 18h07
  3. Comment utiliser une classe ?
    Par toinou62 dans le forum ASP
    Réponses: 1
    Dernier message: 09/10/2007, 21h39
  4. Réponses: 2
    Dernier message: 05/08/2006, 13h29
  5. Réponses: 2
    Dernier message: 02/05/2006, 14h34

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