776
CakePHP Cookbook Documentation Version 2.x Cake Software Foundation févr. 01, 2018

CakePHP Cookbook Documentation, Version 2.x

Embed Size (px)

Citation preview

  • CakePHP Cookbook DocumentationVersion 2.x

    Cake Software Foundation

    fvr. 01, 2018

  • Table des matires

    1 Pour Commencer 1Tutoriel dun Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Blog Tutoriel - Ajouter la logique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2 Installation 29Conditions requises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Licence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Tlcharger CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Dveloppement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Production . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Installation avance et URL Rewriting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32A vous de jouer ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    3 Dbuter avec CakePHP 37Quest ce que CakePHP ? Pourquoi lUtiliser ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Comprendre le systme M-V-C (Model-View-Controller) . . . . . . . . . . . . . . . . . . . . . . . . . . . 38O obtenir de laide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    4 Controllers (Contrleurs) 43Le Controller App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43Les paramtres de requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Les Actions du Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Request Life-cycle callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Les Mthodes du Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Les attributs du Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53En savoir plus sur les controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    5 Views (Vues) 75Templates de Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75Utiliser les Blocs de Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

    i

  • Crer vos propres classes de vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84API de View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84En savoir plus sur les vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

    6 Models (Modles) 181Comprendre les Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181Pour en savoir plus sur les Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

    7 Librairies du Coeur 309Usage Gnral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309Behaviors (Comportements) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Components (Composants) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Helpers (Assistants) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380Utilitaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380

    8 Plugins 487Comment Installer des Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487Comment Utiliser des Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489Comment Crer des Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490

    9 Shells, Tasks & Outils de Console 497La console de CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497Crer un Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499Les tches Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500Invoquer dautres shells partir de votre shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501Niveaux de sortie de la Console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502Style de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502Configurer les options et gnrer de laide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503Routing dans shells / CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510API de Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Plus de sujets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513

    10 Dveloppement 533Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567Gestion des Erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601Filtres du Dispatcher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605

    11 Dploiement 609Vrifier votre scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609Dfinir le document root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609Mise jour de core.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609Amliorer les performances de votre application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610

    12 Authentification Simple et Autorisation de lApplication 611Crer le code li de tous les users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611Authentification (Connexion et Deconnexion) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614Autorisation (Qui est autoris accder quoi) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616

    13 Application Simple contrle par Acl 619

    ii

  • Prparer notre Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619Prparer lajout dAuth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621Initialiser les tables Acl dans la BdD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622Agir comme un requteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623Crer les ACOs (Access Control Objects) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624

    14 Application Simple contrle par Acl - partie 2 627Un outil automatique pour la cration des ACOs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627Configurer les permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628Connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629Dconnexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630Cest fini ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630

    15 Tutoriels et exemples 631Tutoriel dun Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631Blog Tutoriel - Ajouter la logique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634

    16 Contribuer 647Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647Tickets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655Normes de codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657Guide de Compatibilit Rtroactive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668Le processus de dveloppement CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670

    17 Annexes 6732.10 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6732.9 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6742.8 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6752.7 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6762.6 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6782.5 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6812.4 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6862.3 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6912.2 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6972.1 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7022.0 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712Migration de la version 1.2 vers la 1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740Informations gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756

    18 Indices et tables 759

    Index 761

    iii

  • iv

  • CHAPITRE 1

    Pour Commencer

    Le framework CakePHP fournit une base robuste pour votre application. Il peut grer tous les aspects, de la requteinitiale de lutilisateur et son cheminement jusquau rendu final de la page web. Et puisque le framework suit lesprincipes du MVC, il vous permet de facilement personnaliser et offre la plupart des aspects de votre application.

    Le framework fournit aussi une structure organisationnelle basique, des noms de fichier jusquaux noms des tablesde la base de donnes, en gardant toute votre application cohrente et logique. Ce concept est simple mais puissant.Suivez les conventions et vous saurez toujours exactement o les choses se trouvent et comment elles sont organises.

    La meilleure faon de dcouvrir et dapprendre CakePHP est de sassoir et de construire quelque chose. Pour com-mencer, nous construirons une application simple de blog.

    Tutoriel dun Blog

    Bienvenue sur CakePHP. Vous consultez probablement ce tutoriel parce que vous voulez en apprendre plus propos dufonctionnement de CakePHP. Cest notre but damliorer la productivit et de rendre le dveloppement plus agrable :nous esprons que vous le dcouvrirez au fur et mesure que vous plongerez dans le code.

    Ce tutoriel vous accompagnera travers la cration dune simple application de blog. Nous rcuprerons et installeronsCakePHP, crerons et configurerons une base de donnes et ajouterons suffisamment de logique applicative pour lister,ajouter, diter et supprimer des posts.

    Voici ce dont vous aurez besoin :

    1. Un serveur web fonctionnel. Nous supposerons que vous utilisez Apache, bien que les instructions pour utiliserdautres serveurs doivent tre assez semblables. Nous aurons peut-tre besoin de jouer un peu sur la configu-ration du serveur, mais la plupart des personnes peuvent faire fonctionner CakePHP sans aucune configurationpralable.

    2. Un serveur de base de donnes. Dans ce tutoriel, nous utiliserons MySQL. Vous aurez besoin dun minimumde connaissance en SQL afin de crer une base de donnes : CakePHP prendra les rnes partir de l.

    3. Des connaissances de base en PHP. Plus vous aurez dexprience en programmation orient objet, mieux cesera ; mais nayez crainte, mme si vous tes adepte de la programmation procdurale.

    1

  • CakePHP Cookbook Documentation, Version 2.x

    4. Enfin, vous aurez besoin de connaissances de base propos du motif de conception MVC. Un bref aperu dece motif dans le chapitre Comprendre le systme M-V-C (Model-View-Controller). Ne vous inquitez pas : ilny a quune demi-page de lecture.

    Maintenant, lanons-nous !

    Obtenir CakePHP

    Tout dabord, rcuprons une copie rcente de CakePHP.

    Pour obtenir la dernire version, allez sur le site GitHub du projet CakePHP : https://github.com/cakephp/cakephp/tagset tlchargez la dernire version de la 2.0.

    Vous pouvez aussi cloner le dpt en utilisant git 4 :

    git clone -b 2.x git://github.com/cakephp/cakephp.git

    Peu importe comment vous lavez tlcharg, placez le code lintrieur du DocumentRoot de votre serveur. Unefois termin, votre rpertoire dinstallation devrait ressembler quelque chose comme cela :

    /chemin_du_document_root/app/lib/plugins/vendors.htaccessindex.phpREADME

    A prsent, il est peut-tre temps de voir un peu comment fonctionne la structure de fichiers de CakePHP : lisez lechapitre Structure du dossier de CakePHP.

    Permissions du rpertoire Tmp

    Ensuite vous devrez mettre le rpertoire app/tmp en criture pour le serveur web. La meilleur faon de le faire estde trouver sous quel utilisateur votre serveur web tourne. Vous pouver mettre lintrieur de tout fichier PHP que votre serveur web execute. Vous devriez voir afficher un nom dutilisateur.Changez le possesseur du rpertoire app/tmp pour cet utilisateur. La commande finale que vous pouvez lancer (dans*nix) pourrait ressembler ceci :

    $ chown -R www-data app/tmp

    Si pour une raison ou une autre, CakePHP ne peut crire dans ce rpertoire, vous verrez des avertissements et desexceptions attrapes vous disant que les donnes de cache nont pas pu tre crites.

    Crer la base de donnes du blog

    Maintenant, mettons en place la base de donnes pour notre blog. Si vous ne lavez pas dj fait, crez une base dedonnes vide avec le nom de votre choix pour lutiliser dans ce tutoriel. Pour le moment, nous allons juste crer unesimple table pour stocker nos posts. Nous allons galement insrer quelques posts des fins de tests. Excutez lesrequtes SQL suivantes dans votre base de donnes :

    http://git-scm.com/

    2 Chapitre 1. Pour Commencer

    https://github.com/cakephp/cakephp/tagshttp://git-scm.com/

  • CakePHP Cookbook Documentation, Version 2.x

    /* D'abord, crons la table des posts : */CREATE TABLE posts (

    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,title VARCHAR(50),body TEXT,created DATETIME DEFAULT NULL,modified DATETIME DEFAULT NULL

    );

    /* Puis insrons quelques posts pour les tests : */INSERT INTO posts (title, body, created)

    VALUES ('Le titre', 'Voici le contenu du post.', NOW());INSERT INTO posts (title, body, created)

    VALUES ('Encore un titre', 'Et le contenu du post qui suit.', NOW());INSERT INTO posts (title, body, created)

    VALUES ('Le retour du titre', 'C\'est trs excitant, non ?', NOW());

    Le choix des noms pour les tables et les colonnes ne sont pas arbitraires. Si vous respectez les conventions de nommagede CakePHP pour les bases de donnes et les classes (toutes deux expliques au chapitre Conventions de CakePHP),vous tirerez profit dun grand nombre de fonctionnalits automatiques et vous viterez des tapes de configurations.CakePHP est suffisamment souple pour implmenter les pires schmas de bases de donnes, mais respecter les conven-tions vous fera gagner du temps.

    Consultez le chapitre Conventions de CakePHP pour plus dinformations, mais il suffit de comprendre que nommernotre table posts permet de la relier automatiquement notre model Post, et quavoir des champs modified etcreated permet de les avoir grs automagiquement par CakePHP.

    Configurer la base de donnes CakePHP

    En avant : indiquons CakePHP o se trouve notre base de donnes et comment sy connecter. Pour la plupart dentrevous, cest la premire et dernire fois que vous configurerez quelque chose.

    Une copie du fichier de configuration CakePHP pour la base de donnes se trouve dans /app/Config/database.php.default. Faites une copie de ce fichier dans le mme rpertoire mais nommez le database.php.

    Le fichier de configuration devrait tre assez simple : remplacez simplement les valeurs du tableau $default parcelles qui correspondent votre installation. Un exemple de tableau de configuration complet pourrait ressembler cequi suit :

    public $default = array('datasource' => 'Database/Mysql','persistent' => false,'host' => 'localhost','port' => '','login' => 'cakeBlog','password' => 'c4k3-rUl3Z','database' => 'cake_blog_tutorial','schema' => '','prefix' => '','encoding' => 'utf8'

    );

    Une fois votre nouveau fichier database.php sauvegard, vous devriez tre en mesure douvrir votre navigateurinternet et de voir la page daccueil de CakePHP. Elle devrait galement vous indiquer que votre fichier de connexiona t trouv, et que CakePHP peut sy connecter avec succs.

    Tutoriel dun Blog 3

  • CakePHP Cookbook Documentation, Version 2.x

    Note : Rappelez-vous que vous aurez besoin davoir PDO, et pdo_mysql activs dans votre php.ini.

    Configuration facultative

    Il y a quelques autres lments qui peuvent tre configurs. La plupart des dveloppeurs configurent les lments decette petite liste, mais ils ne sont pas obligatoires pour ce tutoriel. Le premier consiste dfinir une chane de caractrespersonnalise (ou grain de sel ) afin de scuriser les hashs. Le second consiste dfinir un nombre personnalis (ou graine ) utiliser pour le chiffrage.

    Le grain de sel est utilis pour gnrer des hashes. Changez la valeur par dfaut de Security.salt dans /app/Config/core.php la ligne 187. La valeur de remplacement doit tre longue, difficile deviner et aussialatoire que possible :

    /*** Une chane alatoire utilise dans les mthodes de hachage scurises.

    */Configure::write('Security.salt', 'pl345e-P45s_7h3*S@l7!');

    La graine cipher est utilise pour le chiffrage/dchiffrage des chanes de caractres. Changez la valeur par dfaut deSecurity.cipherSeed dans /app/Config/core.php la ligne 192. La valeur de remplacement doit treun grand nombre entier alatoire :

    /*** Une chane alatoire de chiffre utilise pour le chiffrage/dchiffrage

    * des chanes de caractres.

    */Configure::write('Security.cipherSeed', '7485712659625147843639846751');

    Une note sur mod_rewrite

    Occasionnellement, les nouveaux utilisateurs peuvent avoir des problmes de mod_rewrite. Par exemple si la pagedaccueil de CakePHP a lair bizarre (pas dimages ou de styles CSS), cela signifie probablement que mod_rewritene fonctionne pas sur votre systme. Merci de vous rfrer la section suivante sur lURL rewriting pour que votreserveur web fonctionne :

    URL Rewriting

    Apache et mod_rewrite (et .htaccess)

    Alors que CakePHP est construit pour travailler avec mod_rewrite et habituellement il lest nous avons remarquque certains utilisateurs se battent pour obtenir un bon fonctionnement sur leurs systmes.

    Ici il y a quelques trucs que vous pourriez essayer pour que cela fonctionne correctement. Premirement, regardezvotre fichier httpd.conf (Assurez-vous que vous avez dit le httpd.conf du systme plutt que celui dun utilisateur-ou le httpd.conf dun site spcifique).

    Ces fichiers peuvent varier selon les diffrentes distributions et les versions dApache. Vous pouvez allez voir http://wiki.apache.org/httpd/DistrosDefaultLayout pour plus dinformations.

    1. Assurez-vous quun .htaccess est permis et que AllowOverride est dfini All pour le bon DocumentRoot.Vous devriez voir quelque chose comme :

    4 Chapitre 1. Pour Commencer

    http://wiki.apache.org/httpd/DistrosDefaultLayouthttp://wiki.apache.org/httpd/DistrosDefaultLayout

  • CakePHP Cookbook Documentation, Version 2.x

    # Chaque rpertoire auquel Apache a accs peut tre configur avec# respect pour lesquels les services et les fonctionnalits sont# autoriss et/ou dsactivs dans ce rpertoire (et ses sous-rpertoires).## Premirement, nous configurons "par dfault" pour tre un ensemble# trs restrictif de fonctionnalits.#

    Options FollowSymLinksAllowOverride All

    # Order deny,allow# Deny from all

    Pour les utilisateurs qui ont apache 2.4 et suprieur, vous devez modifier le fichier de configuration pour votrehttpd.conf ou la configuration de lhte virtuel pour ressembler ce qui suit :

    Options FollowSymLinksAllowOverride AllRequire all granted

    2. Assurez-vous que vous avez charg correctement mod_rewrite. Vous devriez voir quelque chose comme :

    LoadModule rewrite_module libexec/apache2/mod_rewrite.so

    Dans la plupart des systmes, ceux-ci vont tre comments donc vous aurez juste besoin de retirer les symboles# en dbut de ligne.Aprs que vous avez fait des changements, re-dmarrez Apache pour tre sr que les paramtres soient actifs.Vrifiez que vos fichiers .htaccess sont effectivement dans le bon rpertoire.Cela peut arriver pendant la copie parce que certains systmes dexploitation traitent les fichiers qui com-mencent par . en cach et du coup ne les voient pas pour les copier.

    3. Assurez-vous que votre copie de CakePHP vient de la section des tlchargements du site de notre dpt Git,et a t dzipp correctement en vrifiant les fichiers .htaccess.Le rpertoire root de CakePHP (a besoin dtre copi dans votre document, cela redirige tout vers votre appCakePHP) :

    RewriteEngine onRewriteRule ^$ app/webroot/ [L]

    RewriteRule (.*) app/webroot/$1 [L]

    Le rpertoire app de CakePHP (sera copi dans le rpertoire suprieur de votre application avec Bake) :

    RewriteEngine onRewriteRule ^$ webroot/ [L]

    RewriteRule (.*) webroot/$1 [L]

    Le rpertoire webroot de CakePHP (sera copi dans le webroot de votre application avec Bake) :

    RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-f

    Tutoriel dun Blog 5

  • CakePHP Cookbook Documentation, Version 2.x

    RewriteRule ^(.*)$ index.php/$1 [QSA,L]

    Si votre site CakePHP a toujours des problmes avec mod_rewrite, essayez de modifier les paramtres pourles Htes Virtuels. Si vous tes sur Ubuntu, modifiez le fichier /etc/apache2/sites-available/default (lendroitdpend de la distribution). Dans ce fichier, assurez-vous que AllowOverride None a t chang enAllowOverride All, donc vous devez avoir :

    Options FollowSymLinksAllowOverride All

    Options Indexes FollowSymLinks MultiViewsAllowOverride AllOrder Allow,DenyAllow from all

    Si vous tes sur Mac OSX, une autre solution est dutiliser loutil virtualhostx 5 pour faire un Hte Virtuel pourpointer vers votre dossier.Pour beaucoup de services dhbergement (GoDaddy, 1and1), votre serveur web est en fait dj distribu par-tir dun rpertoire utilisateur qui utilise dj mod_rewrite. Si vous installez CakePHP dans un rpertoire utili-sateur (http://exemple.com/~username/cakephp/), ou toute autre structure dURL qui utilise dj mod_rewrite,vous aurez besoin dajouter les requtes (statements) RewriteBase aux fichiers .htaccess que CakePHP utilise(/.htaccess, /app/.htaccess, /app/webroot/.htaccess).Ceci peut tre ajout dans la mme section que la directive RewriteEngine, donc par exemple, votre fichier.htaccess dans webroot ressemblerait ceci :

    RewriteEngine OnRewriteBase /path/to/cake/appRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php/$1 [QSA,L]

    Les dtails de ces changements dpendront de votre configuration, et pourront inclure des choses supplmen-taires qui ne sont pas lies CakePHP. Merci de vous renseigner sur la documentation en ligne dApache pourplus dinformations.

    4. (Optionel) Pour amliorer la configuration de production, vous devriez empcher les assets invalides dtreparss par CakePHP. Modifiez votre webroot .htaccess pour quelque chose comme :

    RewriteEngine OnRewriteBase /path/to/cake/appRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_URI} !^/(app/webroot/)?(img|css|js)/(.*)$

    RewriteRule ^(.*)$ index.php [QSA,L]

    Ce qui est au-dessus va simplement empcher les assets incorrects dtre envoys index.php et la placedafficher la page 404 de votre serveur web.De plus, vous pouvez crer une page HTML 404 correspondante, ou utiliser la page 404 de CakePHP intgreen ajoutant une directive ErrorDocument :

    http://clickontyler.com/virtualhostx/

    6 Chapitre 1. Pour Commencer

    http://clickontyler.com/virtualhostx/http://exemple.com/~username/cakephp/

  • CakePHP Cookbook Documentation, Version 2.x

    ErrorDocument 404 /404-not-found

    De belles URLs sur nginx

    nginx ne fait pas usage de fichiers .htaccess comme Apache et Lighttpd, il est donc ncessaire de crer les URLsrcrites disponibles dans la configuration du site. selon votre configuration, vous devrez modifier cela, mais tout lemoins, vous aurez besoin de PHP fonctionnant comme une instance FastCGI.

    server {listen 80;server_name www.example.com;rewrite ^(.*) http://example.com$1 permanent;

    }

    server {listen 80;server_name example.com;

    # root directive should be globalroot /var/www/example.com/public/app/webroot/;index index.php;

    access_log /var/www/example.com/log/access.log;error_log /var/www/example.com/log/error.log;

    location / {try_files $uri $uri/ /index.php?$args;

    }

    location ~ \.php$ {include /etc/nginx/fastcgi_params;try_files $uri =404;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    }}

    Si pour une raison exotique vous ne pouvez pas changer votre rpertoire racine et devez lancer votre projet partirdun sous-dossier comme example.com/subfolder/, vous devrez injecter /webroot dans chaque requte.

    location ~ ^/(subfolder)/(.*)? {index index.php;

    set $new_uri /$1/webroot/$2;

    try_files $new_uri $new_uri/ /$1/index.php?$args;

    ... php handling ...}

    Note : Les rcentes configurations de PHP-FPM sont dfinies pour couter sur le socket php-fpm au lieu du port TCP9000 sur ladresse 127.0.0.1. Si vous obtenez une erreur 502 de mauvaise passerelle avec la configuration du dessus,essayez de remplacer le port TCP du fastcgi_pass par le chemin du socket (ex : fastcgi_pass unix :/var/run/php5-

    Tutoriel dun Blog 7

  • CakePHP Cookbook Documentation, Version 2.x

    fpm.sock ;).

    Rewrites dURL sur IIS7 (serveurs Windows)

    IIS7 ne supporte pas nativement les fichiers .htaccess. Bien quil existe des add-ons qui peuvent ajouter ce support,vous pouvez aussi importer les rgles des .htaccess dans IIS pour utiliser les rewrites natifs de CakePHP. Pour ce faire,suivez ces tapes :

    1. Utilisez linstalleur de la plateforme Web de Microsoft 6 pour installer lURL Rewrite Module 2.0 7 ou tl-chargez le directement (32-bit 8 / 64-bit 9).

    2. Crez un nouveau fichier dans votre dossier CakePHP, appel web.config.

    3. Utilisez Notepad ou tout autre diteur XML-safe, copiez le code suivant dans votre nouveau fichierweb.config. . .

    Une fois que le fichier web.config est cr avec les bonnes rgles de rcriture des liens de IIS, les liens CakePHP, lesCSS, le JavaScript, et le reroutage devraient fonctionner correctement.

    http://www.microsoft.com/web/downloads/platform.aspxhttp://www.iis.net/downloads/microsoft/url-rewritehttp://www.microsoft.com/en-us/download/details.aspx?id=5747http://www.microsoft.com/en-us/download/details.aspx?id=7435

    8 Chapitre 1. Pour Commencer

    http://www.microsoft.com/web/downloads/platform.aspxhttp://www.iis.net/downloads/microsoft/url-rewritehttp://www.microsoft.com/en-us/download/details.aspx?id=5747http://www.microsoft.com/en-us/download/details.aspx?id=7435

  • CakePHP Cookbook Documentation, Version 2.x

    URL-Rewriting sur lighttpd

    Lighttpd ne supporte pas les fonctions .htaccess, par consquent vous pouvez retirer tous les fichiers .htaccess. Dansla configuration lighttpd, assurez-vous dactiver mod_rewrite . Ajoutez une ligne :

    url.rewrite-if-not-file =("^([^\?]*)(\?(.+))?$" => "/index.php?url=$1&$3"

    )

    Rgles de rewrite URL pour Hiawatha

    La rgle ncessaire UrlToolkit (pour le rewriting URL) pour utiliser CakePHP avec Hiawatha est :

    UrlToolkit {ToolkitID = cakephpRequestURI exists ReturnMatch .* Rewrite /index.php

    }

    Je ne veux / ne peux utiliser lURL rewriting

    Si vous ne voulez ou ne pouvez pas utiliser lURL rewriting sur votre serveur web, rfrez-vous la section coreconfiguration.

    Maintenant continuez sur Blog Tutoriel - Ajouter la logique pour commencer construire votre premire applicationCakePHP.

    Blog Tutoriel - Ajouter la logique

    Crer un model Post

    La classe Model est le pain quotidien des applications CakePHP. En crant un model CakePHP qui interagira avecnotre base de donnes, nous aurons mis en place les fondations ncessaires pour faire plus tard nos oprations delecture, dinsertion, ddition et de suppression.

    Les fichiers des classes Model de CakePHP se trouvent dans /app/Model, et le fichier que nous allons crer main-tenant sera enregistr dans /app/Model/Post.php. Le fichier complet devrait ressembler ceci :

    class Post extends AppModel {}

    La convention de nommage est vraiment trs importante dans CakePHP. En nommant notre model Post, CakePHPpeut automatiquement dduire que ce model sera utilis dans le controller PostsController, et sera li la table postsde la base de donnes.

    Note : CakePHP crera dynamiquement un objet model pour vous, sil ne trouve pas le fichier correspondant dans/app/Model. Cela veut aussi dire que si vous navez pas nomm correctement votre fichier (par ex. post.php ouposts.php au lieu de Post.php), CakePHP ne reconnatra pas votre configuration et utilisera ses objets model par dfaut.

    Blog Tutoriel - Ajouter la logique 9

  • CakePHP Cookbook Documentation, Version 2.x

    Pour plus dinformations sur les models, comme les prfixes des tables, les callbacks, et la validation, consultez lechapitre Models (Modles) du manuel.

    Crer un controller Posts

    Nous allons maintenant crer un controller pour nos posts. Le controller est lendroit o sexcutera toute la logiquemtier pour lintraction du processus de post. En un mot, cest lendroit o vous jouerez avec les models et o lestches lies aux posts sexcutent. Nous placerons ce nouveau controller dans un fichier appel PostsController.php lintrieur du dossier /app/Controller. Voici quoi devrait ressembler le controller de base :

    class PostsController extends AppController {public $helpers = array('Html', 'Form');

    }

    Maintenant, ajoutons une action notre controller. Les actions reprsentent souvent une simple fonction ou une in-terface dans une application. Par exemple, quand les utilisateurs requtent www.exemple.com/posts/index (qui est lamme chose que www.exemple.com/posts/), ils pourraient sattendre voir une liste de posts. Le code pour cetteaction devrait ressembler quelque chose comme a :

    class PostsController extends AppController {public $helpers = array('Html', 'Form');

    public function index() {$this->set('posts', $this->Post->find('all'));

    }}

    En dfinissant la fonction index() dans notre PostsController, les utilisateurs peuvent accder cette logique en de-mandant www.exemple.com/posts/index. De la mme faon, si nous devions dfinir une fonction appele foobar(),les utilisateurs pourrait y accder en demandant www.exemple.com/posts/foobar.

    Avertissement : Vous pourriez tre tent de nommer vos controllers et vos actions dune certaine manire pourobtenir une certaine URL. Rsistez cette tentation. Suivez les conventions CakePHP (le nom des controllers aupluriel, etc.) et nommez vos actions de faon lisible et comprhensible. Vous pouvez lier les URLs votre code enutilisant ce quon appelle des routes , on le verra plus tard.

    La seule instruction que cette action utilise est set(), pour transmettre les donnes du controller la vue (que nouscrerons la prochaine tape). La ligne dfinit la variable de vue appele posts qui est gale la valeur de retour dela mthode find('all') du model Post. Notre model Post est automatiquement disponible via $this->Post, parceque nous avons suivi les conventions de nommage de CakePHP.

    Pour en apprendre plus sur les controllers de CakePHP, consultez le chapitre Controllers (Contrleurs).

    Crer les Vues des Posts

    Maintenant que nous avons nos donnes en provenance du model, ainsi que la logique applicative et les flux dfinispar notre controller, nous allons crer une vue pour laction index que nous avons cr ci-dessus.

    Les vues de CakePHP sont juste des fragments de prsentation assaisonne , qui sintgrent au sein dun layoutapplicatif. Pour la plupart des applications, elles sont un mlange de HTML et PHP, mais les vues peuvent aussi treconstitues de XML, CSV ou mme de donnes binaires.

    Un Layout est un code de prsentation, encapsul autour dune vue. Ils peuvent tre dfinis et interchangs, mais pourle moment, utilisons juste celui par dfaut.

    10 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

    Vous souvenez-vous, dans la dernire section, comment nous avions assign la variable posts la vue en utilisant lamthode set() ? Cela devrait transmettre les donnes la vue qui ressemblerait quelque chose comme cela :

    // print_r($posts) affiche:

    Array(

    [0] => Array(

    [Post] => Array(

    [id] => 1[title] => Le titre[body] => Voici le contenu du post.[created] => 2008-02-13 18:34:55[modified] =>

    ))

    [1] => Array(

    [Post] => Array(

    [id] => 2[title] => Encore un titre[body] => Et le contenu du post qui suit.[created] => 2008-02-13 18:34:56[modified] =>

    ))

    [2] => Array(

    [Post] => Array(

    [id] => 3[title] => Le retour du titre[body] => C'est trs excitant, non ?[created] => 2008-02-13 18:34:57[modified] =>

    ))

    )

    Les fichiers des vues de CakePHP sont stocks dans /app/View lintrieur dun dossier dont le nom correspond celui du controller (nous aurons crer un dossier appel Posts dans ce cas). Pour mettre en forme les donnes deces posts dans un joli tableau, le code de notre vue devrait ressembler quelque chose comme cela

    Blog posts

    IdTitreCr le

    Blog Tutoriel - Ajouter la logique 11

  • CakePHP Cookbook Documentation, Version 2.x

    Vous avez sans doute remarqu lutilisation dun objet appel $this->Html. Cest une instance de la classe Cake-PHP HtmlHelper. CakePHP est livr avec un ensemble de helpers (des assistants) pour les vues, qui ralisent enun clin dil des choses comme le linking (mettre les liens dans un texte), laffichage des formulaires, du JavaS-cript et de lAJAX. Vous pouvez en apprendre plus sur la manire de les utiliser dans le chapitre Helpers (Assistants),mais ce quil est important de noter ici, cest que la mthode link() gnrera un lien HTML partir dun titre (lepremier paramtre) et dune URL (le second paramtre).

    Lorsque vous indiquez des URLs dans CakePHP, il est recommand dutiliser les tableaux. Ceci est expliqu dansle chapitre des Routes. Utiliser les tableaux dans les URLs vous permet de tirer profit des capacits de CakePHP r-inverser les routes. Vous pouvez aussi utiliser les URLs relatives depuis la base de lapplication comme suit/controller/action/param1/param2.

    A ce stade, vous devriez tre en mesure de pointer votre navigateur sur la page http://www.exemple.com/posts/index.Vous devriez voir votre vue, correctement formate avec le titre et le tableau listant les posts.

    Si vous avez essay de cliquer sur lun des liens que nous avons crs dans cette vue (le lien sur le titre dun postmne lURL : /posts/view/un_id_quelconque), vous avez srement t inform par CakePHP que laction na pasencore t dfinie. Si vous navez pas t inform, soit quelque chose sest mal pass, soit en fait vous aviez dj dfinilaction, auquel cas vous tes vraiment sournois ! Sinon, nous allons la crer sans plus tarder dans le Controller Posts :

    // File: /app/Controller/PostsController.phpclass PostsController extends AppController {

    public $helpers = array('Html', 'Form');

    public function index() {$this->set('posts', $this->Post->find('all'));

    }

    public function view($id = null) {if (!$id) {

    throw new NotFoundException(__('Invalid post'));}

    $post = $this->Post->findById($id);if (!$post) {

    throw new NotFoundException(__('Invalid post'));}$this->set('post', $post);

    }}

    Lappel de set() devrait vous tre familier. Notez que nous utilisons findById() plutt que find('all')parce que nous voulons seulement rcuprer les informations dun seul post.

    12 Chapitre 1. Pour Commencer

    http://www.exemple.com/posts/index

  • CakePHP Cookbook Documentation, Version 2.x

    Notez que notre action view prend un paramtre : lID du post que nous aimerions voir. Ce paramtre est transmis laction grce lURL demande. Si un utilisateur demande /posts/view/3, alors la valeur 3 est transmise lavariable $id.

    Nous faisons aussi une petite vrification derreurs pour nous assurer quun utilisateur accde bien lenregsitrement.Si un utilisateur requte /posts/view, nous lancerons un NotFoundException et laisserons le GestionnairedErreur de CakePHP ErrorHandler prendre le dessus. Nous excutons aussi une vrification similaire pour nousassurer que lutilisateur a accde un enregistrement qui existe.

    Maintenant, crons la vue pour notre nouvelle action view et plaons-la dans /app/View/Posts/view.ctp.

    Cr le :

    Vrifiez que cela fonctionne en testant les liens de la page /posts/index ou en affichant manuellement un post via/posts/view/1.

    Ajouter des Posts

    Lire depuis la base de donnes et nous afficher les posts est un bon dbut, mais lanons-nous dans lajout de nouveauxposts.

    Premirement, commenons par crer une action add() dans le PostsController :

    class PostsController extends AppController {public $helpers = array('Html', 'Form', 'Flash');public $components = array('Flash');

    public function index() {$this->set('posts', $this->Post->find('all'));

    }

    public function view($id) {if (!$id) {

    throw new NotFoundException(__('Invalid post'));}

    $post = $this->Post->findById($id);if (!$post) {

    throw new NotFoundException(__('Invalid post'));}$this->set('post', $post);

    }

    public function add() {if ($this->request->is('post')) {

    $this->Post->create();if ($this->Post->save($this->request->data)) {

    $this->Flash->success(__('Your post has been saved.'));return $this->redirect(array('action' => 'index'));

    }$this->Flash->error(__('Unable to add your post.'));

    }

    Blog Tutoriel - Ajouter la logique 13

  • CakePHP Cookbook Documentation, Version 2.x

    }}

    Note : $this->request->is() prend un unique argument, qui peut tre la METHOD request (get, put,post, delete) ou toute identifier de request (ajax). Ce nest pas une faon de vrifier une data poste spcifique.Par exemple, $this->request->is('book') ne retournera pas true si les data du book ont t postes.

    Note : Vous avez besoin dinclure le component Flash (FlashComponent) et le helper Flash (FlashHelper) dans chaquecontroller que vous utiliserez. Si ncessaire, incluez-les dans le controller principal (AppController) pour quils soientaccessibles tous les controllers.

    Voici ce que fait laction add() : si la requte HTTP est de type POST, essayez de sauvegarder les donnes enutilisant le model Post . Si pour une raison quelconque, la sauvegarde a choue, affichez simplement la vue. Celanous donne une chance de voir les erreurs de validation de lutilisateur et dautres avertissements.

    Chaque requte de CakePHP contient un objet CakeRequest qui est accessible en utilisant $this->request.Cet objet contient des informations utiles sur la requte qui vient dtre reue, et permet de contrler les flux de votreapplication. Dans ce cas, nous utilisons la mthode CakeRequest::is() pour vrifier que la requte est de typePOST.

    Lorsquun utilisateur utilise un formulaire pour poster des donnes dans votre application, ces informations sont dis-ponibles dans $this->request->data. Vous pouvez utiliser les fonctions pr() ou debug() pour les affichersi vous voulez voir quoi cela ressemble.

    Nous utilisons la mthode FlashComponent::success() du component Flash (FlashComponent) pour dfi-nir un message dans une variable session et qui sera affich dans la page juste aprs la redirection. Dans le layout,nous trouvons la fonction FlashHelper::render() qui permet dafficher et de nettoyer la variable correspon-dante. La mthode Controller::redirect du controller permet de rediriger vers une autre URL. Le paramtrearray('action' => 'index') sera traduit vers lURL /posts (dans notre cas laction index du controller Posts ). Vous pouvez vous rfrer la fonction Router::url() dans lAPI 10 pour voir les diffrents formatsdURL accepts dans les diffrentes fonctions de CakePHP.

    Lappel de la mthode save() vrifiera les erreurs de validation et interrompra lenregistrement si une erreur survient.Nous verrons la faon dont les erreurs sont traites dans les sections suivantes.

    Nous appelons la mthode create() en premier afin de rinitialiser ltat du model pour sauvegarder les nouvellesinformations. Cela ne cre pas rellement un enregistrement dans la base de donnes mais rinitialise Model : :$id etdfinit Model : :$data en se basant sur le champ par dfaut dans votre base de donnes.

    Valider les donnes

    Cake place la barre trs haute pour briser la monotonie de la validation des champs de formulaires. Tout le mondedteste le dvelopement de formulaires interminables et leurs routines de validations. Cake rend tout cela plus facileet plus rapide.

    Pour tirer profit des fonctionnalits de validation, vous devez utiliser le helper Form (FormHelper) dans vos vues.FormHelper est disponible par dfaut dans toutes les vues avec la variables $this->Form.

    Voici le code de notre vue add (ajout)

    https://api.cakephp.org

    14 Chapitre 1. Pour Commencer

    https://api.cakephp.org

  • CakePHP Cookbook Documentation, Version 2.x

    Ajouter un post

    Nous utilisons le FormHelper pour gnrer la balise douverture dune formulaire HTML. Voici le code HTMLgnr par $this->Form->create() :

    .. code-block:: html

    Si create() est appele sans aucun paramtre, CakePHP suppose que vous construisez un formulaire qui envoie lesdonnes en POST laction add() (ou edit() quand id est dans les donnes du formulaire) du controller actuel.

    La mthode $this->Form->input() est utilise pour crer des lments de formulaire du mme nom. Le premierparamtre dit CakePHP quels champs ils correspondent et le second paramtre vous permet de spcifier un largeventail doptions - dans ce cas, le nombre de lignes du textarea. Il y a un peu dintrospection et dautomagie ici :input() affichera diffrents lments de formulaire selon le champ spcifi du model.

    Lappel de la mthode $this->Form->end() gnre un bouton de soumission et ajoute la balise de fermeture duformulaire. Si une chane de caractres est passe comme premier paramtre de la mthode end(), le helper Form affichera un bouton de soumission dont le nom correspond celle-ci. Encore une fois, rfrez-vous au chapitre Helpers(Assistants) pour en savoir plus sur les helpers.

    A prsent, revenons en arrire et modifions notre vue /app/View/Posts/index.ctp pour ajouter un lien Ajouter un post . Ajoutez la ligne suivante avant :

    Vous vous demandez peut-tre : comment je fais pour indiquer CakePHP mes exigences de validation ? Les rglesde validation sont dfinies dans le model. Retournons donc notre model Post et procdons quelques ajustements :

    class Post extends AppModel {public $validate = array(

    'title' => array('rule' => 'notBlank'

    ),'body' => array(

    'rule' => 'notBlank')

    );}

    Le tableau $validate indique CakePHP comment valider vos donnes lorsque la mthode save() est appele.Ici, jai spcifi que les deux champs body et title ne doivent pas tre vides. Le moteur de validation de CakePHPest puissant, il dispose dun certain nombre de rgles intgres (code de carte bancaire, adresse emails, etc.) et dunesouplesse pour ajouter vos propres rgles de validation. Pour plus dinformations sur cette configuration, consultez lechapitre Validation des Donnes.

    Blog Tutoriel - Ajouter la logique 15

  • CakePHP Cookbook Documentation, Version 2.x

    Maintenant que vos rgles de validation sont en place, utilisez lapplication pour essayer dajouter un post avecun titre et un contenu vide afin de voir comment cela fonctionne. Puisque que nous avons utilis la mthodeFormHelper::input() du helper Form pour crer nos lments de formulaire, nos messages derreurs devalidation seront affichs automatiquement.

    Editer des Posts

    Ldition de posts : nous y voil. Vous tes un pro de CakePHP maintenant, vous devriez donc avoir adopt le prin-cipe. Crez dabord laction puis la vue. Voici quoi laction edit() du controller Posts (PostsController) devraitressembler :

    public function edit($id = null) {if (!$id) {

    throw new NotFoundException(__('Invalid post'));}

    $post = $this->Post->findById($id);if (!$post) {

    throw new NotFoundException(__('Invalid post'));}

    if ($this->request->is(array('post', 'put'))) {$this->Post->id = $id;if ($this->Post->save($this->request->data)) {

    $this->Flash->success(__('Your post has been updated.'));return $this->redirect(array('action' => 'index'));

    }$this->Flash->error(__('Unable to update your post.'));

    }

    if (!$this->request->data) {$this->request->data = $post;

    }}

    Cette action sassure dabord que lutilisateur a essay daccder un enregistrement existant. Sil ny a pas de pa-ramtre $id pass, ou si le post nexiste pas, nous lanons une NotFoundException pour que le gestionnairedErreurs ErrorHandler de CakePHP sen occupe.

    Ensuite laction vrifie si la requte est une requte POST ou PUT. Si elle lest, alors nous utilisons les donnes POSTpour mettre jour notre enregistrement Post, ou sortir et montrer les erreurs de validation lutilisateur.

    Sil ny a pas de donnes dfinies dans $this->request->data, nous le dfinissons simplement dans le postrcupr prcdemment.

    La vue ddition devrait ressembler quelque chose comme cela :

    Editer le post

    16 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

    Cette vue affiche le formulaire ddition (avec les donnes pr-remplies) avec les messages derreur de validationncessaires.

    Une chose noter ici : CakePHP supposera que vous ditez un model si le champ id est prsent dans le tableau dedonnes. Sil nest pas prsent (ce qui revient notre vue add ), CakePHP supposera que vous insrez un nouveaumodel lorsque save() sera appele.

    Vous pouvez maintenant mettre jour votre vue index avec des liens pour diter des posts :

    Blog posts

    IdTitleActionCreated

  • CakePHP Cookbook Documentation, Version 2.x

    if ($this->Post->delete($id)) {$this->Flash->success(

    __('Le post avec id : %s a t supprim.', h($id)));

    } else {$this->Flash->error(

    __('Le post avec l\'id: %s n\'a pas pu tre supprim.', h($id)));

    }

    return $this->redirect(array('action' => 'index'));}

    Cette logique supprime le Post spcifi par $id, et utilise $this->Flash->success() pour afficher lutilisateurun message de confirmation aprs lavoir redirig sur /posts. Si lutilisateur tente une suppression en utilisant unerequte GET, une exception est leve. Les exceptions manques sont captures par le gestionnaire dexceptions deCakePHP et un joli message derreur est affich. Il y a plusieurs Exceptions intgres qui peuvent tre utilises pourindiquer les diffrentes erreurs HTTP que votre application pourrait rencontrer.

    Etant donn que nous excutons juste un peu de logique et de redirection, cette action na pas de vue. Vous voudrezpeut-tre mettre jour votre vue index avec des liens pour permettre aux utilisateurs de supprimer des Posts, ainsi :

    Blog posts

    IdTitreActionsCr le

  • CakePHP Cookbook Documentation, Version 2.x

    ); ?>

    Utiliser postLink() permet de crer un lien qui utilise du Javascript pour supprimer notre post en faisant une requtePOST. Autoriser la suppression par une requte GET est dangereux cause des robots dindexation qui peuvent tousles supprimer.

    Note : Ce code utilise aussi le helper Form pour demander lutilisateur une confirmation avant de supprimer lepost.

    Routes

    Pour certains, le routage par dfaut de CakePHP fonctionne suffisamment bien. Les dveloppeurs qui sont sensibles la facilit dutilisation et la compatibilit avec les moteurs de recherches apprcieront la manire dont CakePHP liedes URLs des actions spcifiques. Nous allons donc faire une rapide modification des routes dans ce tutoriel.

    Pour plus dinformations sur les techniques de routages, consultez le chapitre Configuration des Routes.

    Par dfaut, CakePHP effectue une redirection dune personne visitant la racine de votre site (par ex : http://www.exemple.com) vers le controller Pages (PagesController) et affiche le rendu de la vue appele home . Au lieu decela, nous voudrions la remplacer avec notre controller Posts (PostsController).

    Le routage de CakePHP se trouve dans /app/Config/routes.php. Vous devrez commenter ou supprimer laligne qui dfinit la route par dfaut. Elle ressemble cela :

    Router::connect('/',array('controller' => 'pages', 'action' => 'display', 'home')

    );

    Cette ligne connecte lURL / la page daccueil par dfaut de CakePHP. Nous voulons que cette URL soit connecte notre propre controller, remplacez donc la ligne par celle-ci :

    Router::connect('/', array('controller' => 'posts', 'action' => 'index'));

    Cela devrait connecter les utilisateurs demandant / laction index() de notre controller Posts (PostsController).

    Note : CakePHP peut aussi faire du reverse routing (ou routage invers). Par exemple, pour la route dfinie plushaut, en ajoutant array('controller' => 'posts', 'action' => 'index') la fonction retournantun tableau, lURL / sera utilise. Il est dailleurs bien avis de toujours utiliser un tableau pour les URLs afin quevos routes dfinissent o vont les URLs, mais aussi pour sassurer quelles aillent dans la mme direction.

    Blog Tutoriel - Ajouter la logique 19

    http://www.exemple.comhttp://www.exemple.com

  • CakePHP Cookbook Documentation, Version 2.x

    Conclusion

    Crer des applications de cette manire vous apportera, paix, honneur, amour et argent au-del mme de vos fantasmesles plus fous. Simple nest ce pas ? Gardez lesprit que ce tutoriel tait trs basique. CakePHP a beaucoup plus defonctionnalits offrir et il est aussi souple dans dautres domaines que nous navons pas souhait couvrir ici poursimplifier les choses. Utilisez le reste de ce manuel comme un guide pour dvelopper des applications plus riches enfonctionnalits.

    Maintenant que vous avez cr une application CakePHP basique, vous tes prt pour les choses srieuses. Commencezvotre propre projet et lisez le reste du Cookbook et lAPI 11.

    Si vous avez besoin daide, il y a plusieurs faons dobtenir de laide - merci de regarder la page O obtenir de laideBienvenue sur CakePHP !

    Prochaines lectures suggres

    Voici les diffrents chapitres que les gens veulent souvent lire aprs :

    1. Layouts : Personnaliser les Layouts de votre application.

    2. Elements : Inclure et r-utiliser les portions de vues.

    3. Scaffolding : Construire une bauche dapplication sans avoir coder.

    4. Gnration de code avec Bake Gnrer un code CRUD basique.

    5. Authentification Simple et Autorisation de lApplication : Tutoriel sur lenregistrement et la connexion dutili-sateurs.

    Lectures supplmentaires

    Une requte CakePHP typique

    Nous avons dcouvert les ingrdients de bases de CakePHP, regardons maintenant comment chaque objet travailleavec les autres pour rpondre une requte simple. Poursuivons sur notre exemple original de requte, imaginons quenotre ami Ricardo vient de cliquer sur le lien Achetez un Cake personnalis maintenant ! sur la page daccueildune application CakePHP.

    Figure : 2. Typical CakePHP Request.

    Noir = lment obligatoire, Gris = lment optionnel, Bleu = rappel (callback)

    1. Ricardo clique sur le lien pointant vers http://www.exemple.com/cakes/buy et son navigateur envoie une re-qute au serveur Web.

    2. Le routeur analyse lURL afin dextraire les paramtres de cette requte : le controller, laction et tout argumentqui affectera la logique mtier pendant cette requte.

    3. En utilisant les routes, lURL dune requte est lie une action dun controller (une mthode dune classecontroller spcifique). Dans notre exemple, il sagit de la mthode buy() du Controller Cakes. La fonctionde rappel du controller, beforeFilter(), est appele avant que toute logique de laction du controller ne soitexcute.

    4. Le controller peut utiliser des models pour accder aux donnes de lapplication. Dans cet exemple, le control-ler utilise un model pour rcuprer les derniers achats de Ricardo depuis la base de donnes. Toute mthode derappel du model, tout behavior ou toute source de donnes peut sappliquer pendant cette opration. Bien quelutilisation du model ne soit pas obligatoire, tous les controllers CakePHP ncessitent au dpart, au moins unmodel.

    https://api.cakephp.org

    20 Chapitre 1. Pour Commencer

    https://api.cakephp.orghttp://www.exemple.com/cakes/buy

  • CakePHP Cookbook Documentation, Version 2.x

    Fig. 1.1 Diagramme reprsentant une requte CakePHP typique.

    Blog Tutoriel - Ajouter la logique 21

  • CakePHP Cookbook Documentation, Version 2.x

    5. Une fois que le model a rcupr les donnes, elles sont retournes au controller. Des fonctions de rappel dumodel peuvent sexcuter.

    6. Le controller peut faire usage de components pour affiner les donnes ou pour effectuer dautres oprations(manipulation de session, authentification ou envoi de mails par exemple).

    7. Une fois que le controller a utilis les models et components pour prparer suffisamment les donnes, cesdonnes sont passes la vue grce la mthode set(). Les mthodes de rappel (callbacks) du controllerpeuvent tre appliques avant lenvoi des donnes. La logique de la vue est excute, laquelle peut inclurelutilisation delements et/ou de helpers. Par dfaut, la vue est rendue travers un layout (mise en page).

    8. Dautres fonctions de rappel (callbacks) du controller (comme afterFilter) peuvent tre excutes. Lavue complte et finale est envoye au navigateur de Ricardo.

    Conventions de CakePHP

    Nous sommes de grands fans des conventions plutt que de la configuration. Bien que cela rclame un peu de tempspour apprendre les conventions de CakePHP, terme vous gagnerez du temps : en suivant les conventions, vous aurezdes fonctionnalits automatiques et vous vous librerez du cauchemar de la maintenance par lanalyse des fichiers deconfiguration. Les conventions sont aussi l pour crer un environnement de dveloppement uniforme, permettant dautres dveloppeurs de sinvestir dans le code plus facilement.

    Les conventions de CakePHP ont t cres partir de nombreuses annes dexprience dans le dveloppement Web etde bonnes pratiques. Alors que nous vous conseillons dutiliser ces conventions lors de vos dveloppements CakePHP,nous devons mentionner que la plupart de ces principes sont facilement contournables - ce qui est particulirementutile lorsque vous travaillez avec danciennes applications.

    Les conventions des Controllers

    Les noms des classes de controller sont au pluriel, CamelCased et se terminent par Controller.PeopleController et LatestArticlesController sont des exemples respectant cette convention.

    La premire mthode que vous crivez pour un controller devrait tre index(). Lorsquune requte pointe vers uncontroller sans action, le comportement par dfaut de CakePHP est dexcuter la fonction index() de ce controller.Ainsi, la requte http://www.exemple.com/apples/ renvoie la fonction index() de ApplesController, alorsque http://www.exemple.com/apples/view renvoie vers la fonction view() de ApplesController.

    Vous pouvez aussi changer la visibilit des mthodes des controllers dans CakePHP en prfixant les noms de mthodedes controllers avec des underscores. Si une mthode du controller a t prfixe avec un underscore, la mthode nesera pas accessible directement partir du web mais est disponible pour une utilisation interne. Par exemple :

    class NewsController extends AppController {

    public function latest() {$this->_findNewArticles();

    }

    protected function _findNewArticles() {// Logique pour trouver les derniers articles de nouvelles

    }}

    Alors que la page http://www.exemple.com/news/latest/ est accessible pour lutilisateur comme dhabitude, quelquunqui essaie daller sur la page http://www.example.com/news/_findNewArticles/ aura une erreur, car la mthode estprcde dun underscore. Vous pouvez aussi utiliser les mots-cls de visibilit de PHP pour indiquer si la mthodepeut ou non tre accessible partir dune URL. Les mthodes non-publiques ne sont pas accessibles.

    22 Chapitre 1. Pour Commencer

    http://www.exemple.com/apples/http://www.exemple.com/apples/viewhttp://www.exemple.com/news/latest/http://www.example.com/news/_findNewArticles/

  • CakePHP Cookbook Documentation, Version 2.x

    Considrations URL pour les noms de Controller

    Comme vous venez de voir, un controller mot unique renvoie facilement vers un chemin URL en minuscules. Parexemple, ApplesController (qui serait dfini dans le nom de fichier ApplesController.php) est accessible ladresse http://exemple.com/apples.

    Les controllers multiples mots peuvent tre de forme inflect qui correspondent au nom du controller : /redApples /RedApples /Red_apples /red_apples

    iront tous vers lindex du controller RedApples. Cependant, la convention est que vos URLs soient en minus-cules et avec des underscores, cest pourquoi /red_apples/go_pick est la forme correcte pour accder lactionRedApplesController::go_pick.

    Pour plus dinformations sur les URLs de CakePHP et la gestion des paramtres, allez voir Configuration des Routes.

    Conventions des Fichiers et des Noms de Classe

    En gnral, les noms de fichiers correspondent aux noms des classes cest--dire en CamelCase. Donc si vous avezune classe MaChouetteClasse, alors dans Cake, le fichier devra tre nomm MaChouetteClasse.php. Voici desexemples de la manire dont on nomme les fichiers, pour chacun des diffrents types de classes que vous utiliseriezhabituellement dans une application CakePHP :

    La classe controller BisousEtCalinsController devra se trouver dans un fichier nomm BisousEtCalinsCon-troller.php.

    La classe Component (Composant) MonSuperComponent devra se trouver dans un fichier nomm MonSu-perComponent.php.

    La classe Model ValeurOption devra se trouver dans un fichier nomm ValeurOption.php. La classe Behavior (Comportement) SpecialementFunkableBehavior devra se trouver dans un fichier nomm

    SpecialementFunkableBehavior.php. La classe View (Vue) SuperSimpleView devra se trouver dans un fichier nomm SuperSimpleView.ctp. La classe Helper (Assistant) LeMeilleurQuiSoitHelper devra se trouver dans un fichier nomm LeMeilleur-

    QuiSoitHelper.php.Chaque fichier sera situ dans le rpertoire appropri dans votre dossier app.

    Conventions pour les Models et les Sources de donnes

    Les noms de classe de model sont au singulier et en CamelCase. Person, BigPerson et ReallyBigPerson en sont desexemples.

    Les noms de tables correspondant aux models CakePHP sont au pluriel et utilisent le caractre soulign (underscore).Les tables correspondantes aux models mentionns ci-dessus seront donc respectivement : people, big_people,et really_big_people.

    Note des traducteurs francophones : seul le dernier mot est au pluriel et tous les pluriels franais ne seront pas comprispar CakePHP sans lui indiquer prcisment (par exemple cheval/chevaux). Voir pour cela le chapitre sur les inflexions.

    Pour vous assurer de la syntaxe des mots pluriels et singuliers, vous pouvez utiliser la bibliothque utilitaireInflector. Voir la documentation sur Inflector pour plus dinformations.

    Les noms des champs avec deux mots ou plus doivent tre avec des underscores comme ici : first_name.

    Les cls trangres des relations hasMany, belongsTo ou hasOne sont reconnues par dfaut grce au nom (singulier) dumodel associ, suivi de _id. Donc, si un Cuisinier hasMany Cake, la table cakes se rfrera un cuisinier de la table

    Blog Tutoriel - Ajouter la logique 23

    http://exemple.com/apples

  • CakePHP Cookbook Documentation, Version 2.x

    cuisiniers via une cl trangre cuisinier_id. Pour une table avec un nom de plusieurs mots comme type_categories ,la cl trangre sera type_categorie_id.

    Les tables de jointure utilises dans les relations hasAndBelongsToMany (HABTM) entre models doivent tre nom-mes daprs le nom des tables des models quelles unissent, par ex des users qui sont lis par une relation HABTMavec des groups seraient joints par une table groups_users et ces noms doivent tre dans lordre alphabtique( pommes_zebres plutt que zebres_pommes ).

    Toutes les tables avec lesquelles les models de CakePHP interagissent ( lexception des tables de jointure), ncessitentune cl primaire simple pour identifier chaque ligne de manire unique. Si vous souhaitez modliser une table qui napas de cl primaire sur un seul champ, la convention de CakePHP veut quune cl primaire sur un seul champ soitajoute la table.

    Si le nom de la cl primaire nest pas id, vous devez dfinir lattribut Model.primaryKey.

    CakePHP naccepte pas les cls primaires composes. Dans lventualit o vous voulez manipuler directement lesdonnes de votre table de jointure, cela veut dire que vous devez soit utiliser les appels directs query, soit ajouter unecl primaire pour tre en mesure dagir sur elle comme un model normal. Exemple :

    CREATE TABLE posts_tags (id INT(10) NOT NULL AUTO_INCREMENT,post_id INT(10) NOT NULL,tag_id INT(10) NOT NULL,PRIMARY KEY(id

    );

    Plutt que dutiliser une cl auto-incrmente comme cl primaire, vous pouvez aussi utiliser un champ char(36).CakePHP utilisera alors un UUID de 36 caractres (String : :uuid) lorsque vous sauvegardez un nouvel enregistrementen utilisant la mthode Model : :save.

    Conventions des vues

    Les fichiers de vue sont nomms daprs les fonctions du controller quelles affichent, sous une forme avecunderscores. La fonction soyezPret() de la classe PersonnesController cherchera un gabarit de vue dans :/app/View/Personnes/soyez_pret.ctp.

    Le schma classique est /app/View/Controller/nom_de_fonction_avec_underscore.ctp.

    En utilisant les conventions CakePHP dans le nommage des diffrentes parties de votre application, vous gagnerez desfonctionnalits sans les tracas et les affres de la configuration. Voici un exemple rcapitulant les conventions abordes :

    Nom de la table dans la base de donnes : personnes Classe du Model : Personne , se trouvant dans /app/Model/Personne.php Classe du Controller : PersonnesController , se trouvant dans /app/Controller/PersonnesController.php Template de Vue : se trouve dans /app/View/Personnes/index.ctp

    En utilisant ces conventions, CakePHP sait quune requte de type http://exemple.com/personnes/ sera lie un appel la fonction index() du Controller PersonnesController, dans lequel le model Personne est automatiquement disponible(et automatiquement li la table personnes dans la base) et rendue dans un fichier. Aucune de ces relations na tconfigure par rien dautre que la cration des classes et des fichiers dont vous aviez besoin de toute faon.

    Maintenant que vous avez t initi aux fondamentaux de CakePHP, vous devriez essayer de drouler le tutoriel duBlog CakePHP Tutoriel dun Blog pour voir comment les choses sarticulent.

    Structure du dossier de CakePHP

    Aprs avoir tlcharg et extrait CakePHP, voici les fichiers et rpertoires que vous devriez voir : app

    24 Chapitre 1. Pour Commencer

    http://exemple.com/personnes/

  • CakePHP Cookbook Documentation, Version 2.x

    lib vendors plugins .htaccess index.php README

    Vous remarquerez trois dossiers principaux : Le dossier app sera celui o vous exercerez votre magie : cest l que vous placerez les fichiers de votre

    application. Le dossier lib est lendroit o nous avons exerc notre propre magie. Engagez-vous personnellement ne

    pas modifier les fichiers dans ce dossier. Nous ne pourrons pas vous aider si vous avez modifi le cur duframework. A la place, regardez dans les Extensions de lApplication modifies.

    Enfin, le dossier vendors est lendroit o vous placerez vos librairies PHP tierces dont vous avez besoin pourvos applications CakePHP.

    Le dossier App

    Le rpertoire app de CakePHP est lendroit o vous raliserez la majorit du dveloppement de votre application.Regardons de plus prs les dossier lintrieur de app.

    Config Contient les (quelques) fichiers de configuration utiliss par CakePHP. Informations de connexion la basede donnes, dmarrage, fichiers de configuration de base et tous fichiers du mme genre doivent tre rangs ici.

    Console Contient les commandes de la console et les Tasks de la console pour votre application. Ce rpertoirepeut aussi contenir un rpertoire Templates pour personnaliser la sortie de bake. Pour plus dinformations,regardez Shells, Tasks & Outils de Console.

    Controller Contient vos Controllers et leurs Components.Lib Contient les librairies qui ne proviennent pas de librairies externes. Cela vous permet de sparer les librairies

    internes de votre organisme des librairies externes.

    Locale Stocke les fichiers pour linternationalisation.Model Pour les Models, Behaviors et Sources de Donnes de votre application.Plugin Contient les packages des Plugins.Test Ce rpertoire contient tous les cas de test, et les fixtures de test pour votre application. Le rpertoire Test/

    Case devra reflter votre application et contenir un ou plusieurs cas de test par classe dans votre application.Pour plus dinformations sur les cas de test et les fixtures de test, rfrez-vous la documentation Testing.

    tmp Cest ici que CakePHP enregistre les donnes temporaires. La manire dont sont stockes les donnes ac-tuelles dpend de la configuration que vous avez effectue, mais ce rpertoire est habituellement utilis pourdposer les descriptions de models, les logs et parfois les informations de session.Assurez-vous que ce dossier existe et quil est en criture, autrement la performance de votre application serasvrement impacte. En mode debug, CakePHP vous avertira si ce nest pas le cas.

    Vendor Toute classe ou librairie tierce doit tre mise ici, de sorte quil sera facile dy accder par la fonctionApp : :import(vendor,name). Les observateurs aviss noteront que cela semble redondant avec le rpertoirevendors la racine de larborescence. Nous aborderons les diffrences entre les deux lorsque nous discuteronsde la gestion multi-applications et des configurations systmes plus complexes.

    View Les fichiers de prsentation sont placs ici : lments, pages derreur, helpers, layouts et vues.webroot Dans un environnement de production, ce dossier doit tre la racine de votre application. Les sous-

    rpertoires sont utiliss pour les feuilles de style CSS, les images et les fichiers Javascript.

    Blog Tutoriel - Ajouter la logique 25

  • CakePHP Cookbook Documentation, Version 2.x

    Structure de CakePHP

    CakePHP dispose de classes de Controllers (Contrleurs), de Models (Modles), et de Views (Vues), mais il disposede classes et objets supplmentaires qui rendent le dveloppement en MVC plus rapide et amusant. Les Components(Composants), Behaviors (Comportements) et Helpers (Assistants) sont des classes qui offrent une extensibilit et unerutilisation, permettant dajouter rapidement des fonctionnalits aux classes MVC de base de vos applications. A cestade de lecture, nous survolerons ces concepts, mais vous pourrez dcouvrir comment utiliser ces outils en dtailsplus tard.

    Extensions de lApplication

    Controllers, Helpers et Models ont chacun une classe parente, que vous pouvez utiliser pour dfinir des modifi-cations impactant toute lapplication. AppController (disponible dans /app/Controller/AppController.php), AppHelper (disponible dans /app/View/Helper/AppHelper.php) et AppModel (disponible dans /app/Model/AppModel.php) sont de bons choix pour crire les mthodes que vous souhaitez partager entre tousvos controllers, helpers ou models.

    Bien quelles ne soient pas une classe ou un fichier, les Routes jouent un rle important dans les requtesfaites CakePHP. La dfinition des routes indique CakePHP comment lier les URLs aux actions des control-lers. Le comportement par dfaut suppose que lURL /controller/action/var1/var2 renvoie versController::action($var1, $var2) et son action action qui prend deux paramtres ($var1, $var2).Mais vous pouvez utiliser les routes pour personnaliser les URLs et la manire dont elles sont interprtes par votreapplication.

    Il peut tre judicieux de regrouper certaines fonctionnalits. Un Greffon ou Plugin est un ensemble de models, decontrollers et de vues qui accomplissent une tche spcifique pouvant stendre plusieurs applications. Un systmede gestion des utilisateurs ou un blog simplifi pourraient tre de bons exemples de plugins CakePHP.

    Extensions du Controller ( Components )

    Un Component (Composant) est une classe qui sintgre dans la logique du controller. Si vos controllers ou vosapplications doivent partager une logique, alors crer un Component est une bonne solution. A titre dexemple, laclasse intgre EmailComponent rend triviale la cration et lenvoi de courriels. Plutt que dcrire une mthode dansun seul controller qui effectue ce traitement, vous pouvez empaqueter ce code et ainsi le partager.

    Les controllers sont galement quips de fonctions de rappel (callbacks). Ces fonctions sont votre disposition au caso vous avez besoin dajouter du code entre les diffrentes oprations internes de CakePHP. Les callbacks disponiblessont :

    afterFilter(), excute aprs la logique du controller, y compris laffichage de la vue. beforeFilter(), excute avant toute action dun controller. beforeRender(), excute aprs toute action dun controller mais avant que la vue soit rendue.

    Extensions du Model ( Behaviors )

    De mme, les Behaviors fonctionnent comme des passerelles pour ajouter une fonctionnalit commune aux models.Par exemple, si vous stockez les donnes dun utilisateur dans une structure en arbre, vous pouvez spcifier que votremodel Utilisateur se comporte comme un arbre, et il acqurera automatiquement la capacit de suppression, dajout,et de dplacement des noeuds dans votre structure en arbre sous-jacente.

    Les models sont aussi soutenus par une autre classe nomme une DataSource (source de donnes). Il sagit dunecouche dabstraction qui permet aux models de manipuler diffrents types de donnes de manire cohrente. La plupartdu temps la source principale de donnes dans CakePHP est une base de donnes, vous pouvez cependant criredes Sources de Donnes supplmentaires pour reprsenter des flux RSS, des fichiers CSV, des entres LDAP ou des

    26 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

    vnements iCal. Les Sources de Donnes vous permettent dassocier des enregistrements issus de sources diffrentes :plutt que dtre limit des jointures SQL, les Sources de Donnes vous permettent de dire votre model LDAP quilest associ plusieurs vnements iCal.

    Tout comme les controllers, les models ont des callbacks : beforeFind() afterFind() beforeValidate() afterValidate() beforeSave() afterSave() beforeDelete() afterDelete()

    Les noms de ces mthodes devraient tre suffisamment explicites pour que vous compreniez leurs rles. Vous obtien-drez plus de dtails dans le chaptre sur les models.

    Extension de la Vue ( Helpers )

    Un Helper (Assistant) est une classe dassistance pour les vues. De mme que les components sont utiliss par plusieurscontrollers, les helpers permettent diffrentes vues daccder et de partager une mme logique de prsentation. Lundes helpers intgrs Cake, AjaxHelper, facilite les requtes AJAX dans les vues.

    La plupart des applications ont des portions de code pour les vues qui sont rptitives. CakePHP facilite la rutilisabilitde ce code grce aux Layouts (mises en pages) et aux Elements. Par dfaut, toutes les vues affiches par un controlleront le mme layout. Les elements sont utiliss lorsque de petites portions de contenu doivent apparatre dans plusieursvues.

    Blog Tutoriel - Ajouter la logique 27

  • CakePHP Cookbook Documentation, Version 2.x

    28 Chapitre 1. Pour Commencer

  • CHAPITRE 2

    Installation

    CakePHP est rapide et facile installer. Les conditions minimum requises sont un serveur web et une copie de Cake-PHP, cest tout ! Bien que ce manuel se focalise principalement sur la configuration avec Apache (parce que cest leplus utilis couramment), vous pouvez configurer CakePHP pour lancer une diversit de serveurs web tels que lighttpdou Microsoft IIS.

    Conditions requises

    HTTP Server. Par exemple : Apache. mod_rewrite est prfrable, mais en aucun cas ncessaire. PHP 5.3.0 ou suprieur (La version 2.6 de CakePHP et les versions infrieures supportent PHP 5.2.8 et sup-

    rieur). La version 2.8.0 de CakePHP et les versions suprieures supportent PHP 7. Pour utiliser une versionPHP suprieure 7.1, vous aurez sans doute besoin dinstaller mcrypt avec PECL. Consultez Security pourplus dinformations.

    Techniquement, un moteur de base de donnes nest pas ncessaire, mais nous imaginons que la plupart des applica-tions vont en utiliser un. CakePHP supporte une diversit de moteurs de stockage de donnes :

    MySQL (4 ou plus) PostgreSQL Microsoft SQL Server SQLite

    Note : Tous les drivers intgrs requirent PDO. Vous devez vous assurer que vous avez les bonnes extensions PDOinstalles.

    29

  • CakePHP Cookbook Documentation, Version 2.x

    Licence

    CakePHP est licenci sous la licence MIT. Cela signifie que vous tes libre de modifier, distribuer et reproduire lecode source sous la condition que les informations de copyright restent intactes. Vous tes aussi libres dincorporerCakePHP dans toute code source dapplication commerciale ou ferme.

    Tlcharger CakePHP

    Il y a deux faons dobtenir une copie rcente de CakePHP. Vous pouvez soit tlcharger une copie archive de(zip/tar.gz/tar.bz2) partir du site web principal, soit faire un check out du code sur dpt de git.

    Pour tlcharger la dernire version majeure de CakePHP, visitez le site web principal https://cakephp.org et suivez lelien Tlcharger maintenant .

    Toutes les versions actuelles de CakePHP sont hberges sur Github 12. Github hberge CakePHP lui-mme ainsi queplusieurs autres plugins pour CakePHP. Les versions de CakePHP sont disponibles sur Tlchargements Github 13.

    Sinon, vous pouvez obtenir du code frais avec tous les correctifs de bug et jour des amliorations de dernire minute.Celui-ci peut tre accessible partir de GitHub en clonant le rpertoire de Github 14

    git clone -b 2.x git://github.com/cakephp/cakephp.git

    Permissions

    CakePHP utilise le rpertoire app/tmp pour un certain nombre doprations. Les descriptions de Model, les vuesmises en cache, et les informations de session en sont juste quelques exemples.

    De mme, assurez-vous que le rpertoire app/tmp et tous ses sous-rpertoires dans votre installation cake sont encriture pour lutilisateur du serveur web.

    Un problme habituel est que les rpertoires app/tmp et les sous-rpertoires doivent tre accessible en criture la foispour le serveur web et et pour lutilisateur des lignes de commande. Sur un systme UNIX, si votre serveur web estdiffrent partir de lutilisateur en ligne de commande, vous pouvez lancer les commandes suivantes juste une foisdans votre projet pour vous assurer que les permissions sont bien configures :

    HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -vroot | head -1 | cut -d\ -f1`setfacl -R -m u:${HTTPDUSER}:rwx app/tmp

    setfacl -R -d -m u:${HTTPDUSER}:rwx app/tmp

    Configuration

    Configurer CakePHP est aussi simple que de le flanquer dans le document root de votre serveur web, ou aussi com-plexe et flexible que vous le souhaitez. Cette section couvrira les trois types principaux dinstallation de CakePHP :dveloppement, production, et avanc.

    Dveloppement : Facile mettre en oeuvre, mais les URLs de lapplication contiennent le nom du rpertoiredinstallation de CakePHP et cest moins scuris.

    https://github.com/cakephp/cakephphttps://github.com/cakephp/cakephp/tagshttps://github.com/cakephp/cakephp

    30 Chapitre 2. Installation

    https://cakephp.orghttps://github.com/cakephp/cakephphttps://github.com/cakephp/cakephp/tagshttps://github.com/cakephp/cakephp

  • CakePHP Cookbook Documentation, Version 2.x

    Production : Ncessite dtre habilit configurer le Document Root du serveur, URLs propres, trs scuris. Avanc : Avec un peu de configuration, vous permet de placer les rpertoires cls de CakePHP diffrents en-

    droits du systme de fichiers, avec la possibilit de partager un seul rpertoire de la librairie centrale CakePHPentre plusieurs applications.

    Dveloppement

    Une installation dveloppement est la mthode la plus rapide pour lancer CakePHP. Cet exemple vous aidera installer une application CakePHP et la rendre disponible ladresse http://www.example.com/cake_2_0/. Nousconsidrons pour les besoins de cet exemple que votre document root pointe sur /var/www/html.

    Dcompressez le contenu de larchive CakePHP dans /var/www/html. Vous avez maintenant un dossier dansvotre document root, nomm daprs la version que vous avez tlcharge (par exemple : cake_2.0.0). Renommez cedossier en cake_2_0 . Votre installation dveloppement devrait ressembler quelque chose comme cela dansvotre systme de fichiers :

    /var/www/html/cake_2_0/

    app/lib/plugins/vendors/.htaccessindex.phpREADME

    Si votre serveur web est configur correctement, vous devriez trouver maintenant votre application CakePHP acces-sible ladresse http://www.exemple.com/cake_2_0/.

    Utiliser un CakePHP pour de multiples applications

    Si vous dveloppez un certain nombre dapplications il peut sembler tre sens de partager le mme coeur de CakePHP.Il y a peu de faon daccomplir cela. Souvent, le plus facile est dutiliser le include_path de PHP. Pour commencer,copiez CakePHP dans un rpertoire. Pour cet exemple, nous utiliserons /home/mark/projects :

    git clone -b 2.x git://github.com/cakephp/cakephp.git /home/mark/projects/cakephp

    Cela copiera CakePHP dans votre rpertoire /home/mark/projects. Si vous ne voulez pas utiliser git, vouspouvez tlcharger un zipball et les tapes restantes seront les mmes. Ensuite, vous devrez localiser et modifiervotre php.ini. Sur les systmes *nix, il se trouve souvent dans /etc/php.ini, mais en utilisant php -i eten regardant Loaded Configuration File (Fichier de Configuration Charg). Une fois que vous avez trouv le bonfichier ini, modifier la configuration de include_path pour inclure /home/mark/projects/cakephp/lib.Un exemple ressemblerait cela :

    include_path = .:/home/mark/projects/cakephp/lib:/usr/local/php/lib/php

    Aprs avoir redmarr votre serveur web, vous devriez voir les changements dans phpinfo().

    Note : Si vous tes sur Windows, les chemins dinclusion sont spars par des ; au lieu de :

    Une fois que vous avez configur votre include_path, vos applications devraient tre capable de trouver automa-tiquement CakePHP.

    Dveloppement 31

    http://www.example.com/cake_2_0/http://www.exemple.com/cake_2_0/

  • CakePHP Cookbook Documentation, Version 2.x

    Production

    Une installation production est une faon plus flexible de lancer CakePHP. Utiliser cette mthode permet toutun domaine dagir comme une seule application CakePHP. Cet exemple vous aidera installer CakePHP nimporteo dans votre systme de fichiers et le rendre disponible ladresse : http://www.exemple.com. Notez que cetteinstallation demande davoir les droits pour modifier le DocumentRoot sur le serveur web Apache.

    Dcompressez les contenus de larchive CakePHP dans un rpertoire de votre choix. Pour les besoins de cet exemple,nous considrons que vous avez choisi dinstaller CakePHP dans /cake_install. Votre installation de production devraitressembler quelque chose comme ceci dans votre systme de fichiers :

    /cake_install/app/

    webroot/ (ce rpertoire est dfini comme rpertoire``DocumentRoot``)

    lib/plugins/vendors/.htaccessindex.phpREADME

    Les dveloppeurs utilisant Apache devraient rgler la directive DocumentRoot pour le domaine :

    DocumentRoot /cake_install/app/webroot

    Si votre serveur web est configur correctement, vous devriez maintenant accder votre application CakePHP acces-sible ladresse : http://www.exemple.com.

    Installation avance et URL Rewriting

    Installation avance

    Installer CakePHP avec linstalleur PEAR

    CakePHP publie un package PEAR que vous pouvez installer en utilisant linstallateur PEAR. Linstallation aveclinstallateur PEAR peut simplifier le partage des librairies de CakePHP dans plusieurs applications. Pour installerCakePHP avec PEAR, vous devrez faire comme suit :

    pear channel-discover pear.cakephp.orgpear install cakephp/CakePHP

    Note : Sur certains systmes, linstallation de librairies avec PEAR ncessitera la commande sudo.

    Aprs avoir install CakePHP avec PEAR, si PEAR est configur correctement, vous devriez pouvoir utiliser la com-mande cake pour crer une nouvelle application. Puisque CakePHP sera localis dans linclude_path de PHP,vous naurez pas besoin de faire dautres changements.

    Installer CakePHP avec Composer

    Avant de commencer, vous devez vous assurer que vous avez une version de PHP mise jour :

    32 Chapitre 2. Installation

    http://www.exemple.comhttp://www.exemple.com

  • CakePHP Cookbook Documentation, Version 2.x

    php -v

    Vous devez avoir au moins PHP 5.3.0 (CLI) ou suprieur. La version de PHP du serveur web doit tre la version 5.3.0ou suprieur, et doit tre la mme version que la version de PHP de votre ligne de commande (CLI).

    Installer Composer

    Composer est un outil de gestion de dpendances pour PHP 5.3+. Il rgle plusieurs problmes que linstallateur PEARa, et simplifie la gestion de plusieurs versions de librairies. Packagist 15 est le dpt principal des packages installablesavec Composer. Puisque CakePHP publie aussi les versions dans Packagist, vous pouvez installer CakePHP en utilisantComposer 16.

    Installer Composer sur Linux et Mac OS X

    1. Excutez le script dinstallation comme dcrit dans la documentation officielle de Composer 17 et suivezles instructions pour installer Composer.

    2. Excutez la commande suivante pour dplacer composer.phar vers un rpertoire qui est dans votre path :

    mv composer.phar /usr/local/bin/composer

    Installer Composer sur WindowsPour les systmes Windows, vous pouvez tlcharger linstalleur Windows de Composer ici 18. Dautres ins-tructions pour linstalleur Windows de Composer se trouvent dans le README 19.

    Crer un Projet CakePHP

    Avant dinstaller CakePHP, vous devrez configurer un fichier composer.json. Un fichier composer.json pour uneapplication CakePHP ressemblerait ce qui suit :

    {"name": "example-app","require": {

    "cakephp/cakephp": "2.10.*"},"config": {

    "vendor-dir": "Vendor/"}

    }

    Sauvegardez ce JSON dans composer.json dans le rpertoire APP de votre projet. Ensuite, tlchargez le fichiercomposer.phar dans votre projet. Aprs avoir tlcharg composer, installez CakePHP. Dans le mme rpertoire quevotre fichier composer.json, lancez ce qui suit :

    $ php composer.phar install

    Une fois que Composer a termin son excution, vous devriez avoir une structure de rpertoire qui ressemble :

    example-app/composer.pharcomposer.json

    https://packagist.org/http://getcomposer.orghttps://getcomposer.org/download/https://github.com/composer/windows-setup/releases/https://github.com/composer/windows-setup

    Installation avance et URL Rewriting 33

    https://packagist.org/http://getcomposer.orghttps://getcomposer.org/download/https://github.com/composer/windows-setup/releases/https://github.com/composer/windows-setup

  • CakePHP Cookbook Documentation, Version 2.x

    Vendor/bin/autoload.phpcomposer/cakephp/

    Vous tes maintenant prt gnrer le reste du squelette de votre application :

    $ Vendor/bin/cake bake project

    Par dfaut bake va mettre en dur CAKE_CORE_INCLUDE_PATH . Pour rendre votre application plus portable, vousdevrez modifier webroot/index.php, en changeant CAKE_CORE_INCLUDE_PATH en un chemin relatif :

    define('CAKE_CORE_INCLUDE_PATH',APP . '/Vendor/cakephp/cakephp/lib'

    );

    Note : Si vous pensez crer des tests unitaires pour votre application, vous devrez aussi faire les changements ci-dessusdans webroot/test.php.

    Si vous installez dautres librairies avec Composer, vous devrez configurer lautoloader et rgler un problme danslautoloader de Composer. Dans votre fichier Config/bootstrap.php, ajoutez ce qui suit :

    // Charger l'autoload de Composer.require APP . 'Vendor/autoload.php';

    // Retire et rajoute l'autoloader de CakePHP puisque Composer pense que// c'est le plus important.// See http://goo.gl/kKVJO7spl_autoload_unregister(array('App', 'load'));spl_autoload_register(array('App', 'load'), true, true);

    Vous devriez maintenant avoir une application CakePHP fonctionnelle avec CakePHP install via Composer. Assurez-vous de garder les fichiers composer.json et composer.lock.json avec le reste de votre code source.

    Partager les librairies de CakePHP pour plusieurs applications

    Il peut y avoir des situations o vous voulez placer les rpertoires de CakePHP diffrents endroits du systme defichiers. Cela est peut tre d des restrictions de lhte partag, ou peut-tre souhaitez-vous juste que quelques-unesde vos apps puissent partager les mmes librairies de CakePHP. Cette section dcrit comment dployer vos rpertoiresde CakePHP travers le systme de fichiers.

    Premirement, ralisez quil