autoload avec Zend Framework

autoload avec Zend Framework - PHP - Programmation

Marsh Posté le 06-01-2010 à 16:17:36    

Bonjour, et bonne année à tous.
 
Parmi mes bonnes résolutions pour 2101, essayer d'apprendre à programmer de façon un peu plus pro.
J'utilise PHP, et me suis tourné vers Zend Framework, histoire de me pousser un peu du côté des langages à objets.
Pour cela, je viens d'acheter "Zend Framework, bien programmer en PHP".
 
Ce qui signifie :
1 - que je ne connais pas encore Zend Framework.
2 - que j'aimerais apprendre à l'utiliser grâce à ce bouquin.
3 - que je m'attends à trouver dans ce bouquin l'essentiel des informations utiles pour progresser. (Et non tout savoir d'avance).
 
Dès la page 32, problème ! Les exemples sont écrits pour une version obsolète de Zend Framework (1.6.2), alors que la version courante est la 1.9.6.
Or, depuis la version 1.8.x, il y a eu de gros changements avec l'autoload.
 
Pour remplacer le code déprécié suivant :

Code :
  1. include 'Zend/Loader.php';
  2. Zend_Loader::loadClass('Zend_View');
  3. Zend_Loader::registerAutoload();


on peut (entre autres) mettre ceci :

Code :
  1. require_once 'Zend/Loader/Autoloader.php';
  2. Zend_Loader_Autoloader::autoload('Zend_Loader_Autoloader_Resource');


J'ai trouvé deux ou trois variantes sur Internet, mais bon, celle-ci a l'air de marcher.
 
Dans l'exemple de la page 32, j'ai un soucis. On décide d'utiliser un loader personnel, qui se trouve sous un répertoire "My", au lieu du loader standard de la librairie Zend. Voici le code :

Code :
  1. // Inclusion de Zend_Loader
  2. include 'Zend/Loader.php';
  3. // Chargement avec vérification
  4. if (!Zend_Loader::isReadable('Zend/View.php')) {
  5.     throw new Exception('Unable to use Zend_View.');
  6. }
  7. Zend_Loader::loadClass('Zend_View');
  8. var_dump(new Zend_View());
  9. // Utilisation de la fonction pour l'autochargement
  10. Zend_Loader::registerAutoload('My_Loader');
  11. // Utilisation de Zend_Date avec auto-chargement implicite
  12. var_dump(new Zend_Date());


On part du principe que le répertoire "My" se trouve dans le même répertoire que l'exemple php à corriger (c'est là que l'auteur du bouquin l'a mis, en oubliant juste de le préciser). Sous My, il y a la classe personnalisée Loader.php, celle que l'on veut utilser dans l'instruction Zend_Loader::registerAutoload('My_Loader');
 
Le problème, donc, c'est que je ne suis pas du tout certain d'avoir su écrire l'équivalent pour Zend Framework >= 1.8.
J'ai essayé ceci :

Code :
  1. // Inclusion de Zend_Loader
  2. require_once 'Zend/Loader/Autoloader.php';
  3. $autoloader = Zend_Loader_Autoloader::getInstance();
  4. $autoloader->registerNamespace('My_');
  5. // Chargement avec vérification
  6. if (!Zend_Loader::isReadable('Zend/View.php')) {
  7.     throw new Exception('Unable to use Zend_View.');
  8. }
  9. Zend_Loader::loadClass('Zend_View');
  10. var_dump(new Zend_View());
  11. // Utilisation de la fonction pour l'autochargement
  12. Zend_Loader_Autoloader::autoload('My_Loader');
  13. // Utilisation de Zend_Date avec auto-chargement implicite
  14. var_dump(new Zend_Date());


Et voici le code de loader.php, situé sous My :

Code :
  1. class My_Loader
  2. {
  3.     /**
  4.      * Une fonction utilisateur pour le chargement des classes
  5.      *
  6.      * @param string $class
  7.      */
  8.     public static function autoload($class)
  9.     {
  10.         include(strtr($class, '_', '/') . '.php');
  11.     }
  12. }


J'obtiens un résultat,mais j'ignore si c'est My_Loader qui est utilisé ou le Loader standard, car si je supprime la ligne include (qui fait râler ZendFramework pour Eclipse [unsafe use of variable in call include()/require()], ça marche aussi. Je suppose que le loader standard prend le relais, mais du coup j'ignore si j'ai bien adapté le programme initial.
 
Votre avis ?
 
 
 

Reply

Marsh Posté le 06-01-2010 à 16:17:36   

Reply

Marsh Posté le 06-01-2010 à 21:42:41    

un truc du style
 

Code :
  1. Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);

Reply

Marsh Posté le 08-01-2010 à 12:28:24    

Si j'ai bien suivi ce qu'en dit Julien Pauli, le code pour remplacer

Code :
  1. <?php
  2. include 'Zend/Loader.php';
  3. Zend_Loader::registerAutoload();
  4. $date = new Zend_Date();
  5. var_dump($date);
  6. ?>


est

Code :
  1. <?php
  2. require_once 'Zend/Loader/Autoloader.php';
  3. Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);
  4. $date = new Zend_Date();
  5. var_dump($date);
  6. ?>


Mais cela ne répond pas à la question. Dans l'exemple de la page 32 de son bouquin, il décide d'utiliser une classe Loader personnelle, qui ne figure pas sous le répertoire "Zend", mais sous le répertoire "My", sans d'ailleurs indiquer où se situe ce répertoire "My".
 
Comme l'auteur travaille avec Zend Framework sous Eclipse, j'ai pensé que "My" se situerait plutôt sous le répertoire "library" de son projet PHP. En consultant le source de ses exemples (visible ici : http://www.zfbook.fr), je constate que "My" se situe en réalité sous le repertoire "examples" dans lequel il a placé son fichier "zend_loader_advanced.php", ce qui complique encore le problème.
Ce répertoire "My" n'est probablement pas déclaré dans l'include_path de php.ini, ce qui serait particulièrement lourd.
 
Donc, la question reste posée : comment traduire en version 1.8 le fichier examples\zend_loader_advanced.php

Code :
  1. <?php
  2. // Inclusion de Zend_Loader
  3. include 'Zend/Loader.php';
  4. // Chargement avec vérification
  5. if (!Zend_Loader::isReadable('Zend/View.php')) {
  6. throw new Exception('Unable to use Zend_View.');
  7. }
  8. Zend_Loader::loadClass('Zend_View');
  9. var_dump(new Zend_View());
  10. // Utilisation de la fonction pour l'autochargement
  11. Zend_Loader::registerAutoload('My_Loader');
  12. // Utilisation de Zend_Date avec auto-chargement implicite
  13. var_dump(new Zend_Date());


dans lequel le nouveau Looader se trouve sous "My", et "My" se trouvant sous le répertoire "examples" ?
 
Dans tout ce que j'ai testé, le navigateur râle parce qu'il s'obstine à vouloir utiliser le loader présent sous le répertoire "Zend", avec des avertissements du genre :
Warning: include(My\Date.php) [function.include]: failed to open stream: No such file or directory in C:\PHP\ZF-library\Zend\Loader.php on line 83
 
Warning: include() [function.include]: Failed opening 'My\Date.php' for inclusion (include_path='.;c:\PHP\ZF-library;C:\PHP\pear') in C:\PHP\ZF-library\Zend\Loader.php on line 83


Message édité par Kiosquec le 08-01-2010 à 17:02:14
Reply

Marsh Posté le 08-01-2010 à 13:29:25    

je t'invite a lire le quickstart
http://framework.zend.com/docs/quickstart

 

malheureusement y'a eu de gros changement entre la 1.6 et la 1.9
meme si on si retourve niveau MVC, la mise en place des project et differente

 

on utilise Zend Application maintenant


Message édité par stealth35 le 08-01-2010 à 13:29:43
Reply

Marsh Posté le 08-01-2010 à 14:01:45    

Merci. J'ai l'impression que le problème risque de se répéter au fur et à mesure que j'avancerai dans le bouquin. Aussi, je vais commencer par récupérer la version utilisée par l'auteur (v1.6.2). Le premier objectif, c'est de comprendre le framework. Si je ne rencontre pas trop de difficultés, je passerai ensuite à la version la plus récente. Si le bouquin est incompréhensible, je n'insiste pas et passe directement à la nouvelle version. (En fait, je regarderai probablement un peu des deux à la fois).
N'empêche que j'aurais bien aimé avoir la solution : comment le code présenté se présenterait-il en v1.9.x ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed