Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Formation PHP avancé - Cake PHP

41,870 views

Published on

Une formation avancée à PHP, aux frameworks, à CakePHP

Published in: Technology

Formation PHP avancé - Cake PHP

  1. 1. Formation PHP avancé <ul><ul><li>Pierre de La Morinerie </li></ul></ul>Junior Isep 2007
  2. 2. Programme de la formation
  3. 3. Programme de la formation <ul><li>PHP Avancé : </li></ul><ul><ul><li>Programmation Orientée Objet </li></ul></ul><ul><ul><li>Couches d'accès aux données </li></ul></ul><ul><li>Frameworks : </li></ul><ul><ul><li>Introduction aux frameworks </li></ul></ul><ul><ul><li>Présentation du modèle MVC </li></ul></ul><ul><li>CakePHP : </li></ul><ul><ul><li>Découverte et utilisation du framework CakePHP </li></ul></ul><ul><ul><li>Utilisation du scaffolding et des tests unitaires </li></ul></ul><ul><li>Pour aller plus loin : </li></ul><ul><ul><li>Introduction à l'eXtreme Programming et aux tests unitaires </li></ul></ul>
  4. 4. Programme de la formation <ul><li>Objectifs de la formation : </li></ul><ul><ul><li>Ne plus réécrire sans cesse le même code </li></ul></ul><ul><ul><li>Se concentrer sur les tâches essentielles </li></ul></ul><ul><ul><li>Pouvoir gérer de gros projets en PHP </li></ul></ul><ul><li>En résumé : </li></ul><ul><ul><li>Programmer mieux et plus rapidement ! </li></ul></ul>
  5. 5. Programme de la formation <ul><li>Un mot sur le déroulement </li></ul><ul><ul><li>Rythme </li></ul></ul><ul><ul><li>Séances </li></ul></ul>
  6. 6. Introduction à la POO
  7. 7. Introduction à la POO - Généralités <ul><li>Objectifs de la Programation Orienté Objet (POO) : </li></ul><ul><ul><li>Modéliser les programmes comme des interactions d'objets </li></ul></ul><ul><li>Concrètement : </li></ul><ul><ul><li>En procédural, on manipule des fonctions </li></ul></ul><ul><ul><li>En POO, on manipule des objets </li></ul></ul>
  8. 8. Introduction à la POO - Généralités <ul><li>Avantages de la POO : </li></ul><ul><ul><li>Code plus sûr </li></ul></ul><ul><ul><li>Programmes sont plus clairs </li></ul></ul><ul><ul><li>Maintenance des applications facilitée </li></ul></ul><ul><ul><li>Le code est facilement réutilisable </li></ul></ul><ul><ul><li>La POO rend possible le développement de gros programme </li></ul></ul><ul><li>Inconvénients de la POO : </li></ul><ul><ul><li>Oblige à réfléchir et à modéliser avant de programmer </li></ul></ul><ul><ul><li>La notation POO n’est pas toujours intuitive </li></ul></ul>
  9. 9. Introduction à la POO – Classes et objets <ul><li>Qu'est-ce qu'un objet ? </li></ul><ul><ul><li>Un objet est une structure de données </li></ul></ul><ul><ul><li>Mais il inclus aussi les fonctions pour traiter ces données </li></ul></ul><ul><li>Un objet va donc comporter : </li></ul><ul><ul><li>Des attributs, ou champs (comme dans une struct ) </li></ul></ul><ul><ul><li>Des méthodes pour manipuler ces attributs </li></ul></ul>
  10. 10. Introduction à la POO – Classes et objets <ul><li>Exemple : Un objet « animal » comportera : </li></ul><ul><ul><li>Des attributs : </li></ul></ul><ul><ul><ul><li>Nom </li></ul></ul></ul><ul><ul><ul><li>Âge </li></ul></ul></ul><ul><ul><ul><li>Taille </li></ul></ul></ul><ul><ul><ul><li>Poids </li></ul></ul></ul><ul><ul><li>Des méthodes : </li></ul></ul><ul><ul><ul><li>Nourrir() </li></ul></ul></ul><ul><ul><ul><li>Soigner() </li></ul></ul></ul>
  11. 11. Introduction à la POO – Classes et objets <ul><li>Attention au vocabulaire : </li></ul><ul><ul><li>Dire que « Animal » est un objet est un abus de langage </li></ul></ul><ul><ul><li>« Animal » n'est qu'un moule pour créer des objets </li></ul></ul><ul><ul><li>À partir du moule « Animal », je peux créer : </li></ul></ul><ul><ul><ul><li>Un objet « gorille », nommé André, de 6 ans </li></ul></ul></ul><ul><ul><ul><li>Un objet « lion », nommé Alex, de 13 ans </li></ul></ul></ul><ul><ul><ul><li>Un objet « tigre », nommé Henri, de 3 ans </li></ul></ul></ul><ul><li>Un moule d'objet est habituellement appelé une classe </li></ul><ul><li>Créer un objet à partir d'une classe s'appelle «  instancier  » </li></ul><ul><li>Ne surtout pas confondre classe (=moule) et objet (=contenu du moule) ! </li></ul>
  12. 12. Introduction à la POO – Classes et objets <ul><li>Exemple 1 : créer une classe et des objet en PHP </li></ul>
  13. 13. Introduction à la POO – Le constructeur <ul><li>Le constructeur </li></ul><ul><ul><li>Comment initialiser les valeurs par défaut d'un objet ? </li></ul></ul><ul><ul><li>Le constructeur est appelé à chaque instanciation d'un objet </li></ul></ul><ul><ul><li>C'est une fonction qui a le même nom que la classe </li></ul></ul><ul><ul><li>On peut y effectuer n'importe quelle opération </li></ul></ul><ul><li>Accès aux attributs </li></ul><ul><ul><li>La variable « $this » permet d'accéder aux attributs de l'objet </li></ul></ul>
  14. 14. Introduction à la POO – Le Constructeur <ul><li>Exemple 2 : utilisation du constructeur </li></ul>
  15. 15. Introduction à la POO – Les méthodes <ul><li>Les méthodes </li></ul><ul><ul><li>Ce sont des fonctions pour manipuler les attributs des objets </li></ul></ul><ul><ul><li>Elles peuvent aussi manipuler d'autre objets </li></ul></ul><ul><ul><li>Les méthodes utilisent « $this » pour accéder aux attributs </li></ul></ul><ul><li>Autres utilisations des méthodes </li></ul><ul><ul><li>Une méthode peut être utilisée comme une fonction classique </li></ul></ul><ul><ul><li>Elle peut prendre des paramètres et renvoyer un résultat </li></ul></ul>
  16. 16. Introduction à la POO – Les méthodes <ul><li>Exemple 3 : utilisation des méthodes </li></ul>
  17. 17. Introduction à la POO – L'héritage <ul><li>L'héritage </li></ul><ul><ul><li>Une classe peut hériter d'une autre </li></ul></ul><ul><ul><li>Elle comporte alors tous les attributs et méthodes de la classe parente </li></ul></ul><ul><li>En pratique : </li></ul><ul><ul><li>On peut définir une classe « Lion » qui hérite de « Animal » </li></ul></ul><ul><ul><li>Un objet de type « Lion » a alors un age, un nom... </li></ul></ul><ul><ul><li>On peut ensuite rajouter des particularités au Lion </li></ul></ul>
  18. 18. Introduction à la POO – L'héritage <ul><li>Exemple 4 : héritage de classes </li></ul>
  19. 19. Introduction à la POO - TD <ul><li>TD n°1 : </li></ul><ul><ul><li>Sujet : Modéliser des véhicules </li></ul></ul><ul><ul><li>Contraintes : </li></ul></ul><ul><ul><ul><li>Il y a deux types de véhicules : auto et bateau </li></ul></ul></ul><ul><ul><ul><li>Tous les véhicules ont une vitesse maximale </li></ul></ul></ul><ul><ul><ul><li>Les autos comportent : </li></ul></ul></ul><ul><ul><ul><ul><li>une distance parcourue </li></ul></ul></ul></ul><ul><ul><ul><ul><li>une fonction « voyager(km) » qui incrémente la distance parcourue </li></ul></ul></ul></ul><ul><ul><ul><li>Les bateaux comportent : </li></ul></ul></ul><ul><ul><ul><ul><li>une longueur (par défaut, la longueur est de 10) </li></ul></ul></ul></ul><ul><ul><li>Exercices : </li></ul></ul><ul><ul><ul><li>1 : modéliser une Auto et un Bateau </li></ul></ul></ul><ul><ul><ul><li>2 : modéliser un Véhicule et deux classes héritées </li></ul></ul></ul>
  20. 20. Introduction à la POO - TP <ul><li>TP n°1 : </li></ul><ul><ul><li>Sujet : Réaliser une classe MySQL </li></ul></ul><ul><ul><li>Contraintes : </li></ul></ul><ul><ul><ul><li>Attribut s host , login , password , db_base , is_connected </li></ul></ul></ul><ul><ul><ul><li>Un constructeur MySQL($host, $login, $password, $db_base) qui stocke les paramètres dans les attributs de la classe </li></ul></ul></ul><ul><ul><ul><li>Une méthode connect() qui connecte à la BDD et met is_connected à true </li></ul></ul></ul><ul><ul><ul><li>Une méthode query($sql) qui lance une requête MySQL et renvoie le résultat (seulement si is_connected est à true ) </li></ul></ul></ul><ul><ul><ul><li>Une méthode disconnect() qui déconnecte de la BDD et met is_connected à false </li></ul></ul></ul>
  21. 21. Introduction à la POO - TP <ul><li>TP n°1 : </li></ul><ul><ul><li>Intérêt : </li></ul></ul><ul><ul><ul><li>Utiliser facilement plusieurs connexions en simultané : un objet MySQL <=> une connexion </li></ul></ul></ul><ul><ul><ul><li>Renvoyer directement des tableaux au lieu de recordsets </li></ul></ul></ul><ul><ul><ul><li>Rajouter des fonctions de log, de traitement des erreurs, de préprocessing, de traitement des données... </li></ul></ul></ul><ul><ul><ul><li>Traiter plusieurs SGDB : Oracle, PostgreSQL, etc </li></ul></ul></ul>
  22. 22. Les frameworks Le modèle MVC
  23. 23. Les frameworks <ul><li>Définition </li></ul><ul><li>Avantages </li></ul><ul><li>Qualités nécessaires </li></ul><ul><li>Les frameworks Web existants </li></ul><ul><li>Fonctionnalités </li></ul>
  24. 24. Les frameworks - Définition <ul><li>Un framework est un ensemble de bibliothèques permettant le développement rapide d'applications </li></ul><ul><li>Il existe des frameworks logiciels et des frameworks Web </li></ul><ul><li>Comporte : </li></ul><ul><ul><li>Une architecture : </li></ul></ul><ul><ul><ul><li>Définit l'organisation des fichiers dans l'application </li></ul></ul></ul><ul><ul><li>Des bibliothèques </li></ul></ul><ul><ul><ul><li>Fournit des composants utiles : RSS, authentification, Ajax, etc </li></ul></ul></ul>
  25. 25. Les frameworks - Avantages <ul><li>Avantages d'un framework : </li></ul><ul><ul><li>Cohérence </li></ul></ul><ul><ul><li>Liberté </li></ul></ul><ul><ul><li>Qualité </li></ul></ul><ul><ul><li>Rapidité </li></ul></ul>
  26. 26. Les frameworks – Qualités nécessaires <ul><li>Un framework doit être : </li></ul><ul><ul><li>Pas trop rigide </li></ul></ul><ul><ul><li>Pas trop flexible </li></ul></ul><ul><ul><li>Permettre l'intégration de composants tierce-partie </li></ul></ul>
  27. 27. Les frameworks – L'existant <ul><li>PHP : </li></ul><ul><ul><li>Symphony </li></ul></ul><ul><ul><li>Zend Framework </li></ul></ul><ul><ul><li>Prado </li></ul></ul><ul><ul><li>CakePHP </li></ul></ul><ul><ul><li>PHP on Trax </li></ul></ul><ul><li>Ruby : </li></ul><ul><ul><li>Ruby on Rails </li></ul></ul><ul><li>Python : </li></ul><ul><ul><li>Django </li></ul></ul><ul><ul><li>Turbogears </li></ul></ul><ul><li>Java : </li></ul><ul><ul><li>J2EE </li></ul></ul>
  28. 28. Les frameworks – L'existant <ul><li>Un framework se choisit en fonction de : </li></ul><ul><ul><li>L'expérience des développeurs </li></ul></ul><ul><ul><li>Les besoins du client (publication, développement...) </li></ul></ul><ul><ul><li>Le support interne (activité de la communauté) </li></ul></ul><ul><ul><li>L'hébergement </li></ul></ul><ul><li>Idéalement, le framework doit être adapté à chaque projet </li></ul><ul><li>En pratique, il est bon de choisir un framework suffisamment flexible et se s'y tenir </li></ul>
  29. 29. Les frameworks – Fonctionnalités <ul><li>Que peut-on trouver dans un framework web ? </li></ul><ul><ul><li>Architecture MVC </li></ul></ul><ul><ul><li>SGDB multiples </li></ul></ul><ul><ul><li>ActiveRecord </li></ul></ul><ul><ul><li>Templates </li></ul></ul><ul><ul><li>Validation </li></ul></ul><ul><ul><li>Cache </li></ul></ul><ul><ul><li>Javascript/Ajax </li></ul></ul><ul><ul><li>Url rewriting </li></ul></ul><ul><ul><li>Modules </li></ul></ul><ul><ul><li>Authentification </li></ul></ul>
  30. 30. Le modèle MVC <ul><li>MVC <=> Modèle – Vue - Contrôleur </li></ul><ul><li>Architecture 3-tiers </li></ul><ul><li>Permet de séparer les données, la logique et la présentation </li></ul>
  31. 31. Le modèle MVC <ul><li>Modèle : </li></ul><ul><ul><li>Représente le comportement de l'application : traitements des données, interactions avec la base de données, etc. </li></ul></ul><ul><li>Vue : </li></ul><ul><ul><li>Correspond à l'interface avec laquelle l'utilisateur interagit. </li></ul></ul><ul><ul><li>Souvent en HTML ou XML </li></ul></ul><ul><ul><li>La vue n'effectue aucun traitement, elle se contente d'afficher l'interfacer et les données fournies par le modèle </li></ul></ul><ul><li>Contrôleur : </li></ul><ul><ul><li>Répond aux événements émis par l'utilisateur </li></ul></ul><ul><ul><li>Contient toute la partie logique du code </li></ul></ul>
  32. 32. Le modèle MVC <ul><li>Avantages : </li></ul><ul><ul><li>Architecture extrêmement claire </li></ul></ul><ul><ul><li>Paradigme utilisé dans de nombreux projets logiciels ou Web </li></ul></ul><ul><ul><li>Permet de séparer la présentation de l'accès aux données </li></ul></ul>
  33. 33. Le modèle MVC - Exemple <ul><li>Exemple : un Livre d'or </li></ul><ul><ul><li>Modèle : classe Message </li></ul></ul><ul><ul><ul><li>Requêtes SQL </li></ul></ul></ul><ul><ul><ul><li>Méthode de récupération des données : tousLesMessages(), messagesRécents(), etc </li></ul></ul></ul><ul><ul><li>Contrôleur : classe ControleurMessages </li></ul></ul><ul><ul><ul><li>Analyse de GET et POST pour déterminer les données demandées </li></ul></ul></ul><ul><ul><ul><li>Récupération des messages appropriés </li></ul></ul></ul><ul><ul><ul><li>Pagination </li></ul></ul></ul><ul><ul><ul><li>Appel de la Vue correspondante </li></ul></ul></ul><ul><ul><li>Vue : template VueMessages </li></ul></ul><ul><ul><ul><li>Fichier PHP comprenant de l'HTML et quelques variables </li></ul></ul></ul><ul><ul><ul><li>Boucle sur les données du contrôleur pour afficher la liste des messages </li></ul></ul></ul>
  34. 34. Le modèle MVC - Exemple <ul><li>Exemple : un Livre d'or </li></ul><ul><li>Exemple : un Livre d'or </li></ul><ul><ul><li>Modèle : classe Message </li></ul></ul><ul><ul><ul><ul><li>Requêtes SQL </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Méthode de récupération des données : tousLesMessages(), messagesRécents(), etc </li></ul></ul></ul></ul><ul><ul><li>Vue : template VueMessages </li></ul></ul><ul><ul><ul><ul><li>Fichier PHP comprenant de l'HTML et quelques variables </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Boucle sur les données du contrôleur pour afficher la liste des messages </li></ul></ul></ul></ul><ul><ul><li>Contrôleur : classe ControleurMessages </li></ul></ul><ul><ul><ul><ul><li>Analyse de GET et POST pour déterminer les données demandées </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Récupération des messages appropriés </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Pagination </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Appel de la Vue correspondante </li></ul></ul></ul></ul>
  35. 35. Introduction à CakePHP
  36. 36. Introduction à CakePHP <ul><li>Origines </li></ul><ul><li>Fonctionnalités </li></ul><ul><li>Pourquoi Cake ? </li></ul><ul><li>Documentation </li></ul>
  37. 37. Introduction à CakePHP – Origines <ul><li>Initié par Michal Tatarynowicz en 2005 </li></ul><ul><li>Sous licence MIT (Libre, open-source, non contaminante) </li></ul><ul><li>Inspiré de Ruby on Rails : </li></ul><ul><ul><li>« Des conventions plutôt que de la configuration » </li></ul></ul><ul><ul><li>Modèle MVC </li></ul></ul><ul><ul><li>Scaffolding </li></ul></ul>
  38. 38. Introduction à CakePHP – Fonctionnalités <ul><li>Fonctionnalités principales : </li></ul><ul><ul><li>Compatible PHP4 et PHP5 </li></ul></ul><ul><ul><li>Génération de CRUD et de requêtes usuelles </li></ul></ul><ul><ul><li>Url rewriting </li></ul></ul><ul><ul><li>Templates rapides (pur PHP) et helpers </li></ul></ul><ul><ul><li>Facile à déployer </li></ul></ul><ul><ul><li>Validation des données </li></ul></ul><ul><ul><li>Scaffolding (=échafaudage) </li></ul></ul><ul><ul><li>Cache des vues et/ou des requêtes </li></ul></ul><ul><ul><li>SGBD multiples </li></ul></ul>
  39. 39. Introduction à CakePHP – Pourquoi Cake <ul><li>Ce qui fait de la bonne cuisine : </li></ul><ul><ul><li>Simple et léger </li></ul></ul><ul><ul><li>Facile à apprendre </li></ul></ul><ul><ul><li>Demeure du PHP </li></ul></ul><ul><ul><li>Facilement extensible </li></ul></ul><ul><ul><li>Bien documenté </li></ul></ul><ul><ul><li>Communauté active et sympathique </li></ul></ul><ul><li>En bref... </li></ul><ul><ul><li>Coder avec Cake est agréable </li></ul></ul>
  40. 40. Introduction à CakePHP – Documentation <ul><li>Il faut exploiter la bonne documentation de Cake ! </li></ul><ul><li>Ressources utiles : </li></ul><ul><ul><li>www.cakephp.com – site officiel </li></ul></ul><ul><ul><li>manual.cakephp.com - le manuel complet de Cake </li></ul></ul><ul><ul><li>bakery.cakephp.org – articles, tutoriaux et exemples </li></ul></ul><ul><ul><li>cakephp.org/files/cakesheet.pdf – mémento général </li></ul></ul>
  41. 41. CakePHP – Premier tutoriel
  42. 42. Premier tutoriel <ul><li>Rien de tel qu'un bon exemple </li></ul><ul><ul><li>Fameux tutoriel « A weblog in 15 minutes » de Ruby on Rails </li></ul></ul><ul><ul><li>Cake peut réaliser cela en bien moins ! </li></ul></ul>
  43. 43. Premier tutoriel – Prérequis <ul><li>Prérequis : </li></ul><ul><ul><li>Un serveur Web </li></ul></ul><ul><ul><li>Un serveur de base de données </li></ul></ul>
  44. 44. Premier tutoriel – Installation de Cake <ul><li>Installation de Cake : </li></ul><ul><ul><li>Télécharger CakePHP 1.1.* (stable) depuis cakephp.org </li></ul></ul><ul><ul><li>Décompresser l'archive dans un dossier du WebRoot (par exemple « formation_cake ») </li></ul></ul><ul><ul><li>La structure finale doit donner : </li></ul></ul><ul><ul><ul><li>/formation_cake </li></ul></ul></ul><ul><ul><ul><ul><li>/app </li></ul></ul></ul></ul><ul><ul><ul><ul><li>/cake </li></ul></ul></ul></ul><ul><ul><ul><ul><li>/docs </li></ul></ul></ul></ul><ul><ul><ul><ul><li>/vendors </li></ul></ul></ul></ul><ul><ul><ul><ul><li>.htaccess </li></ul></ul></ul></ul><ul><ul><ul><ul><li>index.php </li></ul></ul></ul></ul><ul><ul><ul><ul><li>VERSION.txt </li></ul></ul></ul></ul>
  45. 45. Premier tutoriel - Test <ul><li>Testons l'installation : </li></ul><ul><ul><li>http://localhost/formation_cake/ </li></ul></ul>
  46. 46. Premier tutoriel – Configuration <ul><li>Configuration de Cake : </li></ul><ul><ul><li>Aller dans le dossier /app/config/ </li></ul></ul><ul><ul><li>Renommer «  database.php.default  » en «  database.php  » </li></ul></ul><ul><ul><li>Ouvrir database.php et éditer les informations de connexion : </li></ul></ul><ul><ul><ul><li>var $default = array('driver' => 'mysql', 'connect' => 'mysql_connect', 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'easyphp' 'prefix' => 'cake_' ); </li></ul></ul></ul>
  47. 47. Premier tutoriel – Configuration <ul><li>Optionnel : au sujet de l'URL rewriting </li></ul><ul><ul><li>Ouvrir le fichier de configuration d'Apache (httpd.conf) </li></ul></ul><ul><ul><li>Décommenter les lignes : </li></ul></ul><ul><ul><ul><li>LoadModule rewrite_module modules/mod_rewrite.so </li></ul></ul></ul><ul><ul><ul><li>AddModule mod_rewrite.c </li></ul></ul></ul><ul><li>Si on ne veut/peut pas utiliser mod_rewrite : </li></ul><ul><ul><li>Ouvrir le fichier /app/config/core.php </li></ul></ul><ul><ul><li>Décommenter la ligne : </li></ul></ul><ul><ul><ul><li>define ('BASE_URL', env('SCRIPT_NAME')); </li></ul></ul></ul>
  48. 48. Premier tutoriel – Configuration <ul><li>Vérifions que Cake parvient à se connecter à notre BDD : </li></ul><ul><ul><li>http://localhost/formation_cake/ </li></ul></ul>
  49. 49. Premier tutoriel – Configuration <ul><li>CakePHP est configuré : nous pouvons commencer à réaliser notre blog </li></ul>
  50. 50. Premier tutoriel – BDD <ul><li>Création de la Base de Données : </li></ul><ul><ul><li>Ouvrez phpMyAdmin </li></ul></ul><ul><ul><li>Créez une table « cake_posts » : </li></ul></ul><ul><ul><ul><li>CREATE TABLE posts ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(50), body TEXT, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL ); </li></ul></ul></ul><ul><li>Insérez quelques posts dans la table </li></ul>
  51. 51. Premier tutoriel – BDD <ul><li>Cré ation du Modèle </li></ul><ul><li>Création du Contrôleur </li></ul><ul><li>Création de la Vue </li></ul>
  52. 52. Premier tutoriel – Code <ul><li>Modèle : </li></ul><ul><ul><li>Lié à une table de la BDD </li></ul></ul><ul><ul><li>Par convention, le fichier et la classe s’appellent du nom de la table, au singulier : </li></ul></ul><ul><ul><li>Fichier : post.php </li></ul></ul><ul><ul><li>Classe : Post </li></ul></ul><ul><li>La classe hérite de Model , qui définit des fonctions par défaut </li></ul><ul><li>L’attribut name n’est pas strictement obligatoire, mais permet de résoudre quelques bizarreries de PHP4. Il doit comporter le nom du modèle. </li></ul>
  53. 53. Premier tutoriel – Code <ul><li>Contrôleur : </li></ul><ul><ul><li>Par convention, le fichier et la classe s’appellent du nom de la table, au pluriel : </li></ul></ul><ul><ul><ul><li>Fichier : posts_controller.php </li></ul></ul></ul><ul><ul><ul><li>Classe : PostsController </li></ul></ul></ul><ul><ul><li>Les fonctions du contrôleur sont appelées par : </li></ul></ul><ul><ul><ul><li>/controlleur/action </li></ul></ul></ul><ul><ul><ul><li>'index()' est l'action par défaut </li></ul></ul></ul><ul><ul><ul><li>Exemple : /posts/index </li></ul></ul></ul><ul><ul><li>La méthode set() passe des données à la Vue </li></ul></ul><ul><ul><li>La méthode du modèle findAll() récupère tous les enregistrements du modèle, et renvoie un tableau </li></ul></ul>
  54. 54. Premier tutoriel – Code <ul><li>Vue : </li></ul><ul><ul><li>Un fichier HTML dans lequel on peut rajouter un peu de PHP </li></ul></ul><ul><ul><li>Nom du fichier : app/views/model_name/action_name.thtml </li></ul></ul><ul><ul><li>Exemple : </li></ul></ul><ul><ul><ul><li>app/views/posts/index.thtml </li></ul></ul></ul><ul><li>On peut maintenant tester en allant à l’Url : </li></ul><ul><ul><li>/posts/index </li></ul></ul>
  55. 55. Premier tutoriel – Code <ul><li>Vue : Helpers </li></ul><ul><ul><li>Petits composants de formatage </li></ul></ul><ul><ul><li>Utilisés dans les Vues </li></ul></ul><ul><ul><li>Permettent de formatter du HTML, des formulaires, du Javascript, des dates, du texte… </li></ul></ul><ul><ul><li>Documentés dans le Manuel </li></ul></ul><ul><li>HtmlHelper : </li></ul><ul><ul><li>Contient une méthode url() , qui prend transforme une Url absolue en Url relative : </li></ul></ul><ul><ul><ul><li>/controlleur/action => localhost/formation_cake/controlleur/action </li></ul></ul></ul>
  56. 56. Premier tutoriel – Code <ul><li>Affichage des posts </li></ul><ul><ul><li>Création d'une action 'view' dans notre Contrôleur </li></ul></ul><ul><ul><ul><li>Une action peut prendre des paramètres </li></ul></ul></ul><ul><ul><ul><li>Il seront passés dans l'Url de la page </li></ul></ul></ul><ul><ul><ul><li>Exemple : </li></ul></ul></ul><ul><ul><ul><ul><li>function view($id) => /posts/view/2 </li></ul></ul></ul></ul><ul><ul><li>Création de la vue 'view.thtml' </li></ul></ul>
  57. 57. Premier tutoriel – Code <ul><li>Ajout d'un Post </li></ul><ul><ul><li>Création d'une action 'add' dans notre Contrôleur </li></ul></ul><ul><ul><ul><li>$this->params contient les paramètres passés en $_POST </li></ul></ul></ul><ul><ul><ul><li>$this->data est un raccourci pour $this->params['data'] </li></ul></ul></ul><ul><ul><li>Model->save() sauvegarde des données </li></ul></ul><ul><ul><ul><li>Format : ['Model']['field'] = value </li></ul></ul></ul><ul><ul><li>Flash() affiche un message et une redirection </li></ul></ul>
  58. 58. Premier tutoriel – Code <ul><li>Ajout d'un Post </li></ul><ul><ul><li>Création de la vue </li></ul></ul><ul><ul><ul><li>Les Helpers 'Html' et 'Form' sont très utiles </li></ul></ul></ul><ul><ul><ul><li>Mais on peut aussi écrire le code en pur Html </li></ul></ul></ul><ul><ul><li>Helpers de champs </li></ul></ul><ul><ul><ul><li>1er argument : 'Model/field' : génère un name=''data[Model][field]'' </li></ul></ul></ul><ul><ul><ul><li>2ème argument : tableau d'options Html </li></ul></ul></ul>
  59. 59. Premier tutoriel – Code <ul><li>Ajout d'un Post - v alidation des données </li></ul><ul><ul><li>De fait au niveau du Modèle </li></ul></ul><ul><ul><li>Attribut $validate : </li></ul></ul><ul><ul><ul><li>'field' => VALID_CONSTANT </li></ul></ul></ul><ul><ul><li>Les constantes de validation sont : </li></ul></ul><ul><ul><ul><li>VALID_NOT_EMPTY </li></ul></ul></ul><ul><ul><ul><li>VALID_NUMBER </li></ul></ul></ul><ul><ul><ul><li>VALID_EMAIL </li></ul></ul></ul><ul><ul><ul><li>VALID_YEAR </li></ul></ul></ul><ul><ul><li>On peut définir la fonction Model::invalidate() pour un contrôle plus fin </li></ul></ul>
  60. 60. Premier tutoriel – Code <ul><li>Ajout d'un Post - v alidation des données </li></ul><ul><ul><li>Affichage des messages : </li></ul></ul><ul><ul><ul><li>Fonction $html->setErrorTag('Model/field', 'Message d'erreur') </li></ul></ul></ul><ul><ul><li>La validation de Cake est extensible et finement configurable à tous les niveaux (Modèle, Contrôleur, Vue) </li></ul></ul>
  61. 61. Premier tutoriel – Code <ul><li>Suppression d'un Post </li></ul><ul><ul><li>Création de l'action dans le Contrôleur : </li></ul></ul><ul><ul><ul><li>Model->delete() </li></ul></ul></ul><ul><ul><li>Inutile de créer une vue : on redirige après l'action </li></ul></ul>
  62. 62. Premier tutoriel – Code <ul><li>Edition d'un Post </li></ul><ul><ul><li>Création de l'action du Contrôleur </li></ul></ul><ul><ul><ul><li>Pré-remplir ' $this->data ' permet de préremplir les champs </li></ul></ul></ul><ul><ul><ul><li>On utilise toujours la fonction Model->save() , comme pour un ajout </li></ul></ul></ul><ul><ul><ul><li>Si un champ 'id' est définit dans les données, ' save() ' va essayer de mettre à jour ces données </li></ul></ul></ul><ul><ul><li>Création de la Vue </li></ul></ul><ul><ul><ul><li>Quasiment identique à ' add.thtml' </li></ul></ul></ul><ul><ul><ul><li>On rajoute un champ ' hidden ' nommé ' id ', pour permettre la mise à jour </li></ul></ul></ul><ul><ul><ul><li>Nota : on pourrait combiner ' add.thtml ' et ' edit.thtml ' sans difficultés </li></ul></ul></ul>
  63. 63. Premier tutoriel – Code <ul><li>Edition des routes </li></ul><ul><ul><li>Fichier app/config/routes.php </li></ul></ul><ul><ul><li>Permet d'associer n'importe quelle adresse à n'importe quelle action </li></ul></ul><ul><li>Débogage </li></ul><ul><ul><li>Controllé par la variable de configuration DEBUG (config.php) </li></ul></ul><ul><ul><li>Détermine les messages d'erreurs, les dump SQL, etc </li></ul></ul>
  64. 64. Premier tutoriel – Fin <ul><li>Un mot sur l'extensibilité </li></ul><ul><ul><li>App_controller : actions communes à tous les contrôleurs </li></ul></ul><ul><ul><li>App_model : méthodes communes à tous les modèles </li></ul></ul><ul><ul><li>Components : petits contrôleurs partagés </li></ul></ul><ul><ul><li>Elements : petits bouts de templates réutilisables (thtml) </li></ul></ul><ul><ul><li>Layouts : gabarits généraux (thtml) </li></ul></ul><ul><ul><li>Plugins : ensemble autonome de contrôleurs (ex: un forum) </li></ul></ul>
  65. 65. Premier tutoriel – Conclusion <ul><li>Fin du tutoriel </li></ul><ul><li>Pour aller plus loin : </li></ul><ul><ul><li>Lisez le Manuel en entier ! </li></ul></ul><ul><ul><li>Lisez éventuellement l'API et/ou les sources </li></ul></ul><ul><ul><li>Essayez de rajouter des Commentaires au blog </li></ul></ul>
  66. 66. Aller plus vite : Le scaffolding
  67. 67. Scaffolding - présentation <ul><li>Emploi : </li></ul><ul><ul><li>Le scaffolding produit une interface d'administration en analysant les bases de données </li></ul></ul><ul><ul><li>Les actions sont générées dynamiquement à chaque appel (pas de génération de code) </li></ul></ul><ul><li>Usage : </li></ul><ul><ul><li>Mise en place de structures temporaires </li></ul></ul><ul><ul><li>Développement rapide tant que les schémas ne sont pas fixés </li></ul></ul><ul><li>Limites : </li></ul><ul><ul><li>Ce n'est que de l' échafaudage </li></ul></ul><ul><ul><li>Pas totalement flexible </li></ul></ul><ul><ul><li>Souvent nécessaire d'écrire son propre code </li></ul></ul>
  68. 68. Scaffolding - utilisation <ul><li>Pour activer le scaffolding dans un Contrôleur : </li></ul><ul><ul><li>Mettre un attribut '$scaffold' dans le contrôleur </li></ul></ul><ul><ul><li>C'est tout ! </li></ul></ul><ul><ul><li>Note : il faut tout de même créer un Modèle avant </li></ul></ul>
  69. 69. Scaffolding - exemple <ul><li>Ajout de Commentaires à notre blog (1/3) </li></ul><ul><ul><li>Création de la table 'comments' dans la Base de donnée </li></ul></ul><ul><ul><ul><li>id (INT) </li></ul></ul></ul><ul><ul><ul><li>post_id (INT) </li></ul></ul></ul><ul><ul><ul><li>author (VARCHAR 50) </li></ul></ul></ul><ul><ul><ul><li>body (TEXT) </li></ul></ul></ul><ul><ul><ul><li>created (DATETIME) </li></ul></ul></ul>
  70. 70. Scaffolding - exemple <ul><li>Ajout de Commentaires à notre blog (2/3) </li></ul><ul><ul><li>Création du Modèle </li></ul></ul><ul><ul><li>Création d'un Contrôleur vide </li></ul></ul><ul><ul><ul><li>Attribut '$scaffold' </li></ul></ul></ul>
  71. 71. Scaffolding - exemple <ul><li>Ajout de Commentaires à notre blog (3/3) </li></ul><ul><ul><li>Test </li></ul></ul><ul><ul><ul><li>http://localhost/formation_cake/comments/index </li></ul></ul></ul>
  72. 72. Scaffolding – modification du scaffolding <ul><li>Remplacement des vues du scaffolding </li></ul><ul><ul><li>Créer une ou plusieurs des vues nommées : </li></ul></ul><ul><ul><ul><li>index.scaffold.thtml </li></ul></ul></ul><ul><ul><ul><li>show.scaffold.thtml </li></ul></ul></ul><ul><ul><ul><li>add.scaffold.thtml </li></ul></ul></ul><ul><ul><ul><li>edit.scaffold.thtml </li></ul></ul></ul><ul><ul><li>On peut remplacer les vues scaffoldées pour toute l'application ou juste pour un contrôleur particulier </li></ul></ul><ul><ul><li>Possibilité de s'inspirer des vues scaffoldées de Cake </li></ul></ul><ul><ul><ul><li>/cake/libs/view.templates/scaffolds </li></ul></ul></ul>
  73. 73. Scaffolding – modification du scaffolding <ul><li>Remplacement des actions du scaffolding </li></ul><ul><ul><li>On peut créer des actions nommées : </li></ul></ul><ul><ul><ul><li>index </li></ul></ul></ul><ul><ul><ul><li>show </li></ul></ul></ul><ul><ul><ul><li>add </li></ul></ul></ul><ul><ul><ul><li>edit </li></ul></ul></ul><ul><ul><ul><li>delete </li></ul></ul></ul><ul><ul><li>C'est souvent une mauvaise idée </li></ul></ul>
  74. 74. Les associations
  75. 75. Associations <ul><li>Cake peut scaffolder en fonction des associations de table </li></ul><ul><ul><li>Exemple : menu déroulant des posts dans les Commentaires </li></ul></ul><ul><li>Il faut définir les associations dans le Modèle </li></ul>
  76. 76. Associations <ul><li>Les associations sont définies dans les Modèles </li></ul><ul><li>Les différentes possibilités sont : </li></ul><ul><ul><li>hasOne </li></ul></ul><ul><ul><ul><li>Cardinalité 1-1 : un Utilisateur a un Profil </li></ul></ul></ul><ul><ul><li>belongsTo </li></ul></ul><ul><ul><ul><li>Cardinalité 1-1 : un Commentaire appartient à un Post </li></ul></ul></ul><ul><ul><li>hasMany </li></ul></ul><ul><ul><ul><li>Cardinalité 1-N : un Post a plusieurs Commentaires </li></ul></ul></ul><ul><ul><li>hasAndBelongsToMany </li></ul></ul><ul><ul><ul><li>Cardinalité N-N : les Posts ont plusieurs Tags </li></ul></ul></ul>
  77. 77. Associations <ul><li>Utilité des associations : </li></ul><ul><ul><li>Récupération automatiques de données </li></ul></ul><ul><ul><ul><li>Le paramètre ' $recursive' des Modèles permet de récupérer en même temps un Post et ses Commentaires </li></ul></ul></ul><ul><ul><li>Effacement lié </li></ul></ul><ul><ul><ul><li>Les Commentaires d'un Post peuvent être effacés en même temps que celui-ci </li></ul></ul></ul><ul><ul><li>Génération futée de scaffolding </li></ul></ul><ul><ul><ul><li>Les listes et menus déroulants sont automatiquement mis en relation </li></ul></ul></ul>
  78. 78. Associations - exemple <ul><li>Exemple : </li></ul><ul><ul><li>Rajouter l'attribut suivant au modèle ' Comment' : </li></ul></ul><ul><ul><ul><li>var $belongsTo = array('Post'); </li></ul></ul></ul><ul><ul><li>Les Commentaires sont maintenant associés aux Posts dans les vues scaffoldées </li></ul></ul>
  79. 79. Associations - exemple <ul><li>Exemple 2 : </li></ul><ul><ul><li>Rajouter l'attribut suivant au modèle 'Post ' : </li></ul></ul><ul><ul><ul><li>var $hasMany = array('Comment'); </li></ul></ul></ul><ul><ul><li>On peut maintenant accéder aux Commentaires d'un Post dans les Vues : </li></ul></ul><ul><ul><ul><li>echo $post['Comment'][0]['body']; </li></ul></ul></ul>
  80. 80. Aller (encore) plus vite : Bake.php
  81. 81. Bake.php - présentation <ul><li>Qu'est ce que c'est ? </li></ul><ul><ul><li>Un script à lancer depuis la ligne de commande </li></ul></ul><ul><li>Utilité : </li></ul><ul><ul><li>Bake génère des fichiers de code à partir de la BDD </li></ul></ul><ul><ul><li>On peut générer des Modèles, des Contrôleurs et des Vues </li></ul></ul>
  82. 82. Bake.php - présentation <ul><li>Comparaison bake/scaffolding </li></ul><ul><ul><li>Le scaffolding génère l'affichage dynamiquement </li></ul></ul><ul><ul><ul><li>Avantage : l'affichage suit instantanément un changement de schéma </li></ul></ul></ul><ul><ul><ul><li>Inconvénient : on ne peut pas éditer ou adapter le code produit </li></ul></ul></ul><ul><ul><li>Bake génère le code une fois pour toute </li></ul></ul><ul><ul><ul><li>Avantage : se baser sur le code produit pour développer rapidement </li></ul></ul></ul><ul><ul><ul><li>Inconvénient : ne prend pas en compte un changement de schéma </li></ul></ul></ul>
  83. 83. Bake.php - utilisation <ul><li>Appel de Bake : </li></ul><ul><ul><li>Bake s'appelle depuis la ligne de commande </li></ul></ul><ul><ul><li>Syntaxe générale : </li></ul></ul><ul><ul><ul><li>php.exe /cake/scripts/bake.php </li></ul></ul></ul><ul><ul><li>On peut passer des arguments au script </li></ul></ul><ul><li>Conseil : </li></ul><ul><ul><li>Pour appeler ' php.exe' depuis la ligne de commande, mieux vaut que php soit dans le PATH : </li></ul></ul><ul><ul><ul><li>Méthode 1 : éditer les variables d'environnement, puis redémarrer </li></ul></ul></ul><ul><ul><ul><li>Méthode 2 : taper 'set path=%path%;c:dossier_de_php' </li></ul></ul></ul>
  84. 84. Bake.php - utilisation <ul><li>Exemple pratique : </li></ul><ul><ul><li>Ouvrir une invite de commande </li></ul></ul><ul><ul><li>Naviguer jusqu'à '.../cake/scripts' </li></ul></ul><ul><ul><li>Taper : </li></ul></ul><ul><ul><ul><li>php bake.php </li></ul></ul></ul><ul><ul><li>Bake détecte automatiquement l'application à cuisiner </li></ul></ul><ul><ul><li>Suivre les instructions </li></ul></ul>

×