La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

CakePHP 2.x. 1.Présentation framework et philosophie 2.Arborescence, architecture et installation 3.Les conventions de CakePHP 4.Le Router 5.La couche.

Présentations similaires


Présentation au sujet: "CakePHP 2.x. 1.Présentation framework et philosophie 2.Arborescence, architecture et installation 3.Les conventions de CakePHP 4.Le Router 5.La couche."— Transcription de la présentation:

1 CakePHP 2.x

2 1.Présentation framework et philosophie 2.Arborescence, architecture et installation 3.Les conventions de CakePHP 4.Le Router 5.La couche MVC 6.Le pattern ActiveRecord et le CRUD de CakePHP 7.Evénements, Collections et Objets 8.Les exceptions 9.Les librairies intégrées 10.La Console et la Bakery 11.Le Scaffolding

3 Présentation framework et philosophie Projet initié en 2005 par Michal Tatarynowicz sous licence MIT. Le projet a été vite repris par la « Cake Software Foundation », fondée par Larry E. Masters et Garrett J. Woodworth. Elle se compose de quelques developeurs comme Nate Abele (fondateur de Lithium, autre framework), John Anderson (fondateur du Cookbook, espace de documentation du framework) ou Mark Story (actuellement le lead dev sur le projet). Lorsquon regarde les commits on constate aujourdhui que plusieurs personnes dorigines très différentes (USA, Espagne, Japon, Pays-pays, UK, etc…) participent activement au projet sous la houlette de la « Cake Software Foundation », il sagit donc là dun vrai projet participatif et collaboratif organisé autour dune même communauté. CakeDC est lagence fondée par Larry E. Masters, le SensioLab de CakePHP en quelques sortes.

4 Présentation framework et philosophie CakePHP est présenté comme ladaptation en PHP des principes qui ont fait le succès de Ruby On Rails. Le principal patron de conception est Modèle- Vue-Controleur cest pourquoi on dit quil sagit dun framework MVC. La version stable actuelle est Il est disponible sur PEAR pour les dernières versions stables ou Github pour les 13 branches en cours.

5 Présentation framework et philosophie CakePHP est lexpression de « convention au lieu de configuration ». La priorité de CakePHP est le développement rapide en utilisant des paradigmes bien définis. Dans CakePHP chaque fonctionnalité se code dune façon particulière, le framework impose une architecture et un best practice.

6 Arborescence, architecture et installation |-- app -> Dossier des fichiers de l'application | |-- Config -> Dossier des fichiers de configuration | | |-- Schema -> Fichiers SQL nécessaires à l'initialisation du projets | |-- Console -> Dossier des scripts console | | | |-- Command -> Dossier des commandes shell | | | `-- Task -> Dossier des commandes réutilisables | |-- Controller -> Dossier des contrôleurs | | `-- Component -> Dossier des components, librairies de factorisation de code | |-- Lib -> Dossier des librairies internes au projet | |-- Locale -> Dossier des locales pour l'internationalisation | |-- Model -> Dossier des modèles | | |-- Behavior -> Dossier des Behaviors, comportements câblés sur les événements | | | d'édition de données | | `-- Datasource -> Dossier des Datasources, Adpaters particuliers pour accéder à | | | une API par exemple | |-- Plugin -> Dossier des Plugins, sous-modules MVC | |-- Test -> Dossier des Tests, pour faire du développement piloté par les | | | tests (Avec PHPUnit) | |-- Vendor -> Dossiers des librairies extérieurs

7 Arborescence, architecture et installation | |-- View -> Dossier des vues, pour chaque controleur un dossier de vue est | | | associé | | |-- Elements -> Dossier des Elements, sous-vues réutilisables | | |-- s -> Dossier déstinés aux templates d' s | | | |-- html -> Cas HTML | | | `-- text -> Cas texte | | |-- Errors -> Dossiers des vues des pages d'erreur comme 404 | | |-- Helper -> Dossiers des Helpers de vue du projet, routines de rendus comme | | | le Helper de formulaires | | |-- Layouts -> Dossier des layouts, fichier de vue principal comportant | | | généralement le header et le footer | | |-- Pages -> Pages ne nécessitants pas de contrôleurs | | |-- Scaffolds -> Dossiers des Scaffolds du projet, vues génrériques pour un BO par exemple

8 Arborescence, architecture et installation | |-- tmp -> Dossiers des fichiers temporaires | | |-- cache -> Dossier de cache | | | |-- models -> Cache de la couche modèle (de la configuration, pas des données | | | | en base), automatique en prod | | | |-- persistent -> Cache requêtes donc des données en base (modèles persistants) | | | `-- views -> Cache des vues ou de parties de vues | | |-- logs -> Dossier de logs | | |-- sessions -> Dossier contenant les sessions | | `-- tests -> Fichiers temporaires issues des tests | `-- webroot -> Document Root | |-- css -> Fichiers CSS | |-- files -> Uploads | |-- img -> Images | `-- js -> Javascripts

9 Arborescence, architecture et installation |-- lib -> Dossier des librairies Cake | `-- Cake | |-- Cache | |-- Config | |-- Configure -> Readers de fichiers de config (PHP ou INI) | |-- Console | |-- Controller | | `-- Component | |-- Core -> Librairies les plus bas niveaux de CakePHP avec notamment App et | | Object (beaucoup de composants héritent d'Object) | |-- Error | |-- Event -> Tous les composants qui ont des callbacks comme les Contrôleurs, | | les Components ou les Behaviors implémentent une interface de | | listener d'events | |-- I18n | |-- Log | | `-- Engine

10 Arborescence, architecture et installation | |-- Model | | |-- Behavior | | `-- Datasource -> CakePHP est livré avec un Adapter de Base de données et de | | Session | | |-- Database | | `-- Session | |-- Network | | |-- | | `-- Http | |-- Routing | | `-- Route | |-- Test | |-- TestSuite | |-- Utility -> Classes indépendantes utilisées dans l'ensemble des librairies de | | CakePHP | `-- View | |-- Elements | |-- Errors | |-- Helper | `-- Scaffolds |-- plugins -> Il est possible davoir plusieurs « app » partageant le même Core. `-- vendors Dans ce cas il est également possible davoir des plugins et librairies partagés entre tous les projets.

11 Arborescence, architecture et installation Détail dune requête CakePHP

12 Arborescence, architecture et installation Linstallation de CakePHP est très simple, il y a plusieurs solutions. Un.htaccess se situe à la racine de CakePHP, dans le dossier « app » et dans le dossier « app/webroot ». Même si la convention voudrait quon situe le DocumentRoot sur « app/webroot », grâces aux mutiples.htaccess il est possible de le positionner sur « app » ou même de mettre lensemble des fichiers de CakePHP. Il faudra activer la réécriture durl et le support des.htaccess (sinon ajouter dans la configuration serveur le contenu du.htaccess correspondant). Au pire, CakePHP peut très bien fonctionner sans réécriture durl. Dans ce cas il faut mettre le DocumentRoot sur « app/webroot » CakePHP peut également très bien se mettre dans un dossier indépendant.

13 Arborescence, architecture et installation Premier écran de CakePHP une fois les fichiers installés correctement

14 Arborescence, architecture et installation Il faut remplacer le « salt », utilisé par le hashing et le « cypher seed » utilisé pour lencryption. Vous pouvez aller à cette adresse pour obtenir les bons codes: Il faut ensuite configurer la base de données dans le fichier database.php. Il est possible de ne pas avoir de DB en utilisant un DataSource personnalisé qui ne pointe vers aucune base: ithout_a_database_fixed

15 Les conventions de CakePHP Les noms de fichiers et de dossier sont généralement en CamelCase sauf pour les fichiers de templates (vues). Les classes sont en CamelCase. Les modèles sécrivent au singulier, il y a un modèle par table et ces dernières nont quune clé primaire (en auto-incrément généralement). Les contrôleurs sécrivent au pluriel. Les actions sécrivent en lowerCamelCase. Les dossiers des vues on les noms des Contrôleurs, donc au pluriel. Les fichiers sont le nom des actions en minuscule traduit avec des underscores. Les actions du back-office son précédées par « admin_ » Les noms de tables sont en minuscule et séparés par des underscores.

16 Le Router La route par défaut de CakePHP est la suivante: « /controler/action/param1:test/param2:test2 ». Lensemble des routes se trouvent de le fichier « app/Config/routes.php ». Toutes les routes peuvent être créés grâce à la méthode « Router::connect() ». Le premier argument de « Router::connect() » est la chaine de la route, elle contient des clés préfixées par « : », on peut utiliser les wildcards « * » afin que le reste de lurl soit considéré comme des paramètres de laction. Dans le deuxième argument on définit les clés de la route. Dans le troisième argument on définit les options dont le format des valeurs des clés.

17 Le Router Les clés « controller », « action » positionnent ces deux paramètres. Elles peuvent être fixées en dur dans le deuxième argument sils napparaissent pas dans la chaine de la route. La clé « filter » permet de définir les paramètres nommées autorisés, cest-à-dire généralement les paramètres dune action. Le paramètre « admin » permet de créer des routes de Backoffice et ne prend que les actions préfixées par « admin_ ». Il est également possible de contrôler les paramètres nommées avec « Router::connectNamed() » et dy associer des règles comme pour les paramètres normaux.

18 Le Router « Router::url » permet de faire du reverse routing, cest-à-dire regénérer lurl suivant ses composantes. « Router::redirect » permet de mettre en place des règles de redirection. « Router::mapResources » permet de définir un contrôleur REST. « Router::parseExtentions » permet de définir les formats quaccepte lapplication (html, rss, json, xml, etc).

19 Le Router – La routeClass La routeClass, qui est définie dans les options de « Router::connect() » permet de définir une classe de routing particulière dans laquelle il sera possible de faire tous les traitements voulus. Dans cette classe custom qui devra être insérée avant le « Router::connect() », il y a deux méthodes qui peuvent être implémentées: – « parse() » appelé lorsquon envoie la requête HTTP – « match() » appelé lorsquon fait linverse, cest-à-dire quon recompose lurl daprès ses paramètres.

20 La couche MVC Dans CakePHP, bien que dans la plupart des cas un modèle, un contrôleur et une vue doivent être ajoutées, le modèle et la vue ne sont pas obligatoires. Pour ne pas avoir de vue on ajoute « $this->autoRender = false; » dans le contrôleur. Pour ne pas avoir de modèle on initialise lattribut « uses » à null dans la classe contrôleur. On peut même avoir un modèle sans DataSource, on utilise lattribut « useTable » quon initialise à false dans la classe modèle.

21 La couche MVC – Le modèle La classe de modèle hérite de AppModel. Le paramètre « primaryKey » permet de définir le nom de la clé primaire de la table. Le paramètre « validate » permet dajouter des validateurs sur chaque champ. Le paramètre « hasOne » permet de définir une relation de type 1-1 -> 1-1. On y détermine notamment la clé étrangère ou les conditions de relation. A noter que si on a respecté les conventions de nommage de CakePHP pour la clé étrangère(« table- cible_id »), il suffit uniquement dajouter le nom de la table cible.

22 La couche MVC – Le modèle Le paramètre « belongsTo » permet de définir une relation de type 0-n -> 1-1. Idem à « hasOne » sauf quon peut définir lordre et la limite qui seront appliqués lors de la jointure. Le paramètre « hasMany » permet de définir une relation de type inverse, cest-à-dire 1-1 -> 0-n. Le paramètre « hasAndBelonsToMany » permet de définir une relation de type 0-n -> 0-n, donc une association. Dans ce cas la configuration contient les informations de la table dassociation en plus de la clés étrangère. Cela évite de faire des modèles pour des associations.

23 La couche MVC – Le contrôleur Tous les contrôleurs de lapplication héritent de « AppConroller » qui hérite lui-même de « Controller ». Ainsi toutes les actions, attributs, callbacks, etc. communs peuvent être mis dans « AppController ». Les méthodes du contrôleur sont les actions, pour accéder à chaque action en passant des paramètres, il suffit dappeler : « /controler/action/param1:test/param2:test2 » Lobjet « request » contient toutes les informations de la requête et les paramètres passés, il est obligatoire de passer par cet objet.

24 La couche MVC – Le contrôleur Largument « uses » permet dajouter un ou plusieurs modèles ou librairies du dossier « Lib », largument « conponents » permet de définir les composants qui seront utilisés, idem pour largument « helpers » avec les helpers de vue. Chaque contrôleur dispose de 3 callbacks: – « Controller::beforeFilter» qui est déclenché avant toute action, – « Controller::beforeRender» qui est déclenché avant tout rendu, – « Controller::afterFilter» qui est déclenché après toute action. La méthode « set » sert à affecter des valeurs à la vue, on lui passe soit deux arguments clé et valeur soit un tableau de clés/valeurs. La méthode « render » permet de déclencher le rendu avec la vue passée en paramètre. Cette méthode est exécutée automatiquement avec la vue logiquement associée dans larborescence.

25 La couche MVC – La vue Il sagit de fichier avec lextension *.ctp Des blocs et une hiérarchisation des vues qui en découle peuvent être définis. Un bloc permet en dautres termes de définir des zones dun Layout ou la vue parente dans la vue enfant. Les vues peuvent en étendre dautres, par défaut les vues étendent le Layout, mais ce principe peut être appliqué à des vues grâce à la méthode « extend ». Le principal bloc est « content », il contient tout ce qui est affiché dans la vue. Les blocs « script » et « css » sont liés au Helper HTML et à ses méthodes. Laffectation du bloc peut être surchargée.

26 La couche MVC – La vue On peut définir dautres blocs en encadrant leur code par les méthodes « start » et « end » dans la vue. La méthode « fetch » dans la vue est un appel de bloc: – « echo $this->fetch(content); » appelle le bloc principal, – « echo $this->fetch(sidebar); » appelle un bloc sidebar défini dans la vue fille, – « echo $this->fetch(css); » insère toutes les feuilles de styles ajoutées avec le Helper Html : « $this->Html->css('carousel', null, array('inline' => false)); » la dernière option spécifie que les balises doivent être ajoutées au bloc du même nom, ici il sagit du bloc « css », – Il est possible dajouter les balises à un autre bloc: « $this->Html->script('carousel', array('block' => 'scriptBottom')); ».

27 La couche MVC – La vue Il est possible de définir des thèmes avec lattribut « theme » dans le contrôleur. Les vues et les assets se trouvent donc dans un dossier correspondant au nom du thème. Il existe des vues Media qui permettent de rendre des fichiers binaires. Cette vue sert principalement à servir des fichiers qui nécessitent une authentification ou une vérification particulière. Pour les utiliser il faut assigner le paramètre « viewClass » à « Media » dans laction du contrôleur. Avec la clé « _serialize » dans la méthode « set » du contrôleur, les données seront automatiquement sérialisées dans le format demandé grâce à « Router::parseExtensions() »

28 Le pattern ActiveRecord et le CRUD de CakePHP Représentation en digramme de classe du design ActiveRecord

29 Le pattern ActiveRecord et le CRUD de CakePHP ActiveRecord est la représentation en classe dune table, ses attributs sont les champs et ses méthodes permettent les différentes requêtes de sélection, dajout ou de suppression. Lorsquon veut traiter plusieurs enregistrements, donc plusieurs instances de classes ActiveRecord, il est nécessaire davoir des Collections de ces instances pour pouvoir les traiter. Il existe un lien très fort entre les données des lobjets ActiveRecord et ceux de la base, lenregistrement, la ligne de la table est réellement un tuple, une copie de lobjet.

30 Le pattern ActiveRecord et le CRUD de CakePHP Le CRUD de CakePHP reprend de façon très proche le patron ActiveRecord de Ruby on Rails. Cette implémentation diffère quelque peut du design pattern initial présenté précédemment. Pour éviter de gérer des collections et des instanciations issues des tuples de la table, la couche modèle contient des assesseurs qui vont retourner des tableaux simples. Il est dailleurs possible dutiliser les assesseurs sans ActiveRecord, cest-à-dire sans que les données soient représentées dans la classe.

31 Le pattern ActiveRecord et le CRUD de CakePHP Les méthodes « set », « read » et « create » permettent cependant de faire de lActiveRecord, « read » permet de charger un enregistrement depuis la base dans lobjet Modèle et « set » depuis le contrôleur. Si un « save » sans paramètres est fait ensuite, les données ajoutées dans lobjet seront utilisées pour faire lINSERT ou lUPDATE. « create » permet de réinitialiser les données de lobjet. LActiveRecord dans CakePHP ne concerne que les enregistrements uniques car les modèles sont des Singletons et sert surtout lors de lenregistrement des données.

32 Le pattern ActiveRecord et le CRUD de CakePHP - Find La méthode « find » permet de rechercher des enregistrements sans ActiveRecord: – « find(first) récupère le premier enregistrement, – « find(count) récupère le nombre de lignes, – « find(all) récupère tous les enregistrements, – « find(list) récupère tous les enregistrements sous forme de tableaux simple dont les index sont les id, – « find(threaded) » récupère tous les enregistrements sous forme de tableaux imbriqués, dans les clés « children » se trouvent les données enfants, utile pour les catégories hiérarchisées par exemple. – « find(neighbors) » récupère lenregistrement précédent et suivant du first, pratique pour les pagers next/prev.

33 Le pattern ActiveRecord et le CRUD de CakePHP - Find Le deuxième paramètre, la « query », permet dajouter: – les champs qui seront sélectionnés, – les conditions, – la récursivité; il sagit de prendre les n tables associées. Pour ne prendre que les données de la table la récursivité à valeur « -1 », pour prendre le premier niveau de tables liées, elle aura la valeur « 0 », etc. On peut également utiliser les « Magic Find Types ». Ils vont vous permettre de rechercher par un ou plusieurs champs directement depuis lappel de la méthode. Par exemple la méthode « findAllByLastName(jack) » va nous permettre de chercher tous les enregistrement avec les champs « last_name » « jack ». Il est possible de chercher sur plusieurs champs avec les opérateurs « Or » ou « And ».

34 Le pattern ActiveRecord et le CRUD de CakePHP - Find Il est possible de faire ses propres « find », tout simplement en ajoutant des méthodes dans lattribut « findMethods » du modèle et de définir la méthode: « protected _findMaMethode($state, $query, $result) ». Les arguments sont: – « state », « before » ou « after », définit si le traitement concerne la « query » ou le « result ». Dans le premier cas on retourne la « query » et elle est éxécutée, dans le second on retourne le « result », – « query » est la requête demandée, le deuxième paramètre du find, – « result » est le résultat de la requête.

35 Le pattern ActiveRecord et le CRUD de CakePHP - Save Avec le fonction denregistrement on peut tirer partie de lActiveRecord avec « set() », « read() » et « create() ». Si on initialise lattribut « id » et quun save est ensuite exécuté alors il sagira dun UPDATE. On remarque ici que le mécanisme offert par ActiveRecord est plutôt pratique. La méthode « save() » prend en premier paramètre le tableau de données à sauvegarder, si celui est null alors « save() » rentrera dans un fonctionnement ActiveRecord.

36 Le pattern ActiveRecord et le CRUD de CakePHP - Save Voici les autres méthodes denregistrement: – « saveField() », enregistre uniquement un champ, il faut initialiser lid avant de lancer cette méthode, – « updateAll() », enregistre plusieurs enregistrements en fonction des conditions passées dans le 2 ème paramètre, – « saveMany() », enregistre plusieurs lignes en même temps, il est possible dactiver les transactions avec « atomic » et/ou enregistrer les données associées avec « deep », des options qui peuvent être ajoutées en 2 ème paramètre, – « saveAssociated() », enregistre lensemble des données imbriquées, la méthode dispose des même options que saveMany() mais son option « deep » est plus forte car elle peut enregistrer toutes les données imbriquées et pas seulement les données associées, – « saveAll() » est un Wrapper de « saveMany() » et « saveAssociated() ».

37 Le pattern ActiveRecord et le CRUD de CakePHP - Delete La méthode « delete() » va supprimer lenregistrement ayant lid précisé en premier argument. « delete() » fonctionne également en ActiveRecord et peut supprimer la donnée active si on ne lui précise pas de paramètre. Le 2 ème paramètre, sil est à « true » va activer la cascade, cest-à-dire que toutes les données imbriquées vont être également supprimées, cela évite davoir des fantômes en base de données. Une méthode « deleteAll() » existe aussi, au lieu de prendre lid en paramètre elle prend un condition.

38 Objets, Collections et Evénements Cette partie va aborder larchitecture interne de CakePHP afin de comprendre ses principaux mécanismes et voir comment en utiliser certains dans nos applications. LObject est un élément de base CakePHP dont beaucoup de composants héritent comme la classe Controler, Model ou View. Ces trois classes MVC sont des Singletons, elles ne sont donc instanciées quune seule fois lors de lexécution dune requête serveur.

39 Objets, Collections et Evénements Dautres composants CakePHP comme le Behavior ou le Component peuvent avoir plusieurs instances, leurs Factories sont les Collections ou plutôt même des « ObjectCollection ». Cest-à-dire que ce sont ces classes de Collection qui soccupent dy accéder. Toute Collection peut être chargée avec « load() » ou déchargée avec « unload() ». On peut également déclencher manuellement tous les callbacks sur une collection grâce à « trigger() ». Les callbacks dun élément dune Collection peuvent être désactivés avec « disable() » et réactivée avec « enable() ».

40 Objets, Collections et Evénements Représentation en digramme de classe des Collections CakePHP

41 Objets, Collections et Evénements Cela leur permet davoir tous un système de callbacks (vu précédemment) et accessoirement de pouvoir déclencher ou « trigguer » un certain nombre dévénements. Le déclenchement et la création dévénements permet notamment de garder un minimum de couplage entre les classes de CakePHP qui interagissent.

42 Objets, Collections et Evénements La plupart des composants visibles, que ce soit des Singletons ou des Collections implémentent une Interface découteur dévénements (Observer), « CakeEventListener ». Le rôle dun écouteur est dimplémenter la méthode « implemetedEvents » qui est rien que la liste des événements écoutés avec leurs Callbacks. Il est tout a fait possible dutiliser ce mécanisme dans nos propres classes, notamment dans les Plugins qui nécessitent une vraie indépendance.

43 Objets, Collections et Evénements On pourra propager nimporte où dans le code un événement grâce au gestionnaire dévénements « CakeEventManager ». A noter quon peut également attacher un Callback particulier lors du déclenchement. On pourra attacher un écouteur dévénement (action de Dispatch) à un autre endroit du code, on créera ainsi un Hook. Comme nimporte quels Hooks il est également possible de définir leur priorité dans CakePHP.

44 Les exceptions CakePHP possède une liste de classes dExceptions issues de CakeException. Il est possible de créer ses propre classes dException en les faisant hériter de CakeException. CakePHP Try lensemble du code et a son propre Handler pour gérer les exceptions. Pour rester dans cette logique et si on désire faire un traitement particulier des exceptions il est possible de faire son propre Handler: « Configure::write('Exception.handler', 'AppExceptionHandler::handle'); » De la même façon on peut uniquement personnaliser le Renderer, cest-à-dire les messages affichés: « Configure::write('Exception.renderer', 'AppExceptionHandler::handle');»

45 Les librairies intégrées Nous nallons pas énumérer toutes les libraires mais uniquement celles qui vous permettrons darchitecturer votre code et celles incontournables en terme de fonctionnalités. Les Paradigmes darchitectures: Component, Element, Helper, Behavior, Plugin. Il est également possible davoir des librairies de code sans architecture particulière, elle sajouteront dans le dossier « Lib ». Les librairies utiles: Authentification, ACL, Translate, Security, , Cache, Form, Paginator et Containable.

46 Les librairies intégrées – Component (composant): Son but est de factoriser du code entre plusieurs Contrôleurs, on peut le voir comme une librairie de traitement qui leur est destinée. Un Component se charge grâce à lattribut « components » ajouté dans le contrôleur. Il existe des Components intégrés mais il est tout à fait possible den créer des nouveaux. Un Component implémente lécouteur dévénements, il est donc pourvu de callbacks comme le contrôleur. Au lieu davoir un callback « beforeFilter() » il a « startup() » qui est appelé entre le « beforeFilter() » du contrôleur et lexécution de laction.

47 Les librairies intégrées – Element (élément) Un Element permet de factoriser du code de vue très simplement. Il sagit dune mini-vue auquel on va transmettre des variables. On utilise les Elements en lieu et place des blocs pour principalement 2 raisons: – lorsquil sagit de quelque chose de très récurent et de plutôt général, quon pourrait réutiliser dans un autre projet, – lorsquon veut un bloc « cachable », un Element peut effectivement prendre en compte des options de caching.

48 Les librairies intégrées – Helper (assistant) Le Helper est à la vue ce quest le Conponent au contrôleur. Il permet de factoriser du code de vue mais est généralement destiné aux opérations plus complexes et se structure en module. Il sagit généralement dune boite à outil proposant un panel dassistants sur un objet particulier. On va par exemple avoir un Helper de formulaires qui va nous offrir toutes les méthodes pour construire un form HTML. Le Helper dispose de callbacks particuliers ciblés sur le rendering. Lutilisation dun Helper se déclare dans le contrôleur grâce à lattribut « helpers ».

49 Les librairies intégrées – Behavior (comportement) Le Behavior est au modèle ce quest le Conponent au contrôleur. Un Behavior implémente lécouteur dévénements, il est donc pourvu de callbacks comme le Component. Les callbacks sont liées aux actions sur les données: – « beforeValidate() » – « beforeFind() » / « afterFind() » – « beforeSave() » / « afterSave() » – « beforeDelete() » / « afterDelete() » – « setup() » / « cleanup() »: ces hooks sont déclenchés lors de lattachement / détachement au modèle. Les behaviors sattachent au modèle grâce à lattribut « actsAs ».

50 Un Plugin est un module complet indépendant, reprenant larchitecture dune application et utilisant les mêmes Paradigmes que cette dernière. Un Plugin est comparable à un module dans Zend. Un Plugin se charge dans le bootstrap (dans « Config ») grâce à « CakePlugin::load() » Un Plugin peut également avoir ses propres routes dans son dossier « Config ». Il peut également avoir son propre bootstrap pour initialiser les composants dont il a besoin. Pour charger les routes et le bootstrap du plugin dans lapplication: CakePlugin::load(myPlugin', array('bootstrap' => true, 'routes' => true)); -> A noter quun tableau de nom de fichiers peut être passés à la place du booléen. Les librairies intégrées – Plugin (greffon)

51 Les librairies intégrées – Authentification Il sagit dun Meta Component « AuthComponent » (Ce composant utilise dautres classes spécifiques, doù le terme « Meta »). – Le composant gère uniquement la couche métier de lauthentification, il utilise le modèle, le contrôleur et les vues « User » de lapplication. – Le composant gère les méthodes de connexion Basics et Digests pour les services. – Pour lauthentification en mode Digest, une méthode statique « password() » de la classe « DigestAuthenticate » permet de générer le Hash (clé). – La connexion nest pas automatique, elle se fait grâce à la méthode « login() » du composant.

52 Les librairies intégrées – ACL Il sagit dun Behavior de modèle et il permet de gérer les listes de contrôle daccès. Il sagit donc dune couche de contrôle qui va vérifier les accès aux ressources de données. Il y a trois acteurs dans une stratégie ACL: – les AROs - Access Role Object, les rôles, – les ACOs – Access Controm Object, les ressources, – les AROsACOs – les permissions. CakePHP permet de gérer ces 3 notions soit: – en bases avec 3 tables différentes (pouvant être générées avec les outils de Console), – en fichier INI, – dans la configuration générale avec lobjet de configuration.

53 Les librairies intégrées - ACL Un Behavior de type ARO peut être attaché à un modèle de la façon suivante (sur un modèle User par exemple): « public $actsAs = array('Acl' => array('type' => 'requester')); » Un Behavior de type ACO peut également être attaché à un modèle de la façon suivante (sur un modèle Post par exemple): « public $actsAs = array('Acl' => array('type' => controlled')); » Il peut être les deux avec le type « both ».

54 Les librairies intégrées - ACL Chaque modèle doit être qui intègre le Behavior ACL doit avoir une méthode « parentNode() ». Cette méthode sert à construire une stratégie hiérarchique dARO ou dACO, on doit y retourner le nom du node parent. Dans le cas dune stratégie simple, on fait retourner « null » à cette méthode.

55 Les librairies intégrées - Translate En plus dintégrer gettext (fonction « __() ») et linternationalisation basé sur les locales, CakePHP propose le Behavior Translate. Une fois le comportement attaché au Modèle et la table de traduction créée (grâce à loutil Console), certains champs pourront être définis comme devant être traduits, par exemple: « public $actsAs = array( 'Translate' => array( 'fieldOne', 'fieldTwo') ); » Le Behavior se base sur la locale globale définie dans le Bootstrap. Elle peut être surchargée grâce à lattribut « locale » du modèle.

56 Les librairies intégrées - Security Security est un Component. Il permet de parer efficacement et simplement un ces failles connues et identifiées: – le Cross-Site Request Forgery – avec un système de jeton temporaire (Nécessite lutilisation du Form Helper), – la falsification de formulaires – en injectant des données cachées avant le POST et en vérifiant leur intégrité à la soumission (Nécessite lutilisation du Form Helper), Et permet certaines restrictions comme: – celle dêtre en SSL, – celle daccepter que certaines méthodes HTTP, – et la limitation des communications croisée dans le contrôleur. Security permet également de gérer les exceptions de sécurité grâce à un Black Hole. A noter que dés son activation la protection contre les CSRF et les falsifications de formulaires sont actives (avec le Form Helper).

57 Les librairies intégrées - Cake Remplace le Component dans la version 2.x. Il sagit dune librairie plus indépendante qui peut être utilisée aussi bien dans un contrôleur ou dans un composant mais également dans un modèle. La librairie peut se configurer à nimporte quel moment, cependant il existe une classe « Config » dans le dossier « Config ». Ses attributs sont les différentes configurations qui pourront être utilisées. Il est notamment très facile de configurer un Transport SMTP pour envoyer un mail via un compte Google par exemple. Il est également possible de créer des Transports spécifiques en étendant la classe abstraite « AbstractTransport » et en implémentant la méthode « send() ».

58 Les librairies intégrées - Cake Il est possible de créer des templates pour les mails: – On utilise le dossier « » de « View » pour mettre le vues, – On dépose les gabarits dans « Layout/ » de « View ». Pour attacher un template à un il suffit dutiliser la méthode « template() » de lobjet instance de Cake . Le premier argument est sa vue, le second son gabarit. Le format peut également être défini grâce à la méthode « Format() ». On peut utiliser le format texte, HTML ou les deux. Dans ce cas les fichiers de rendus se trouvent dans les sous- dossiers « text » et « html ». Pour passer des variables aux templates la méthode « viewVars() » est nécessaire.

59 Les librairies intégrées - Cache Il sagit dune librairie commune, elle peut être utilisée aussi bien dans un contrôleur que dans un modèle. Plusieurs moteurs de cache peuvent être utilisées comme: File, Apc, Wincache (IIS), Xcache, Memcache, REDIS. Plusieurs politiques de caching peuvent être définies grâce à la méthode statique « Cache::config ». Il est également possible de créer des moteurs de cache personnalisées en étendant « CacheEngine » et en implémentant plusieurs méthodes abstraites comme « write() », « read() » ou « clear() ».

60 Les librairies intégrées - Cache Il existe principalement deux types de cache, du cache requête ou du cache de rendu. Pour du cache requête, les options de cache peuvent être activé dans chaque « find »: « find('list', array('cache' => 'countryList', 'cacheConfig' => 'long')); »array Cela peut également se faire manuellement pour des requêtes spécifiques du modèle avec les méthodes « read() » et « write() ». Pour le cache de rendu, on utilisera le Helper CacheHelper. Grâce à lattribut « cacheAction », il est possible de définir la liste des actions dont les rendus seront cachés. Il est ensuite possible de ne pas activer le cache pour certaines zones grâce aux commentaires « »

61 Les librairies intégrées - Cache Il existe principalement deux types de cache, du cache requête ou du cache de rendu. Pour du cache requête, les options de cache peuvent être activé dans chaque « find »: « find('list', array('cache' => 'countryList', 'cacheConfig' => 'long')); » Cela peut se faire manuellement pour des requêtes spécifiques du modèle avec les méthodes « read() » et « write() ». Les éléments de vue (Element), peuvent également avoir du cache.

62 Les librairies intégrées - Form Loutil Form est un Helper de vue. Il permet de créer des formulaires HTML de manière uniforme et permet de gérer automatiquement certaines fonctionnalités de CakePHP comme certaines politiques de sécurité (Component Security). Par rapport à ZendForm, le Helper CakePHP prend le parti de ne gérer que le code HTML de chaque champs, ce qui en fait un outil plus simple à manier car sans Decorator. FormHelper gère également les validations définies dans le modèle et permet de dafficher une erreur sur un champs grâce à sa méthode « error() », le premier argument est le nom du champs. Lerreur est affichée par défaut dans le cas où on utilise des « inputs ».

63 Les librairies intégrées – Paginator Paginator est un Component (PaginatorComponent) et un Helper (PaginatorHelper). Dans le contrôleur, une fois le Component attaché, on va définir les jeux de pagination avec lattribut « paginate ». Ces jeux seront composés des ressources concernées, du nombre d éléments par page de chacune delle et dun ensemble de paramètres comme lodre ou les conditions. Une fois les jeux définis, il suffira dutiliser la méthode « paginate() » du contrôleur au lieu de « find() » du modèle: « $this->paginate('Recipe'); ». En deuxième paramètre il est tout a fait possible de passer un tableau de conditions, limites, etc qui surchargera ce qui a été défini dans les jeux.

64 Les librairies intégrées – Paginator Le Helper lui va se concentrer sur la génération HTML du pager. Il possible de générer plusieurs types de pager: – « sort() » - permet de créer un lien de tri, pratique pour ordonner des colonnes dans un BO, – « numbers() » - créé un pager composé de nombres, il prend beaucoup doptions et permet dailleurs de gérer mellipsis cest-à-dire les … entre les nombres dans les cas avec des résultats importants, – « prev() », « next() », « first() », « last() », « current() » - pour les liens de sauts. Les paramètres nommés « page », « dir » et « sort » seront utilisés pour la pagination. Il est possible de passer dautres paramètres où une Querystring dans le Component afin de garder dautres paramètres durant la pagination. Le Helper prendra automatiquement en compte ces paramètres additifs.

65 Les librairies intégrées – Containable Containable est un Behavior. Avec le CRUD de CakePHP, il est possible davoir beaucoup de données dassociation, bien que cela soit très utile il en reste que cette masse de données peut poser des problèmes de performances. Containable sert à limiter relativement simplement la profondeur et la somme de données requêtées. Un appel dun « contain() » sans paramètre sur la ressource, avant le « find() », va limiter la requête sur la ressource. Cela équivaut à mettre un « recursive » à « -1 »

66 Les librairies intégrées – Containable Containable va également nous permettre de pouvoir conditionner sur les tables associées: « $this->Post->contain('Comment.author = "Daniel"'); » Ici, bien que la ressource soit « Post », on peut émettre une condition sur un champs « author » qui nappartient quà la table de commentaires. Il est possible dajouter une option « contain » directement dans le « find() » au lieu de le définir avant. Loption « contain » est également disponible dans le Component Paginator.

67 La Console et la Bakery Un ensemble doutils Core sont prévus dans un script shell « sh app/Console/cake » ou « app\Console\cake.bat » sur Windows. Un ensemble de fonctionnalités sont alors proposées comme « acl », « api », « i18n », « upgrade », etc. Ces commandes vous permettrons de créer des architectures en base de données, de générer du code, de la doc ou bien de faire des mises à jour de CakePHP ou de ses Plugins officiels. Pour accéder à une commande il suffit de taper: « app\Console\cake.bat command args».

68 La Console et la Bakery Menu présentant les différentes commandes de la console CakePHP

69 La Console et la Bakery Il est également possible dajouter nos propres routines, elles seront alors automatiquement visibles dans le menu. Il suffit alors dajouter un fichier de classe dans le dossier « app/Console/Command ». La classe héritera de « AppShell », sa méthode « main() » sera la commande par défaut et ses autres méthodes seront les sous-commandes: « app/Console/cake.bat my-command my-sub-command my-arg» Vous pourrez ajouter des Task (Tâches) dans le dossier « app/Console/Command/Task/ ». Il sagit de librairies destinées aux scripts console comme sont les Components aux contrôleurs.

70 La Console et la Bakery Une tâche est une classe qui hérite de « Shell » et qui a au moins une méthode qui sappelle « execute() ». Il est possible dinvoquer dautres Shell grâce à la méthode « dispatchShell ». Vous pourrez afficher des informations grâce à la méthode « out() » et gérer son niveau de verbosité (« QUIET », « NORMAL », « VERBOSE »). Des styles peuvent être ajoutés sous forme de balise: « $this->out( Pay attention ); ». Ces styles sont prédéfinis mais il est possible den ajouter avec la méthode « styles() » de lobjet « stdout » du shell.

71 La Console et la Bakery Afin de pouvoir gérer les arguments et les options des commandes nous avons à dispositions les méthodes « addArguments() » et « addOptions() ». Les arguments sont des valeurs ajoutées à la suite, les options ne sont souvent pas obligatoires et nécessitent un nom, comme « -p password ». Ces méthodes vont nous permettre de configurer les entrées, cest-à-dire: – Leur message daide, – Si elle sont requises ou pas, – Leurs différentes valeurs (yes/no par exemple), – Leur valeur par défaut, – Un nom doption pour cette dernière.

72 La Console et la Bakery Si vous désirez lancer des scripts console en CRON il faudra créer un script Shell qui positionnera les PATH du PHP CLI et de la Console CakePHP. Un exemple est donné dans le CookBook:

73 La Console et la Bakery La Bakery est une commande Core de la console « cake », positionné à la racine, il suffit dexécuter cette commande: « app\Console\cake.bat bake ». Sa principale fonction va être de générer: – le fichier de configuration de la base, – les modèles et les validateurs, – les contrôleurs et les contrôleurs dadmin, – les vues, – les fixtures (données de test), – les classes de tests unitaires, – les fichiers de base dun nouveau Plugin.

74 La Console et la Bakery Une dernière option « project » permet de notamment spécifier une architecture dapplication différente. On le fait avec loption « --skel » (skeletor): « app\Console\cake.bat bake project --skel app\Console\Templates\skel ». Vous pourrez également modifier le code généré par la Bakery en ajoutant des Templates de contrôleur/modèle/vues dans « app/Console/Templates/my-template ».

75 La Console et la Bakery La Bakery – Exemple de génération des modèles

76 Le Scaffolding CakePHP offre la possibilité davoir un espace dadministration très rapidement, dés la fin de la conception DB. Scaffold veut dire échafaudage, il sagit donc là davoir un outil temporaire dans lélaboration du projet. Cet outil là sert à saisir les données. Pour activer le Scaffold il suffit dajouter un attribut « scaffold » dans le contrôleur. Si on désire avoir un Scaffold admin: – Il faut activer le routing admin dans la configuration: « Configure::write('Routing.prefixes', array('admin')); » – Puis affecter la valeur « admin » à lattribut « scaffold »

77 Le Scaffolding Il est possible de surcharger les actions du Scaffolding en déclarant la méthode concernée. Si on désire surchargée la vue liste, il suffit dajouter la méthode « admin_list() » dans le contrôleur. On peut également surcharger les vues afin davoir des rendus personnalisés, avec Bootstrap de twitter par exemple. On peut surcharger par contrôleur ou pour tous les contrôleurs. Il nest cependant pas conseillé de trop surchargé car cela reviendrait à faire un BO spécifique et cela nest pas le but du Scaffold.


Télécharger ppt "CakePHP 2.x. 1.Présentation framework et philosophie 2.Arborescence, architecture et installation 3.Les conventions de CakePHP 4.Le Router 5.La couche."

Présentations similaires


Annonces Google