1113
CakePHP Cookbook Documentation Version 2.x Cake Software Foundation 13 April 2015

CakePHP Cookbook Documentation - facepress.netfacepress.net/pdf/628.pdf · CakePHP est suffisamment souple pour implémenter les pires schémas de bases de données, mais respecter

Embed Size (px)

Citation preview

  • CakePHP Cookbook DocumentationVersion 2.x

    Cake Software Foundation

    13 April 2015

  • Table des matires

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

    2 Installation 31Conditions requises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Licence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Tlcharger CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Dveloppement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Production . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34Installation avance et URL Rewriting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34A vous de jouer ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

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

    4 Controllers (Contrleurs) 49Le Controller App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49Les paramtres de requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50Les Actions du Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50Request Life-cycle callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52Les Mthodes du Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52Les attributs du Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60En savoir plus sur les controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    5 Views (Vues) 85

    i

  • Templates de Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Utiliser les Blocs de Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92Crer vos propres classes de vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95API de View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95En savoir plus sur les vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

    6 Models (Modles) 201Comprendre les Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201Pour en savoir plus sur les Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

    7 Librairies du Coeur 337Usage Gnral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337Behaviors (Comportements) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493Components (Composants) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520Helpers (Assistants) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573Utilitaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666

    8 Plugins 783Comment Installer des Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783Comment Utiliser des Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785Comment Crer des Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787

    9 Console et Shells 793La console de CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793Crer un Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795Les tches Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797Invoquer dautres shells partir de votre shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798Niveaux de sortie de la Console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798Style de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799Configurer les options et gnrer de laide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800Routing dans shells / CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807API de Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808Plus de sujets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811

    10 Dveloppement 831Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869Gestion des Erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906Filtres du Dispatcher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910

    11 Dploiement 915Vrifier votre scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915

    ii

  • Dfinir le document root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915Mise jour de core.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915Amliorer les performances de votre application . . . . . . . . . . . . . . . . . . . . . . . . . . . 916

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

    13 Application Simple contrle par Acl 925Prparer notre Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925Prparer lajout dAuth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 927Initialiser les tables Acl dans la BdD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 929Agir comme un requteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 929Crer les ACOs (Access Control Objects) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 931

    14 Application Simple contrle par Acl - partie 2 933Un outil automatique pour la cration des ACOs . . . . . . . . . . . . . . . . . . . . . . . . . . . 933Configurer les permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934Connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935Dconnexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 936Cest fini ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 936

    15 Tutoriels et exemples 937Tutoriel dun Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937Blog Tutoriel - Ajouter la logique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945Authentification Simple et Autorisation de lApplication . . . . . . . . . . . . . . . . . . . . . . 958Application Simple contrle par Acl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 965Application Simple contrle par Acl - partie 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 972

    16 Contribuer 977Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 977Tickets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 985Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986Normes de codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 988Guide de Compatibilit Rtroactive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999Le processus de dveloppement CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002

    17 Annexes 10052.5 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10052.5 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10082.4 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10132.3 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10192.2 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10262.1 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10322.0 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043Migration de la version 1.2 vers la 1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1075Informations gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093

    iii

  • 18 Indices et tables 1095

    Index 1097

    iv

  • CHAPITRE 1

    Pour Commencer

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

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

    La meilleure faon de dcouvrir et dapprendre CakePHP est de sassoir et de construire quelque chose.Pour commencer, 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 du fonctionnement de CakePHP. Cest notre but damliorer la productivit et de rendre le dveloppe-ment plus agrable : nous esprons que vous le dcouvrirez au fur et mesure que vous plongerez dans lecode.

    Ce tutoriel vous accompagnera travers la cration dune simple application de blog. Nous rcuprerons etinstallerons CakePHP, crerons et configurerons une base de donnes et ajouterons suffisamment de logiqueapplicative 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 instructionspour utiliser dautres serveurs doivent tre assez semblables. Nous aurons peut-tre besoin de jouer unpeu sur la configuration du serveur, mais la plupart des personnes peuvent faire fonctionner CakePHPsans aucune configuration pralable.

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

    1

  • CakePHP Cookbook Documentation, Version 2.x

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

    4. Enfin, vous aurez besoin de connaissances de base propos du motif de conception MVC. Un brefaperu de ce motif dans le chapitre Comprendre le systme M-V-C (Model-View-Controller). Ne vousinquitez pas : il ny 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/tags et tlchargez la dernire version de la 2.0.

    Vous pouvez aussi cloner le dpt en utilisant git 1. git clonegit://github.com/cakephp/cakephp.git

    Peu importe comment vous lavez tlcharg, placez le code lintrieur du DocumentRoot de votreserveur. Une fois 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 le chapitre 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 dele faire est de trouver sous quel utilisateur votre serveur web tourne. Vous pouver mettre lintrieur de tout fichier PHP que votre serveur web execute. Vous devriezvoir afficher un nom dutilisateur. Changez le possesseur du rpertoire app/tmp pour cet utilisateur. Lacommande 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 avertissementset des exceptions attrapes vous disant que les donnes de cache nont pas pu tre crites.

    1. http ://git-scm.com/

    2 Chapitre 1. Pour Commencer

    https://github.com/cakephp/cakephp/tagshttp://git-scm.com/
  • CakePHP Cookbook Documentation, Version 2.x

    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 unebase de donnes vide avec le nom de votre choix pour lutiliser dans ce tutoriel. Pour le moment, nous allonsjuste crer une simple table pour stocker nos posts. Nous allons galement insrer quelques posts des finsde tests. Excutez les requtes SQL suivantes dans votre base de donnes :

    /* 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 conventionsde nommage de CakePHP pour les bases de donnes et les classes (toutes deux expliques au chapitreConventions de CakePHP), vous tirerez profit dun grand nombre de fonctionnalits automatiques et vousviterez des tapes de configurations. CakePHP est suffisamment souple pour implmenter les pires schmasde bases de donnes, mais respecter les conventions vous fera gagner du temps.

    Consultez le chapitre Conventions de CakePHP pour plus dinformations, mais il suffit de comprendre quenommer notre table posts permet de la relier automatiquement notre model Post, et quavoir des champsmodified et created 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 laplupart dentre vous, 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 maisnommez le database.php.

    Le fichier de configuration devrait tre assez simple : remplacez simplement les valeurs du tableau$default par celles qui correspondent votre installation. Un exemple de tableau de configuration com-plet pourrait ressembler ce qui suit :

    public $default = array('datasource' => 'Database/Mysql','persistent' => false,'host' => 'localhost',

    Tutoriel dun Blog 3

  • CakePHP Cookbook Documentation, Version 2.x

    '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 votrenavigateur internet et de voir la page daccueil de CakePHP. Elle devrait galement vous indiquer que votrefichier de connexion a t trouv, et que CakePHP peut sy connecter avec succs.

    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 leslments de cette petite liste, mais ils ne sont pas obligatoires pour ce tutoriel. Le premier consiste dfinirune chane de caractres personnalise (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.saltdans /app/Config/core.php la ligne 187. La valeur de remplacement doit tre longue, difficile deviner et aussi alatoire 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 valeurpar dfaut de Security.cipherSeed dans /app/Config/core.php la ligne 192. La valeur deremplacement doit tre un 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 sila page daccueil de CakePHP a lair bizarre (pas dimages ou de styles CSS), cela signifie probablementque mod_rewrite ne fonctionne pas sur votre systme. Merci de vous rfrer la section suivante sur lURLrewriting pour que votre serveur web fonctionne :

    4 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

    URL Rewriting

    Apache et mod_rewrite (et .htaccess)

    Alors que CakePHP est construit pour travailler avec mod_rewrite et habituellement il lest nous avonsremarqu que 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,regardez votre fichier httpd.conf (Assurez-vous que vous avez dit le httpd.conf du systme plutt que celuidun utilisateur- ou le httpd.conf dun site spcifique).

    Ces fichiers peuvent varier selon les diffrentes distributions et les versions dApache. Vous pouvez allezvoir 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 Documen-tRoot. Vous devriez voir quelque chose comme :

    # 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

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

    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 lessymboles # en dbut de ligne.Aprs que vous avez fait des changements, re-dmarrez Apache pour tre sr que les paramtres soientactifs.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 quicommencent 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 notredpt 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 versvotre app CakePHP) :

    RewriteEngine onRewriteRule ^$ app/webroot/ [L]

    Tutoriel dun Blog 5

    http://wiki.apache.org/httpd/DistrosDefaultLayout
  • CakePHP Cookbook Documentation, Version 2.x

    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} !-fRewriteRule ^(.*)$ index.php/$1 [QSA,L]

    Si votre site CakePHP a toujours des problmes avec mod_rewrite, essayez de modifier lesparamtres pour les Htes Virtuels. Si vous tes sur Ubuntu, modifiez le fichier /etc/apache2/sites-available/default (lendroit dpend de la distribution). Dans ce fichier, assurez-vous queAllowOverride None a t chang en AllowOverride 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 2 pour faire un HteVirtuel pour pointer vers votre dossier.Pour beaucoup de services dhbergement (GoDaddy, 1and1), votre serveur web est en fait dj dis-tribu partir dun rpertoire utilisateur qui utilise dj mod_rewrite. Si vous installez CakePHP dansun rpertoire utilisateur (http ://exemple.com/~username/cakephp/), ou toute autre structure dURLqui utilise dj mod_rewrite, vous aurez besoin dajouter les requtes (statements) RewriteBase auxfichiers .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, votrefichier .htaccess dans webroot ressemblerait ceci :

    RewriteEngine OnRewriteBase /path/to/cake/appRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-f

    2. http ://clickontyler.com/virtualhostx/

    6 Chapitre 1. Pour Commencer

    http://clickontyler.com/virtualhostx/http://exemple.com/~username/cakephp/
  • CakePHP Cookbook Documentation, Version 2.x

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

    Les dtails de ces changements dpendront de votre configuration, et pourront inclure des chosessupplmentaires qui ne sont pas lies CakePHP. Merci de vous renseigner sur la documentation enligne dApache pour plus dinformations.

    4. (Optionel) Pour amliorer la configuration de production, vous devriez empcher les assets invalidesdtre parss 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 laplace dafficher la page 404 de votre serveur web.De plus, vous pouvez crer une page HTML 404 correspondante, ou utiliser la page 404 de CakePHPintgre en ajoutant une directive ErrorDocument :

    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 lesURLs rcrites disponibles dans la configuration du site. selon votre configuration, vous devrez modifiercela, mais tout le moins, 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;

    }

    Tutoriel dun Blog 7

  • CakePHP Cookbook Documentation, Version 2.x

    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;

    }}

    Rewrites dURL sur IIS7 (serveurs Windows)

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

    1. Utilisez linstalleur de la plateforme Web de Microsoft 3 pour installer lURL Rewrite Module 2.0 4

    ou tlchargez le directement (32-bit 5 / 64-bit 6).

    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...

  • CakePHP Cookbook Documentation, Version 2.x

    appendQueryString="true" />

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

    URL-Rewriting sur lighttpd

    Lighttpd ne supporte pas les fonctions .htaccess, par consquent vous pouvez retirer tous les fichiers .htac-cess. Dans la 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 sectioncore configuration.

    Maintenant continuez sur Blog Tutoriel - Ajouter la logique pour commencer construire votre premireapplication CakePHP.

    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 interagiraavec notre base de donnes, nous aurons mis en place les fondations ncessaires pour faire plus tard nosoprations de lecture, dinsertion, ddition et de suppression.

    Blog Tutoriel - Ajouter la logique 9

  • CakePHP Cookbook Documentation, Version 2.x

    Les fichiers des classes Model de CakePHP se trouvent dans /app/Model, et le fichier que nous allonscrer maintenant 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,CakePHP peut automatiquement dduire que ce model sera utilis dans le controller PostsController, et serali la table posts de la base de donnes.

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

    Pour plus dinformations sur les models, comme les prfixes des tables, les callbacks, et la validation, con-sultez le chapitre Models (Modles) du manuel.

    Crer un controller Posts

    Nous allons maintenant crer un controller pour nos posts. Le controller est lendroit o sexcutera toute lalogique mtier pour lintraction du processus de post. En un mot, cest lendroit o vous jouerez avec lesmodels et o les tches lies aux posts sexcutent. Nous placerons ce nouveau controller dans un fichier ap-pel PostsController.php lintrieur du dossier /app/Controller. Voici quoi devrait ressem-bler le controller de base

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

    }

    Maintenant, ajoutons une action notre controller. Les actions reprsentent souvent une sim-ple fonction ou une interface dans une application. Par exemple, quand les utilisateurs requtentwww.exemple.com/posts/index (qui est la mme chose que www.exemple.com/posts/), ils pourraient sat-tendre voir une liste de posts. Le code pour cette action 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 cettelogique en demandant www.exemple.com/posts/index. De la mme faon, si nous devions dfinir une fonc-tion appele foobar(), les utilisateurs pourrait y accder en demandant www.exemple.com/posts/foobar.

    10 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

    Avertissement : Vous pourriez tre tent de nommer vos controllers et vos actions dune certainemanire pour obtenir une certaine URL. Rsistez cette tentation. Suivez les conventions CakePHP(le nom des controllers au pluriel, etc.) et nommez vos actions de faon lisible et comprhensible. Vouspouvez lier les URLs votre code en utilisant 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 nous crerons la prochaine tape). La ligne dfinit la variable de vue appele posts qui est gale la valeur de retour de la mthode find(all) du model Post. Notre model Post est automatiquementdisponible via $this->Post, parce que 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 fluxdfinis par 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 dunlayout applicatif. Pour la plupart des applications, elles sont un mlange de HTML et PHP, mais les vuespeuvent aussi tre constitues 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 pour le moment, utilisons juste celui par dfaut.

    Vous souvenez-vous, dans la dernire section, comment nous avions assign la variable posts la vue enutilisant la mthode set() ? Cela devrait transmettre les donnes la vue qui ressemblerait quelque chosecomme 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

    Blog Tutoriel - Ajouter la logique 11

  • CakePHP Cookbook Documentation, Version 2.x

    [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 nomcorrespond celui du controller (nous aurons crer un dossier appel Posts dans ce cas). Pour mettre enforme les donnes de ces posts dans un joli tableau, le code de notre vue devrait ressembler quelque chosecomme cela

    Blog posts

    IdTitreCr le

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

    12 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

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

    A ce stade, vous devriez tre en mesure de pointer votre navigateur sur la pagehttp ://www.exemple.com/posts/index. Vous devriez voir votre vue, correctement formate avec letitre 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 titredun post mne lURL : /posts/view/un_id_quelconque), vous avez srement t inform par CakePHPque laction na pas encore t dfinie. Si vous navez pas t inform, soit quelque chose sest mal pass,soit en fait vous aviez dj dfini laction, auquel cas vous tes vraiment sournois ! Sinon, nous allons lacrer 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 quefind(all) parce que nous voulons seulement rcuprer les informations dun seul post.

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

    Nous faisons aussi une petite vrification derreurs pour nous assurer quun utilisateur accde bien len-regsitrement. Si un utilisateur requte /posts/view, nous lancerons un NotFoundException et lais-serons le Gestionnaire dErreur de CakePHP ErrorHandler prendre le dessus. Nous excutons aussi unevrification similaire pour nous assurer 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.

    Blog Tutoriel - Ajouter la logique 13

    http://www.exemple.com/posts/index
  • CakePHP Cookbook Documentation, Version 2.x

    Cr le :

    Vrifiez que cela fonctionne en testant les liens de la page /posts/index ou en affichant manuellement unpost 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 denouveaux posts.

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

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

    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->Session->setFlash(__('Your post has been saved.'));return $this->redirect(array('action' => 'index'));

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

    }}

    }

    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 dataposte spcifique. Par exemple, $this->request->is(book) ne retournera pas true si les data dubook ont t postes.

    14 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

    Note : Vous avez besoin dinclure le component Session (SessionComponent) et le helper Session (Ses-sionHelper) dans chaque controller que vous utiliserez. Si ncessaire, incluez-les dans le controller principal(AppController) pour quils soient accessibles tous les controllers.

    Voici ce que fait laction add() : si la requte HTTP est de type POST, essayez de sauvegarder les donnesen utilisant le model Post. Si pour une raison quelconque, la sauvegarde a choue, affichez simplement lavue. Cela nous 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 votre application. Dans ce cas, nous utilisons la mthodeCakeRequest::is() pour vrifier que la requte est de type POST.

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

    Nous utilisons la mthode SessionComponent::setFlash() du component Session (SessionCom-ponent) pour dfinir un message dans une variable session et qui sera affich dans la page juste aprsla redirection. Dans le layout, nous trouvons la fonction SessionHelper::flash qui permet daf-ficher et de nettoyer la variable correspondante. La mthode Controller::redirect du controllerpermet de rediriger vers une autre URL. Le paramtre array(action => index) sera traduitvers lURL /posts (dans notre cas laction index du controller Posts). Vous pouvez vous rfrer la fonc-tion Router::url() dans lAPI 7 pour voir les diffrents formats dURL accepts dans les diffrentesfonctions de CakePHP.

    Lappel de la mthode save() vrifiera les erreurs de validation et interrompra lenregistrement si uneerreur 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 sauvegarderles nouvelles informations. Cela ne cre pas rellement un enregistrement dans la base de donnes maisrinitialise Model : :$id et dfinit Model : :$data en se basant sur le champ par dfaut dans votre base dedonnes.

    Valider les donnes

    Cake place la barre trs haute pour briser la monotonie de la validation des champs de formulaires. Tout lemonde dteste le dvelopement de formulaires interminables et leurs routines de validations. Cake rend toutcela plus facile et plus rapide.

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

    Voici le code de notre vue add (ajout)

    7. http ://api.cakephp.org

    Blog Tutoriel - Ajouter la logique 15

    http://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 codeHTML gnr par $this->Form->create()

    .. code-block:: html

    Si create() est appele sans aucun paramtre, CakePHP suppose que vous construisez un formulaire quienvoie les donnes 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 premier paramtre dit CakePHP quels champs ils correspondent et le second paramtre vous permetde spcifier un large ventail doptions - dans ce cas, le nombre de lignes du textarea. Il y a un peu dintro-spection et dautomagie ici : input() affichera diffrents lments de formulaire selon le champ spcifidu model.

    Lappel de la mthode $this->Form->end() gnre un bouton de soumission et ajoute la balise defermeture du formulaire. Si une chane de caractres est passe comme premier paramtre de la mthodeend(), le helper Form affichera un bouton de soumission dont le nom correspond celle-ci. Encore unefois, 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 unlien Ajouter un post. Ajoutez la ligne suivante avant

    Vous vous demandez peut-tre : comment je fais pour indiquer CakePHP mes exigences de validation ?Les rgles de 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' => 'notEmpty'

    ),'body' => array(

    'rule' => 'notEmpty')

    );}

    16 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

    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 moteurde validation de CakePHP est puissant, il dispose dun certain nombre de rgles intgres (code de cartebancaire, adresse emails, etc.) et dune souplesse pour ajouter vos propres rgles de validation. Pour plusdinformations sur cette configuration, consultez le chapitre Validation des Donnes.

    Maintenant que vos rgles de validation sont en place, utilisez lapplication pour essayer dajouter un postavec un titre et un contenu vide afin de voir comment cela fonctionne. Puisque que nous avons utilis lamthode FormHelper::input() du helper Form pour crer nos lments de formulaire, nos mes-sages derreurs de validation seront affichs automatiquement.

    Editer des Posts

    Ldition de posts : nous y voil. Vous tes un pro de CakePHP maintenant, vous devriez donc avoir adoptle principe. Crez dabord laction puis la vue. Voici quoi laction edit() du controller Posts (PostsCon-troller) devrait ressembler

    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->Session->setFlash(__('Your post has been updated.'));return $this->redirect(array('action' => 'index'));

    }$this->Session->setFlash(__('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 pasde paramtre $id pass, ou si le post nexiste pas, nous lanons une NotFoundException pour que legestionnaire dErreurs ErrorHandler de CakePHP sen occupe.

    Ensuite laction vrifie si la requte est une requte POST ou PUT. Si elle lest, alors nous utilisons lesdonnes POST pour 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 dansle post rcupr prcdemment.

    Blog Tutoriel - Ajouter la logique 17

  • CakePHP Cookbook Documentation, Version 2.x

    La vue ddition devrait ressembler quelque chose comme cela :

    Editer le post

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

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

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

    Blog posts

    IdTitleActionCreated

    18 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

    Supprimer des Posts

    A prsent, mettons en place un moyen de supprimer les posts pour les utilisateurs. Dmarrons avec uneaction delete() dans le controller Posts (PostsController)

    public function delete($id) {if ($this->request->is('get')) {

    throw new MethodNotAllowedException();}

    if ($this->Post->delete($id)) {$this->Session->setFlash(

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

    } else {$this->Session->setFlash(

    __('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->Session->setFlash() pour af-ficher lutilisateur un message de confirmation aprs lavoir redirig sur /posts. Si lutilisateur tente unesuppression en utilisant une requte GET, une exception est leve. Les exceptions manques sont capturespar le gestionnaire dexceptions de CakePHP et un joli message derreur est affich. Il y a plusieurs Excep-tions intgres qui peuvent tre utilises pour indiquer les diffrentes erreurs HTTP que votre applicationpourrait rencontrer.

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

    Blog posts

    IdTitreActions

    Blog Tutoriel - Ajouter la logique 19

  • CakePHP Cookbook Documentation, Version 2.x

    Cr le

    Utiliser postLink() permet de crer un lien qui utilise du Javascript pour supprimer notre post en faisantune requte POST. Autoriser la suppression par une requte GET est dangereux cause des robots dindex-ation qui peuvent tous les supprimer.

    Note : Ce code utilise aussi le helper Form pour demander lutilisateur une confirmation avant desupprimer le post.

    Routes

    Pour certains, le routage par dfaut de CakePHP fonctionne suffisamment bien. Les dveloppeurs qui sontsensibles la facilit dutilisation et la compatibilit avec les moteurs de recherches apprcieront la maniredont CakePHP lie des URLs des actions spcifiques. Nous allons donc faire une rapide modification desroutes 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

    20 Chapitre 1. Pour Commencer

    http://www.exemple.com
  • CakePHP Cookbook Documentation, Version 2.x

    home. Au lieu de cela, nous voudrions la remplacer avec notre controller Posts (PostsController).

    Le routage de CakePHP se trouve dans /app/Config/routes.php. Vous devrez commenter ou sup-primer la ligne 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 soitconnecte 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 routedfinie plus haut, en ajoutant array(controller => posts, action => index) la fonction retournant un tableau, lURL / sera utilise. Il est dailleurs bien avis de toujours utiliser untableau pour les URLs afin que vos routes dfinissent o vont les URLs, mais aussi pour sassurer quellesaillent dans la mme direction.

    Conclusion

    Crer des applications de cette manire vous apportera, paix, honneur, amour et argent au-del mme de vosfantasmes les plus fous. Simple nest ce pas ? Gardez lesprit que ce tutoriel tait trs basique. CakePHPa beaucoup plus de fonctionnalits offrir et il est aussi souple dans dautres domaines que nous navonspas souhait couvrir ici pour simplifier les choses. Utilisez le reste de ce manuel comme un guide pourdvelopper des applications plus riches en fonctionnalits.

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

    Si vous avez besoin daide, il y a plusieurs faons dobtenir de laide - merci de regarder la page O obtenirde laide Bienvenue 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

    dutilisateurs.8. http ://api.cakephp.org

    Blog Tutoriel - Ajouter la logique 21

    http://api.cakephp.org
  • CakePHP Cookbook Documentation, Version 2.x

    Lectures supplmentaires

    Une requte CakePHP typique

    Nous avons dcouvert les ingrdients de bases de CakePHP, regardons maintenant comment chaque ob-jet travaille avec les autres pour rpondre une requte simple. Poursuivons sur notre exemple originalde requte, imaginons que notre ami Ricardo vient de cliquer sur le lien Achetez un Cake personnalismaintenant ! sur la page daccueil dune application CakePHP.

    FIGURE 1.1 Diagramme reprsentant une requte CakePHP typique.

    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 requte au serveur Web.2. Le routeur analyse lURL afin dextraire les paramtres de cette requte : le controller, laction et tout

    argument qui affectera la logique mtier pendant cette requte.3. En utilisant les routes, lURL dune requte est lie une action dun controller (une mthode dune

    classe controller spcifique). Dans notre exemple, il sagit de la mthode buy() du Controller Cakes.La fonction de rappel du controller, beforeFilter(), est appele avant que toute logique de laction ducontroller ne soit excute.

    4. Le controller peut utiliser des models pour accder aux donnes de lapplication. Dans cet exemple,le controller utilise un model pour rcuprer les derniers achats de Ricardo depuis la base de donnes.

    22 Chapitre 1. Pour Commencer

    http://www.exemple.com/cakes/buy
  • CakePHP Cookbook Documentation, Version 2.x

    Toute mthode de rappel du model, tout behavior ou toute source de donnes peut sappliquer pendantcette opration. Bien que lutilisation du model ne soit pas obligatoire, tous les controllers CakePHPncessitent au dpart, au moins un model.

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

    6. Le controller peut faire usage de components pour affiner les donnes ou pour effectuer dautresoprations (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,ces donnes sont passes la vue grce la mthode set(). Les mthodes de rappel (callbacks) du con-troller peuvent tre appliques avant lenvoi des donnes. La logique de la vue est excute, laquellepeut inclure lutilisation 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 ex-cutes. La vue 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 peude temps pour apprendre les conventions de CakePHP, terme vous gagnerez du temps : en suivant lesconventions, vous aurez des fonctionnalits automatiques et vous vous librerez du cauchemar de la mainte-nance par lanalyse des fichiers de configuration. Les conventions sont aussi l pour crer un environnementde 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 dveloppe-ment Web et de bonnes pratiques. Alors que nous vous conseillons dutiliser ces conventions lors de vosdveloppements CakePHP, nous devons mentionner que la plupart de ces principes sont facilement con-tournables - ce qui est particulirement utile 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 conven-tion.

    La premire mthode que vous crivez pour un controller devrait tre index(). Lorsquune requte pointevers un controller 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() deApplesController, alors que 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 nomsde mthode des controllers avec des underscores. Si une mthode du controller a t prfixe avec un under-score, la mthode ne sera pas accessible directement partir du web mais est disponible pour une utilisationinterne. Par exemple :

    Blog Tutoriel - Ajouter la logique 23

    http://www.exemple.com/apples/http://www.exemple.com/apples/view
  • CakePHP Cookbook Documentation, Version 2.x

    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,quelquun qui essaie daller sur la page http ://www.example.com/news/_findNewArticles/ aura une erreur,car la mthode est prcde dun underscore. Vous pouvez aussi utiliser les mots-cls de visibilit de PHPpour indiquer si la mthode peut ou non tre accessible partir dune URL. Les mthodes non-publiques nesont pas accessibles.

    Considrations URL pour les noms de Controller Comme vous venez de voir, un controller motunique renvoie facilement vers un chemin URL en minuscules. Par exemple, ApplesController(qui serait dfini dans le nom de fichier ApplesController.php) est accessible ladresse http ://exem-ple.com/apples.

    Les controllers multiples mots peuvent tre de forme inflect qui correspondent au nom du controller : /redApples /RedApples /Red_apples /red_applesiront tous vers lindex du controller RedApples. Cependant, la convention est que vos URLs soient en mi-nuscules et avec des underscores, cest pourquoi /red_apples/go_pick est la forme correcte pour accder laction RedApplesController::go_pick.

    Pour plus dinformations sur les URLs de CakePHP et la gestion des paramtres, allez voir Configurationdes 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 vousavez une classe MaChouetteClasse, alors dans Cake, le fichier devra tre nomm MaChouetteClasse.php.Voici des exemples de la manire dont on nomme les fichiers, pour chacun des diffrents types de classesque vous utiliseriez habituellement dans une application CakePHP : La classe controller BisousEtCalinsController devra se trouver dans un fichier nomm BisousEtCalin-

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

    SuperComponent.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.

    24 Chapitre 1. Pour Commencer

    http://www.exemple.com/news/latest/http://www.example.com/news/_findNewArticles/http://exemple.com/appleshttp://exemple.com/apples
  • CakePHP Cookbook Documentation, Version 2.x

    La classe Helper (Assistant) LeMeilleurQuiSoitHelper devra se trouver dans un fichier nommLeMeilleurQuiSoitHelper.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 ensont des exemples.

    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 serontpas compris par CakePHP sans lui indiquer prcisment (par exemple cheval/chevaux). Voir pour cela lechapitre 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) du model associ, suivi de _id. Donc, si un Cuisinier hasMany Cake, la table cakes se rfrera un cuisinier de la table cuisiniers via une cl trangre cuisinier_id. Pour une table avec un nom de plusieursmots comme type_categories, la cl trangre sera type_categorie_id.

    Les tables de jointure utilises dans les relations hasAndBelongsToMany (HABTM) entre modelsdoivent tre nommes daprs le nom des tables des models quelles unissent, dans lordre alphabtique(pommes_zebres plutt que zebres_pommes).

    Toutes les tables avec lesquelles les models de CakePHP interagissent ( lexception des tables de jointure),ncessitent une cl primaire simple pour identifier chaque ligne de manire unique. Si vous souhaitez mod-liser une table qui na pas de cl primaire sur un seul champ, la convention de CakePHP veut quune clprimaire sur un seul champ soit ajoute la table.

    CakePHP naccepte pas les cls primaires composes. Dans lventualit o vous voulez manipuler directe-ment les donnes de votre table de jointure, cela veut dire que vous devez soit utiliser les appels directs query, soit ajouter une cl 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 champchar(36). CakePHP utilisera alors un UUID de 36 caractres (String : :uuid) lorsque vous sauvegardez unnouvel enregistrement en utilisant la mthode Model : :save.

    Blog Tutoriel - Ajouter la logique 25

  • CakePHP Cookbook Documentation, Version 2.x

    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, vousgagnerez des fonctionnalits sans les tracas et les affres de la configuration. Voici un exemple rcapitulantles 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.ctpEn utilisant ces conventions, CakePHP sait quune requte de type http ://exemple.com/personnes/ seralie un appel la fonction index() du Controller PersonnesController, dans lequel le model Personne estautomatiquement disponible (et automatiquement li la table personnes dans la base) et rendue dans unfichier. Aucune de ces relations na t configure par rien dautre que la cration des classes et des fichiersdont vous aviez besoin de toute faon.

    Maintenant que vous avez t initi aux fondamentaux de CakePHP, vous devriez essayer de drouler letutoriel du Blog 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 lib vendors plugins .htaccess index.php READMEVous 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 curdu framework. 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 besoinpour vos applications CakePHP.

    Le dossier App

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

    26 Chapitre 1. Pour Commencer

    http://exemple.com/personnes/
  • CakePHP Cookbook Documentation, Version 2.x

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

    Console Contient les commandes de la console et les Tasks de la console pour votre application. Ce rper-toire peut aussi contenir un rpertoire Templates pour personnaliser la sortie de bake. Pour plusdinformations, regardez Console et Shells.

    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 dansvotre application. Pour plus dinformations sur les cas de test et les fixtures de test, rfrez-vous ladocumentation Testing.

    tmp Cest ici que CakePHP enregistre les donnes temporaires. La manire dont sont stockes les donnesactuelles dpend de la configuration que vous avez effectue, mais ce rpertoire est habituellementutilis pour dposer 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 applica-tion sera svrement 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 fonc-tion App : :import(vendor,name). Les observateurs aviss noteront que cela semble redondant avecle rpertoire vendors la racine de larborescence. Nous aborderons les diffrences entre les deuxlorsque nous discuterons de la gestion multi-applications et des configurations systmes plus com-plexes.

    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.

    Structure de CakePHP

    CakePHP dispose de classes de Controllers (Contrleurs), de Models (Modles), et de Views (Vues), mais ildispose de 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 quioffrent une extensibilit et une rutilisation, permettant dajouter rapidement des fonctionnalits aux classesMVC de base de vos applications. A ce stade de lecture, nous survolerons ces concepts, mais vous pourrezdcouvrir comment utiliser ces outils en dtails plus tard.

    Extensions de lApplication

    Controllers, Helpers et Models ont chacun une classe parente, que vous pou-vez utiliser pour dfinir des modifications impactant toute lapplication. AppCon-troller (disponible dans /app/Controller/AppController.php), AppHelper

    Blog Tutoriel - Ajouter la logique 27

  • CakePHP Cookbook Documentation, Version 2.x

    (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 souhaitezpartager entre tous vos 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 con-trollers. Le comportement par dfaut suppose que lURL /controller/action/var1/var2 renvoievers Controller::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 ellessont interprtes par votre application.

    Il peut tre judicieux de regrouper certaines fonctionnalits. Un Greffon ou Plugin est un ensemble demodels, de controllers et de vues qui accomplissent une tche spcifique pouvant stendre plusieursapplications. Un systme de gestion des utilisateurs ou un blog simplifi pourraient tre de bons exemplesde plugins CakePHP.

    Extensions du Controller (Components)

    Un Component (Composant) est une classe qui sintgre dans la logique du controller. Si vos controllersou vos applications doivent partager une logique, alors crer un Component est une bonne solution. A titredexemple, la classe intgre EmailComponent rend triviale la cration et lenvoi de courriels. Plutt quedcrire une mthode dans un seul controller qui effectue ce traitement, vous pouvez empaqueter ce code etainsi le partager.

    Les controllers sont galement quips de fonctions de rappel (callbacks). Ces fonctions sont votre dispo-sition au cas o vous avez besoin dajouter du code entre les diffrentes oprations internes de CakePHP.Les callbacks disponibles sont : 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 communeaux models. Par exemple, si vous stockez les donnes dun utilisateur dans une structure en arbre, vouspouvez spcifier que votre model Utilisateur se comporte comme un arbre, et il acqurera automatiquementla 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 sagitdune couche dabstraction qui permet aux models de manipuler diffrents types de donnes de manirecohrente. La plupart du temps la source principale de donnes dans CakePHP est une base de donnes,vous pouvez cependant crire des Sources de Donnes supplmentaires pour reprsenter des flux RSS, desfichiers CSV, des entres LDAP ou des vnements iCal. Les Sources de Donnes vous permettent dassocierdes enregistrements issus de sources diffrentes : plutt que dtre limit des jointures SQL, les Sourcesde Donnes vous permettent de dire votre model LDAP quil est associ plusieurs vnements iCal.

    Tout comme les controllers, les models ont des callbacks : beforeFind()

    28 Chapitre 1. Pour Commencer

  • CakePHP Cookbook Documentation, Version 2.x

    afterFind() beforeValidate() afterValidate() beforeSave() afterSave() beforeDelete() afterDelete()Les noms de ces mthodes devraient tre suffisamment explicites pour que vous compreniez leurs rles.Vous obtiendrez 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 utilisspar plusieurs controllers, les helpers permettent diffrentes vues daccder et de partager une mme logiquede prsentation. Lun des 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 larutilisabilit de ce code grce aux Layouts (mises en pages) et aux Elements. Par dfaut, toutes les vuesaffiches par un controller ont le mme layout. Les elements sont utiliss lorsque de petites portions decontenu doivent apparatre dans plusieurs vues.

    Blog Tutoriel - Ajouter la logique 29

  • CakePHP Cookbook Documentation, Version 2.x

    30 Chapitre 1. Pour Commencer

  • CHAPITRE 2

    Installation

    CakePHP est rapide et facile installer. Les conditions minimum requises sont un serveur web et une copiede CakePHP, cest tout ! Bien que ce manuel se focalise principalement sur la configuration avec Apache(parce que cest le plus utilis couramment), vous pouvez configurer CakePHP pour lancer une diversit deserveurs web tels que lighttpd ou Microsoft IIS.

    Conditions requises

    HTTP Server. Par exemple : Apache. mod_rewrite est prfrable, mais en aucun cas ncessaire. PHP 5.2.8 ou plus.

    Techniquement, un moteur de base de donnes nest pas ncessaire, mais nous imaginons que la plupart desapplications 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 exten-sions PDO installes.

    Licence

    CakePHP est licenci sous la licence MIT. Cela signifie que vous tes libre de modifier, distribuer et repro-duire le code source sous la condition que les informations de copyright restent intactes. Vous tes aussilibres dincorporer CakePHP dans toute code source dapplication commerciale ou ferme.

    31

  • CakePHP Cookbook Documentation, Version 2.x

    Tlcharger CakePHP

    Il y a deux faons dobtenir une copie rcente de CakePHP. Vous pouvez soit tlcharger une copie archivede (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 http ://cakephp.org etsuivez le lien Tlcharger maintenant.

    Toutes les versions actuelles de CakePHP sont hberges sur Github 1. Github hberge CakePHP lui-mmeainsi que plusieurs autres plugins pour CakePHP. Les versions de CakePHP sont disponibles sur Tlcharge-ments Github 2.

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

    git clone git://github.com/cakephp/cakephp.git

    Permissions

    CakePHP utilise le rpertoire app/tmp pour un certain nombre doprations. Les descriptions de Model,les vues mises 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 cakesont en criture pour lutilisateur du serveur web.

    Un problme habituel est que les rpertoires app/tmp et les sous-rpertoires doivent tre accessible en cri-ture la fois pour le serveur web et et pour lutilisateur des lignes de commande. Sur un systme UNIX,si votre serveur web est diffrent partir de lutilisateur en ligne de commande, vous pouvez lancer lescommandes suivantes juste une fois dans votre projet pour vous assurer que les permissions sont bien con-figures :

    HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | 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 aussicomplexe et flexible que vous le souhaitez. Cette section couvrira les trois types principaux dinstallation deCakePHP : dveloppement, production, et avanc. Dveloppement : Facile mettre en oeuvre, mais les URLs de lapplication contiennent le nom du rper-

    toire dinstallation de CakePHP et cest moins scuris. Production : Ncessite dtre habilit configurer le Document Root du serveur, URLs propres, trs

    scuris.

    1. http ://github.com/cakephp/cakephp2. https ://github.com/cakephp/cakephp/tags3. http ://github.com/cakephp/cakephp

    32 Chapitre 2. Installation

    http://cakephp.orghttp://github.com/cakephp/cakephphttps://github.com/cakephp/cakephp/tagshttps://github.com/cakephp/cakephp/tagshttp://github.com/cakephp/cakephp
  • CakePHP Cookbook Documentation, Version 2.x

    Avanc : Avec un peu de configuration, vous permet de placer les rpertoires cls de CakePHP diffrentsendroits du systme de fichiers, avec la possibilit de partager un seul rpertoire de la librairie centraleCakePHP entre plusieurs applications.

    Dveloppement

    Une installation dveloppement est la mthode la plus rapide pour lancer CakePHP. Cet ex-emple vous aidera installer une application CakePHP et la rendre disponible ladressehttp ://www.example.com/cake_2_0/. Nous considrons pour les besoins de cet exemple que votre docu-ment root pointe sur /var/www/html.

    Dcompressez le contenu de larchive CakePHP dans /var/www/html. Vous avez maintenant un dossierdans votre document root, nomm daprs la version que vous avez tlcharge (par exemple : cake_2.0.0).Renommez ce dossier en cake_2_0. Votre installation dveloppement devrait ressembler quelquechose comme cela dans votre 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 CakePHPaccessible 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 coeurde CakePHP. Il y a peu de faon daccomplir cela. Souvent, le plus facile est dutiliser le include_pathde PHP. Pour commencer, copiez CakePHP dans un rpertoire. Pour cet exemple, nous utiliserons/home/mark/projects :

    git clone git://github.com/cakephp/cakephp.git /home/mark/projects/cakephp

    Cela copiera CakePHP dans votre rpertoire /home/mark/projects. Si vous ne voulez pas utilisergit, vous pouvez tlcharger un zipball et les tapes restantes seront les mmes. Ensuite, vous devrez lo-caliser et modifier votre php.ini. Sur les systmes *nix, il se trouve souvent dans /etc/php.ini, maisen utilisant php -i et en regardant Loaded Configuration File (Fichier de Configuration Charg). Unefois que vous avez trouv le bon fichier 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

    Dveloppement 33

    http://www.example.com/cake_2_0/http://www.exemple.com/cake_2_0/
  • CakePHP Cookbook Documentation, Version 2.x

    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 trouverautomatiquement CakePHP.

    Production

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

    Dcompressez les contenus de larchive CakePHP dans un rpertoire de votre choix. Pour les besoins de cetexemple, nous considrons que vous avez choisi dinstaller CakePHP dans /cake_install. Votre installationde production devrait ressembler 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 applicationCakePHP accessible 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. Linstallationavec linstallateur PEAR peut simplifier le partage des librairies de CakePHP dans plusieurs applications.Pour installer CakePHP avec PEAR, vous devrez faire comme suit :

    34 Chapitre 2. Installation

    http://www.exemple.comhttp://www.exemple.com
  • CakePHP Cookbook Documentation, Version 2.x

    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 pouvoirutiliser la commande cake pour crer une nouvelle application. Puisque CakePHP sera localis danslinclude_path de PHP, vous naurez pas besoin de faire dautres changements.

    Installer CakePHP avec Composer

    Composer est un outil de gestion de dpendances pour PHP 5.3+. Il rgle plusieurs problmes que linstal-lateur PEAR a, et simplifie la gestion de plusieurs versions de librairies. Packagist 4 est le dpt principaldes packages installables avec Composer. Puisque CakePHP publie aussi les versions dans Packagist, vouspouvez installer CakePHP en utilisant Composer 5. Avant dinstaller CakePHP, vous devrez configurer unfichier composer.json. Un fichier composer.json pour une application CakePHP ressemblerait ce quisuit :

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

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

    "vendor-dir": "Vendor/"}

    }

    Sauvegardez ce JSON dans composer.json dans le rpetoire APP de votre projet. Ensuite, tlchargezle fichier composer.phar dans votre projet. Aprs avoir tlcharg composer, installez CakePHP. Dans lemme rpertoire que votre 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.jsonVendor/

    bin/autoload.phpcomposer/cakephp/

    4. https ://packagist.org/5. http ://getcomposer.org

    Installation avance et URL Rewriting 35

    https://packagist.org/http://getcomposer.org
  • CakePHP Cookbook Documentation, Version 2.x

    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 plusportable, vous devrez modifier webroot/index.php, en changeant CAKE_CORE_INCLUDE_PATH enun 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 change-ments ci-dessus dans webroot/test.php.

    Si vous installez dautres librairies avec Composer, vous devrez configurer lautoloader et rgler un problmedans lautoloader 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 dusystme de fichiers. Cela est peut tre d des restrictions de lhte partag, ou peut-tre souhaitez-vousjuste que quelques-unes de vos apps puissent partager les mmes librairies de CakePHP. Cette section dcritcomment dployer vos rpertoires de CakePHP travers le systme de fichiers.

    Premirement, ralisez quil y a trois parties principales dune application Cake :

    1. Les librairies du coeur de CakePHP, dans /lib/Cake.

    2. Le code de votre application, dans /app.

    3. Le webroot de lapplication, habituellement dans /app/webroot.

    Chacun de ces rpertoires peut tre situ nimporte o dans votre systme de fichier, avec lexception de we-broot, qui a besoin dtre acessible pour votre serveur web. Vous pouvez mme dplacer le dossier webrooten-dehors du dossier app tant que vous dtes CakePHP o vous le mettez.

    Pour configurer votre installation de CakePHP, vous aurez besoin de faire quelques changements aux fichierssuivants. /app/webroot/index.php

    36 Chapitre 2. Installation

  • CakePHP Cookbook Documentation, Version 2.x

    /app/webroot/test.php (si vous utilisez la fonctionnalit de Testing.)Il y a trois constantes que vous devrez modifier : ROOT, APP_DIR, et CAKE_CORE_INCLUDE_PATH. ROOT doit tre dfinie vers le chemin du rpertoire qui contient le dossier app. APP_DIR doit tre dfinie comme le nom (de base) de votre dossier app. CAKE_CORE_INCLUDE_PATH doit tre dfinie comme le chemin du dossier des librairies de CakePHP.Testons cela avec un exemple pour que vous puissiez voir quoi peut ressembler une installation avanceen pratique. Imaginez que je souhaite configurer CakePHP pour travailler comme ce qui suit : Les librairies du coeur de CakePHP seront places dans /usr/lib/cake. Le rpertoire webroot de lapplication sera /var/www/monsite/. Le rpertoire app de mon application sera /home/me/monapp.Etant donn ce type de configuration, jaurai besoin de modifier mon fichier webroot/index.php (qui finiradans /var/www/mysite/index.php, dans cet exemple) pour ressembler ce qui suit :

    // /app/webroot/index.php (partiel, commentaires retirs)

    if (!defined('ROOT')) {define('ROOT', DS . 'home' . DS . 'me');

    }

    if (!defined('APP_DIR')) {define ('APP_DIR', 'myapp');

    }

    if (!defined('CAKE_CORE_INCLUDE_PATH')) {define('CAKE_CORE_INCLUDE_PATH', DS . 'usr' . DS . 'lib');

    }

    Il est recommand dutiliser la constante DS plutt que des slashes pour dlimiter des chemins de fichier.Cela empche les erreurs de fichiers manquants que vous pourriez obtenir en rsultats en utilisant le mauvaisdlimiteur, et cela rend votre code plus portable.

    Apache et mod_rewrite (et .htaccess)

    Cette section a t dplace vers URL rewriting.

    URL Rewriting

    Apache et mod_rewrite (et .htaccess)

    Alors que CakePHP est construit pour travailler avec mod_rewrite et habituellement il lest nous avonsremarqu que 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,regardez votre fichier httpd.conf (Assurez-vous que vous avez dit le httpd.conf du systme plutt que celuidun utilisateur- ou le httpd.conf dun site spcifique).

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

    Installation avance et URL Rewriting 37

    http://wiki.apache.org/httpd/DistrosDefaultLayout
  • CakePHP Cookbook Documentation, Version 2.x

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

    # 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

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

    LoadModule rewrite_module libexec/apache2/mod_rewrite.so

    D