Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Décidément, je vous ennui toutes les deux minutes...
Après avoir lu différents tutoriels, j'ai trouvé différentes façons de concevoir ce fichier et je n'en comprends pas les subtilités. Je ne veux pas me lancer dans un copier/coller tout bête sans rien comprendre, surtout au démarrage.
Voici le fichier d'amorçage typique que j'ai trouvé :
# PARTIE 1 set_include_path('.' . PATH_SEPARATOR . '../library/Zend/' . PATH_SEPARATOR . '../application/models/' . PATH_SEPARATOR . get_include_path() ); #PARTIE 2 require_once "Zend/Loader.php"; Zend_Loader::registerAutoload(); #PARTIE 3 Zend_Loader::loadClass('Zend_Controller_Front'); // obtenir une instance du contrôleur $frontController = Zend_Controller_Front::getInstance(); // la configurer $frontController->setControllerDirectory('./application/controllers'); // en phase de développement, le client voit le retour des erreurs // (cette information devrait être placée dans un fichier de configuration) $frontController->throwExceptions(true); // démarrage $frontController->dispatch();
PARTIE 1 (le set_include_path)
Cette fonction PHP définit où chercher les composants du framework lors d'éventuelles appels aux fonctions. Il est important de placer l'inclusion de la bibliothèque Zend au début du fichier pour optimiser les ressources.
Je suppose que le PATH_SEPARATOR sépare les différents chemins de la fonction et que le get_include_path les intègre à PHP.
L'inclusion du répertoire models permet de savoir où chercher les models à charger.
PARTIE 2 (Zend_Loader)
http://framework.zend.com/manual/fr/zend.loader.html
Zend_Loader si j'ai bien compris c'est une classe qui sert à charger d'autres classes. Quelle est la différence avec un require_once, c'est juste un peu plus évolué !?
Zend_Loader::registerAutoload() - A quoi sert cette méthode ?
PARTIE 3 (Le front controller)
http://framework.zend.com/manual/fr/zen … oller.html
On charge la class Zend_Front_Controller puis on instancie le front controller. C'est lui qui reçoit toutes les demandes.
Le contrôleur frontal est chargé d'exécuter l'action. C'est bien ça?
Dernière modification par miboo (07-11-2008 11:29:30)
Hors ligne
Salut,
Zend_Loader si j'ai bien compris c'est une classe qui sert à charger d'autres classes. Quelle est la différence avec un require_once !?
Zend_Loader::registerAutoload() - A quoi sert cette méthode ?
La différence avec require_once c'est que Zend_Loader gère les conventions de nommage et de chemins mis en place par le Framework et le modèle MVC.
Par exemple, si tu as comme include_path :
set_include_path('.' . PATH_SEPARATOR . get_include_path() . PATH_SEPARATOR . '../library/' );
En rappelant au passage que si le chemin du framework est configuré dans le php.ini, il faut placer le get_include_path() en premier car le Loader va parcourir les chemins dans le même ordre que le set_include_path.
Revenons à nos moutons.
Si tu as un dossier 'library' (au même niveau que 'application' dans l'arbo, donc commun à tout le projet) et que tu le structures ainsi :
library/ MyLib/ Auth/ Adapter/ Webservice.php Filter/ Date.php Encoding.php Plugin/ Rout.php Validate/ EmailAddress.php etc...
etc... c'est un exemple.
Et que tu fais un :
Zend_Loader::loadClass('MyLib_Filter_Date');
ou encore :
Zend_Loader::loadClass('MyLib_Auth_Adapter_Webservice');
Il parcourra automatiquement les dossiers pour trouver la bonne classe. Par convention, Zend considère que le underscore '_' représente un noeud dans l'arborescence.
Tu peux redéfinir ces règles. Personnellement j'aime beaucoup les conventions mises en place par Zend et j'essaie de les respecter un maximum.
L'exemple que je te donne est similaire à ma façon de procéder.
Après comme le dit très bien la doc :
Zend_Loader contre require_once()
Les méthodes Zend_Loader sont les meilleures à utiliser si le nom de fichier que vous devez charger est variable. Par exemple, s'il est basé sur un paramètre de la saisie de l'utilisateur ou un argument de méthode. Si vous chargez un fichier ou une classe dont le nom est constant, il n'y a aucun avantage à l'utilisation de Zend_Loader sur l'utilisation de fonctions de PHP traditionnelles comme require_once().
Pour
Zend_Loader::registerAutoload();
D'un avis personnel, je ne te conseille pas de l'utiliser, tout d'abord pour des raisons de performances, et puis surtout je trouve que le code est plus difficile à comprendre et à maintenir.
C'est toujours bien de voir d'un coup d'oeil quelles sont les classes utilisées.
On charge la class Zend_Front_Controller puis on instancie le front controller. C'est lui qui reçoit toutes les demandes.
Le contrôleur frontal est chargé d'exécuter l'action. C'est bien ça?
Le frontcontroller va intercepter (grâce aussi aux règles de ré-écritures qui renvoient tout, sauf les ressources, vers le bootstrap), les requêtes du client et définir une route module/controller/action à suivre.
Ces règles sont facilement maitrisable à l'aide de plugins, avec lesquels tu peux intervenir à tous les niveaux du routage.
N'hésite pas si tu as d'autres questions.
A+ benjamin.
Dernière modification par Delprog (17-10-2008 18:15:14)
Hors ligne
Merci Delprog pour cette explication, claire, détaillée et exhaustive...
Il va falloir que je pense à parler de l'autoload et de notions de performances dans la FAQ.
Hors ligne
Merci pour ta réponse, c'est déjà plus clair maintenant
J'ai bien compris le début, mais pourrais-tu me détailler la partie 3 et les lignes ci-dessous ?
// On charge la classe Zend_Controller_Front ?
Zend_Loader::loadClass('Zend_Controller_Front');
// On charge dans la variable $frontController une instance du front controller
$frontController = Zend_Controller_Front::getInstance();
// On configure notre instance en indiquant où est ce que se trouve les controller d'actions (?)
$frontController->setControllerDirectory('./application/controllers');
// En phase de développement uniquement, on affiche les éventuelles erreurs
$frontController->throwExceptions(true);
// On démarre le processus de traitement de requête
$frontController->dispatch();
J'ai également entendu parler de Zend_Controller_Router_Rewrite, le routeur par défaut charger de récupérer une URL et de la décomposer en contrôleur, action, et paramètres.
Exemple de la documentation :
Par exemple, l'URL http://localhost/foo/bar/key/value serait décodée pour employer le contrôleur foo, l'action bar, et pour indiquer un paramètre key avec une valeur value.
Ce routeur n'apparaît pas dans mon bootstrap, est-il obligatoire, est-il nécessaire sachant que j'ai déjà un fichier .htaccess ?
Le front controller (index.php) est le script chargé de recevoir toutes les requêtes, de préparer l'application à l'aide de différents paramètres de configuration. Il utilise différents controleurs d'actions, à quoi servent-ils ?
Dernière modification par miboo (18-10-2008 23:19:16)
Hors ligne
J'ai oublié une petite chose, à quoi sert l'autoreload du Zend_Load ?
Merci
Dernière modification par miboo (19-10-2008 00:01:51)
Hors ligne
Salut miboo,
je suis trop crevé pour revenir sur toutes tes questions mais je vais au moins répondre à la dernière
Zend_Loader::registerAutoload() va faire que Zend_Loader::loadClass() sera appelée automatiquement chaque fois que tu feras un new Truc(); alors que la définition de la classe Truc n'a pas été chargée.
La différence avec require_once c'est que 1) elle est déclenchée automatiquement, donc pas besoin de faire des require_once à tout bout de champ 2) elle va convertir toute seule les noms de classes en chemins. Exemple :
Zend_Loader::registerAutoload(); $front = new Zend_Controller_Front(); // la ligne précédente va déclencher : // Zend_Loader::loadClass('Zend_Controller_Front'); // qui va exécuter, après quelques tests : // require_once('Zend/Controller/Front.php');
C'est beaucoup plus simple pour toi au final Même s'il est vrai que l'autoload va causer une lergère augmentation de la charge et donc une réduction proportionnelle des performances.
Hors ligne
Merci beaucoup pour tes explications, c'est très clair maintenant
Hors ligne
miboo a écrit:
Merci pour ta réponse, c'est déjà plus clair maintenant
J'ai bien compris le début, mais pourrais-tu me détailler la partie 3 et les lignes ci-dessous ?
// On charge la classe Zend_Controller_Front ?
Zend_Loader::loadClass('Zend_Controller_Front');
// On charge dans la variable $frontController une instance du front controller
$frontController = Zend_Controller_Front::getInstance();
// On configure notre instance en indiquant où est ce que se trouve les controller d'actions (?)
$frontController->setControllerDirectory('./application/controllers');
// En phase de développement uniquement, on affiche les éventuelles erreurs
$frontController->throwExceptions(true);
// On démarre le processus de traitement de requête
$frontController->dispatch();
J'ai également entendu parler de Zend_Controller_Router_Rewrite, le routeur par défaut charger de récupérer une URL et de la décomposer en contrôleur, action, et paramètres.
Exemple de la documentation :Par exemple, l'URL http://localhost/foo/bar/key/value serait décodée pour employer le contrôleur foo, l'action bar, et pour indiquer un paramètre key avec une valeur value.
Ce routeur n'apparaît pas dans mon bootstrap, est-il obligatoire, est-il nécessaire sachant que j'ai déjà un fichier .htaccess ?
Le front controller (index.php) est le script chargé de recevoir toutes les requêtes, de préparer l'application à l'aide de différents paramètres de configuration. Il utilise différents controleurs d'actions, à quoi servent-ils ?
UP - Si quelqu'un a un peu de courage/temps , merci
Edit 7/11 - Merci à tous pour vos réponses
Dernière modification par miboo (07-11-2008 11:30:16)
Hors ligne
miboo a écrit:
On charge la class Zend_Front_Controller puis on instancie le front controller. C'est lui qui reçoit toutes les demandes.
Le contrôleur frontal est chargé d'exécuter l'action. C'est bien ça?
Le contrôleur frontal est en quelque sorte le chef d'orchestre. Il utilise le routeur pour déterminer le contrôleur d'action et l'action à exécuter à partir de l'url et des paramètres fournis avec la requête.
Il gère également les plugins, qui permettent la gestion des vues et des erreurs.
Tu n'as pas besoin de charger le routeur, c'est le contrôleur frontal qui s'en charge.
Dernière modification par mdelanno (25-10-2008 10:57:34)
Hors ligne
Si tu utilises Zend Studio for Eclipse V6.1.0, il te génère une arborescence complète d'un projet de type Zend Framework avec tout ce qu'il faut dedans et un découpage des procédures par méthodes particulièrement propre dans le quel index.php ne contient qu'un simple appel au bootstrap.php qui lui même utilise initializer.php.
ça ne change rien à la justesse des explications précédentes.
Dernière modification par Jean-Marc Rigade (25-10-2008 14:33:44)
Hors ligne
Pages: 1