Tutoriel Premier en MVC Avec Zend Framework

  • Upload
    kzelda

  • View
    445

  • Download
    2

Embed Size (px)

DESCRIPTION

RésuméSupport de cours à destination d'étudiants en formation professionnelle (BAC +2), BTS Informatique de Gestion option Développeur d'Applications.Prérequis :Concepts de base de l'objet, première expérience dans un langage (Java)HTML et SQL dans les grandes lignesObjectifs :Découvrir par la pratique le potentiel structurant d'une architecture MVC et de la programmation objet (PHP >=5)Approche progressive : Vue et Contrôleur et Modèle avec données sont abordés en premier, puis la navigation dans le Modèle et FormulaireA la fin de cet apprentissage, l'étudiant détient des clés pour :Approfondir l'utilisation des objects techniques présentés.Exploiter la documentation officielle du framework : API et ManuelÉtendre sa recherche vers d'autres modules du framework (Zend_Auth , Zend_Acl, Zend_Layout, Zend_Pdf, Zend_Cache, ...)

Citation preview

Tutoriel premier en MVC avec Zend FrameworkOlivier Capuozzo 17 fvrier 2010 Rsum Support de cours destination d'tudiants en formation professionnelle (BAC +2), BTS Informatique de Gestion option Dveloppeur d'Applications. Prrequis : Concepts de base de l'objet, premire exprience dans un langage (Java) HTML et SQL dans les grandes lignes Objectifs : Dcouvrir par la pratique le potentiel structurant d'une architecture MVC et de la programmation objet (PHP >=5) Approche progressive : Vue et Contrleur et Modle avec donnes sont abords en premier, puis la navigation dans le Modle et Formulaire A la fin de cet apprentissage, l'tudiant dtient des cls pour : Approfondir l'utilisation des objects techniques prsents . Exploiter la documentation officielle du framework : API et Manuel tendre sa recherche vers d'autres modules du framework (Zend_Auth , Zend_Acl, Zend_Layout, Zend_Pdf, Zend_Cache, ...) Document au format docbook , mis en page avec le processeur xsltproc et les feuilles de styles de Norman Walsh. Ce document est plac sous la Licence GNU Free Documentation License, Version 1.1 ou ultrieure publie par la Free Software Foundation. Table des matires1. Prsentation des principaux concepts objet - PHP5/Java 2. Une typologie des applications 3. Architecture Bazar 4. MVC 5. Zend Framew ork 6. Installation des composants 7. Structures des rpertoires de l'application 8. Contrle de connaissances 9. Architecture MVC : Modle et contrat : Vues - Contrleur 10. Cration d'un projet 11. Le Modle 11.1. Installation de w orld 11.2. Les tables 11.3. Paramtres de conf iguration la base de donnes 11.4. Rles du modle 11.5. Utilisation de Zend_Db_Table, Zend_Db_Row 12. Mise en place d'un contrleur 12.1. Mthode d'Action 12.2. Vue d'action 12.3. Rsum 13. Contrleur et Vues 13.1. Variables passes la vue 13.2. La vue exploite les donnes 13.3. Rsum 14. Passage d'arguments via l'url 14.1. Conception de la vue 14.2. Passage d'arguments 15. Exercices 16. Oprations CRUD 16.1. Slectionner une ligne, une objet mtier 16.2. Modif ier un objet mtier, une ligne 16.3. Cration d'un objet mtier, une ligne 16.4. Suppression d'un objet mtier, une ligne 16.5. Transaction 16.6. Quelques liens utiles 17. Introduction la navigation dans le modle 17.1. Dclaration des relations dans le modle 17.2. Relation Un--Un (One To One) 17.3. Relation Un--Plusieurs (One to Many) 17.3.1. Vue de la liste des villes d'un pays 17.3.2. Mthode d'action du contrleur liant modle et vue 17.3.3. Mthode de liaison entre modle 17.4. Relation Plusieurs--Plusieurs (Many-To-Many) 17.5. Mthodes magiques 18. Formulaire et Validateurs 18.1. Qu'est-ce qu'un f iltre ? 18.2. Qu'est-ce qu'un validateur ? 18.3. Exemple de code d'exploitation du formulaire 19. Quelques modules (guide, tutoriel) explorer, dans la continuit de ce tutoriel. 19.1. Gestion des droits utilisateur rapprocher avec la notion UML d'acteur/cas d'utilisation 19.2. Gestion du suivi de sessions 19.3. Structuration de blocs de prsentation 20. Conclusion

1. Prsentation des principaux concepts objet - PHP5/Java

Figure 1. Concepts Objet avec PHP5

Un version PDF ici (une contribution de Boris Vacher) : tabPooPhpJava.pdf

2. Une typologie des applicationsD'un point de vue "physique", les architectures d'applications sont traditionnellement rparties en trois catgories : Autonome C'est le cas d'applications qui ne dpendent pas de systmes tiers, autres que ceux gnralement offerts par un systme d'exploitation. Client/Serveur Modle phare des annes 80, o le systme d'information est centr sur les donnes. La logique mtier est rpartie, plus ou moins, entre le client (qui dtient/excute les formulaires) et le serveur (SGBDR). Architecture 3 tiers (et plus) Tiers veut dire parties. Alors que les applications C/S sont de types 2 parties (le client IHM et le SGBDR), les architectures n tiers (pour n > 2) font intervenir un middleware applicatif responsable de la logique applicative. Le terme middleware est prendre dans le sens intermdiaire de communication entre 2 niveaux. Cette vue par "parties" (tiers) correspond un changement de niveau ds qu'un module logiciel doit passer par un intermdiaire de communication (middleware) pour en invoquer un autre - ref : w w w .octo.com. Le modle n tiers le plus rpandu des annes 2000 est le modle 3 tiers Web, typiquement reprsent par :

Navigateur prsentation coordination

http

Serveur d'applications pages dynamiques composants logiciels

SGBDR middleware SGBD

C'est ce modle que nous vous proposons d'exploiter, en environnement Php.

3. Architecture BazarLe succs de PHP vient de sa faciliter combiner, dans un mme document, la fois du HTML, CSS, instructions PHP et requtes SQL. Si le dveloppeur ne met pas un peu d'ordre il en rsulte un vrai bazar fragile, difficilement extensible, peu modulable et trs difficile maintenir. Figure 2. Organisation bazar (http://w w w .manning.com/allen/)

Oui, mais comment mettre de l'ordre ? une rponse courante ce problme consiste sparer physiquement les diffrentes logiques. Typiquement on distingue : La logique de prsentation : partie de l'application en interaction avec l'utilisateur La logique de traitement : partie de l'application qui ragit aux vnements La logique de persistance : concerne la logique de stockage des donnes (via un SGBDR par exemple) il est alors facile d'identifier ces parties avec les langages mis en oeuvre dans des applications Web... sauf que l aussi, plusieurs modles sont possibles. Client lger (ou pauvre) : la partie IHM est en (X)HTML + CSS Client riche : utilise un maximum de ressources du client Web (JavaScript, Ajax...) avec un minimum de problmatique de dploiement (respect des standards du W3C). Exemples : Netvibes, GMail. Nous nous concentrerons sur le client lger. Remarque : le modle client lourd concerne le client qui excute de la logique de traitement en s'appuyant sur des composants ddis et dploys pour l'occasion (le navigateur ne suffit pas). Exemple application Swing.

4. MVCLe model MVC (Model View Controller) adapt au Web est une rponse une division des responsabilits. Figure 3. Organisation MVC (http://w w w .manning.com /allen/)

Dans ce contexte : la partie Vue est prise en charge par un script (PHP ou autre langage) gnrant du HTML (sans autre logique de traitement) la partie contrleur est reprsente par un script PHP qui dclenche des traitements lis aux services (Use Case) auquel il est attach (Un contrleur par Use Case) la partie Modle est reprsente par des scripts PHP grant les accs au SGBDR. Cela peut tre par exemple des classes Mtier qui implmentent des fonctions CRUD vers un SGBDR. Remarquez que les framework applicatifs (CMS, Forum, ...) sont gnralement bass sur une architecture MVC. D'autres exemples ici : http://f r.w ikipedia.org/w iki/Liste_de_framew orks_PHP

5. Zend FrameworkPourquoi utiliser un framework ? En informatique, un framework peut tre vu comme un outil de travail adaptable. C'est un ensemble de bibliothques, d'outils et de conventions permettant le dveloppement rapide d'applications. Un framework est compos de briques logicielles organises pour tre utilises en interaction les unes avec les autres. L'utilisation d'un framework permet le partage d'un savoir-faire technologique et impose suffisamment de rigueur pour pouvoir produire une application aboutie et facile maintenir ( voir Framew ork sur Wikipedia). Nous utiliserons Zend Framework. ZF est un framework Open Source de la socit Zend qui se veut modulaire et modulable. Tableau 1. Voici quelques modules du Zend Framework Core: Zend_Controller Authentication and Access: Zend_View Zend_Acl Zend_Db Zend_Auth Zend_Locale Zend_Date Internationalization:

Zend_Config Zend_Filter Zend_Valdiate Zend_Registry

Zend_SessionZend_Controller

Zend_Measure

Inter-application communication: Http: Zend_Json Zend_Http_Client Zend_XmlRpc Zend_Http_Server Zend_Soap Zend_UriZend_Controller Zend_Rest Advanced: Zend_Cache Misc! Zend_Search Zend_Measure Zend_Pdf Zend_Mail/Zend_Mime

Web Services: Zend_Feed Zend_Gdata Zend_Service_Amazon Zend_Service_Flickr Zend_Service_Yahoo

6. Installation des composantsUne solution (L|M|W)AMP est requise. La version de PHP >= 5.2.4 Le mode rewrite d'apache doit tre activ. Plus d'info ici. La dernire version du framework http://f ramew ork.zend.com/dow nload/ Ainsi que la documentation API : http://framew ork.zend.com/apidoc/core/ et Guide du programmeur : http://f ramew ork.zend.com/manual/f r/ Voir ce site ddi au framework PHP en franais : http://w w w .z-f.fr/

7. Structures des rpertoires de l'applicationL'objectif est d'isoler physiquement les diffrentes logiques (vues, contrleurs, modles, zone publique, librairies) Pour ce faire, il est ncessaire d'tablir une arborescence de rpertoires . Nous utiliserons celle-ci :

NomDuProjet |-- application | |-- configs | |-- controllers | |-- forms | |-- layouts | |-- models | `-- views |-- library | `-- Zend (racine - ou lien vers - des librairies de ZF) `-- public | |-- css `-- scripts |-- (des scripts sql par exemple)

La zone publique contiendra des ressources directement accessibles. Par exemple via l'url http://localhost/~kpu/ZFQuickstart/public/myImage.png. On veillera interdire l'accs aux autres rpertoires.

8. Contrle de connaissancesPOO 8.1. Le modle objet de Php implmente une logique par rfrence ? 8.2. En POO Php, this et self f ont-ils rf rence l'instance courante ? 8.3. Quel est le rle de la mthode toString ? 8.1. Le modle objet de Php implmente une logique par rfrence ? Oui 8.2. En POO Php, this et self font-ils rfrence l'instance courante ? FAUX. this a le mme rle qu'en Java, et self fait rfrence l' instance de la classe charge en mmoire. 8.3. Quel est le rle de la mthode toString ? Reprsenter textuellement l'tat de l'instance concerne par l'appel. ZF 8.1. L'"architecture bazar" permet un dveloppement rapide d'application 8.2. Avec ZF/MVC seules certaines ressources sont directement accessibles par l'internaute. 8.1. L'"architecture bazar" permet un dveloppement rapide d'application En apparence seulement ! cette approche du dveloppement gnre une complexit (tout est mlang) qui tend au blocage total, proportionnellement l'accroissement de la couverture fonctionnelle de l'application. 8.2. Avec ZF/MVC seules certaines ressources sont directement accessibles par l'internaute. VRAI, moyennant quelques prcautions ct configuration du serveur HTTP (.htaccess par exemple). Dans notre exemple, elles sont situes dans l'arborescence ayant public comme racine.

9. Architecture MVC : Modle et contrat : Vues - ContrleurOn entend par modle la couche ayant en charge les donnes. Cette couche de service interagit avec le systme de persistance, les contrleurs et les vues. Un contrleur est le point d'entre d'un cas d'utilisation. Les responsabilits d'un contrleur de cas d'utilisation sont : Prendre en charge la logique du service demand (les traitements) Interagir pour cela avec les donnes de l'application, reprsentes par le modle (le M de MVC)

Transmettre la vue les informations dont elle a besoin pour une rponse personnalise en direction du demandeur (client web) Les responsabilits d'une vue sont : Prsenter les informations dont elle dispose (voir contrleur). Grer la prsentation de l'absence possible de certaines informations (liste vide par exemple) Contrleurs et Vues sont donc lis par un contrat : La vue prend en charge la prsentation des informations Le contrleur, aprs traitement, est tenu de transmettre la vue les informations dont elle a la charge Comme on le verra bientt, les contrleurs sont implments sous forme d'objet (classe spcialise) et leurs actions sous forme de mthodes d'instance, dites mthode d'action. Les informations peuvent provenir d'une base de donnes, et/ou de donnes calcules, prpares par la mthode d'action. Le schma gnral est : Figure 4. Interaction type d'un systme MVC avec les donnes

On trouvera d'autres reprsentations ici. L'tape suivante vise installer ces notions, indpendamment du contexte du quickstart, l'ide tant de nous accrocher une base de donnes, avec une technique d'implmntation du modle plus rudimentaire que celle propose par l'application quickstart (qui fait rfrence au modle de conception Data Mapper de Martin Fow ler ).

10. Cration d'un projetCertains dtails de la procdure dcrite ici concerne essentiellement ceux qui ont un compte sur un serveur unix ou GNU/Linux, en non root, avec le mode userdir d'apache activ avec les paramtres par dfaut - bref ceux qui ont leur racine de publication nomme public_html dans leur home directory. Nous proposons dans ce tutoriel une approche progressive des concepts et techniques mis en oeuvre par le framework, destination des dbutants. en ligne de commande # dans le dossier bin de ZF ZendFramework-1.9.5/bin$ ./zf.sh create project zf-tuto # on deplace le projet la racine de publication mv zf-tuto/ ~/public_html # aller dans le dossier cd ~/public_html/zf-tuto # dplacer dans les fichiers de dmarrage la racine mv public/index.php . mv public/.htaccess . # modifier les chemins dans index.php // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application')); # ajouter le chemin des modeles // Ensure library/ is on include_path set_include_path(implode(PATH_SEPARATOR, array( realpath(APPLICATION_PATH . '/../library'), realpath(APPLICATION_PATH . '/models'), get_include_path(), )));

# modifier .htaccess RewriteBase /~XXX/zf-tuto # dans library/ crer un lien symbolique vers ou copier y le dossier ZendFramework-1.9.5/libray/Zend

Voila, l'installation du squelette du projet est termine. Vous remarquerez que le fichier index.php ne comporte aucune logique de l'application ; en effet son rle est principalement technique. Le terme technique est, dans ce contexte, oppos au terme mtier, ce dernier terme faisant rfrence la logique de l'application rgie par les rgles de gestion lies au problme rsoudre. Faire un test : http://localhost/~XXX/zf -tuto Paralllement la cration du projet, nous installons la base de donnes world sur un serveur MySQL.

11. Le Modle

world est une base de donnes statistiques go-politiques sur le monde datant de 2006, d'aprs Off icial Statistics of Finland. La base de donnes que nous installons est issues de MySql : w orld - lgrement modifie pour l'occasion (vous trouverez ici les grandes lignes de la modif cation) . 11.1. Installation de world Instructions rapides : tlcharger le script w orld2.zip et le dcompresser. mysql -u root < world2-schema.sql mysql -u root < world2-data.sql

11.2. Les tables Figure 5. tables

Voici une description SQL de la structure de la table Country (on aurait pu en choisir une autre)

mysql> describe Country; +----------------+--------------------------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------------------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | Code | char(3) | YES | | NULL | | | Name | char(52) | NO | | | | | Continent | enum('Asia','Europe', | | | | | | | 'North America', 'Africa','Oceania', | | | | | | | 'Antarctica','South America') | NO | | Asia | | | Region | char(26) | NO | | | | | SurfaceArea | float(10,2) | NO | | 0.00 | | | IndepYear | smallint(6) | YES | | NULL | | | Population | int(11) | NO | | 0 | | | LifeExpectancy | float(3,1) | YES | | NULL | | | GNP | float(10,2) | YES | | NULL | | | GNPOld | float(10,2) | YES | | NULL | | | LocalName | char(45) | NO | | | | | GovernmentForm | char(45) | NO | | | | | HeadOfState | char(60) | YES | | NULL | | | Capital | int(11) | YES | | NULL | | | Code2 | char(2) | NO | | | | +----------------+--------------------------------------+------+-----+---------+----------------+

Par simple commodit ici, nous utiliserons l'utilisateur 'root' alors que nous devrions crer d'un utilisateur ou plusieurs utilisateurs spcifiques pour cette base (par exemple via l'entre "User Administration" de MySQL Administrator . Combien de lignes contient cette table ? $ mysql -u root world2 mysql> select count(*) as `nombre de pays` from Country; +----------------+ | nombre de pays | +----------------+ | 239 | +----------------+ Il est temps maintenant de configurer la connexion la base de donnes. 11.3. Paramtres de configuration la base de donnes Nous ajoutons quelques lignes application/configs/application.ini (ZF utilise PDO pour l'accs aux donnes) [production] ... database.adapter = PDO_MYSQL database.params.host = localhost database.params.username = root database.params.password = database.params.dbname = world2

Puis nous exploitons ces informations au dmarrage (dans index.php)

-- dans index.php // Chargement automatique de Zend_Db_Adapter_Pdo_Mysql, et instanciation. $config = new Zend_Config_Ini('./application/configs/application.ini', 'production'); $db = Zend_Db::factory($config->database->adapter,array( 'host' => $config->database->params->host, 'username' => $config->database->params->username, 'password' => $config->database->params->password,

'dbname' ) );

=> $config->database->params->dbname,

// placons la connexion dans un registre global l'application $registry = Zend_Registry::getInstance(); $registry->set('db', $db); // en faire la connexion par defaut Zend_Db_Table::setDefaultAdapter($db);

Nous dfinissons un objet Zend_Db_Adapter (voir Manuel en ligne). On remarquera la souplesse d'utilisation de Zend_Config_Ini : les cls du fichier de configuration sont traduites en proprits public, ce qui nous permet de consulter une valeur associe une cl par : instance_Zend_Confi_Ini->cl Nous allons voir maintenant comment lier une classe cette table. 11.4. Rles du modle Dans une application de gestion typique (interface avec un SGBDR), il n'est pas rare d'avoir un modle qui colle aux tables concernes par les responsabilits de l'application. Dans ce contexte, il parait alors logique de charger le modle des responsabilits d'accs aux donnes : create, retreive, update, delete (CRUD). Il est commode alors de faire hriter les classes du modle par une classe prenant en charge les interactions typiques avec un SGBDR. ZF propose la classe Zend_Db_Table_Abstract comme parent de base des classes du modle. 11.5. Utilisation de Zend_Db_Table, Zend_Db_Row Nous avons avec la base de donnes (le SGBDR), deux types de structure grer : La table et ses lignes ZF met notre disposition deux super-classes Zend_Db_Table_Abstract et Zend_Db_Table_Row_Abstract Concevons une classe modle reprsentant une instance d'un pays : CountryRow (les raisons de ce nommage seront justifies ultrieurement) : Remarque : les classes du modle seront places dans le dossier models ZFQuickstart |-- application | |-- controllers | |-- models | | |--CountryRow.php | `-- views |-- library | `-- Zend (racine des librairies de ZF) `-- public |-- styles |-- images `-- js