CakePHP Cookbook Documentation - agrobat.fr · CakePHP est conçu pour faciliter et simplifier les...

768
CakePHP Cookbook Documentation Version 3.x Cake Software Foundation 18 February 2015

Transcript of CakePHP Cookbook Documentation - agrobat.fr · CakePHP est conçu pour faciliter et simplifier les...

  • CakePHP Cookbook DocumentationVersion 3.x

    Cake Software Foundation

    18 February 2015

  • Table des matires

    1 CakePHP en un Coup dOeil 1Conventions plutt que Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1La Couche Model (Modle) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1La Couche View (Vue) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2La Couche Controller (Contrleur) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Cycle de Requte CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Que le Dbut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Lectures Complmentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    2 Guide de Dmarrage Rapide 11Tutoriel de Bookmarker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Tutoriel de Bookmarker Part 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    3 3.0 Guide de Migration 27Pr-requis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Outil dUpgrade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Organisation des Rpertoires de lApplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27CakePHP doit tre install avec Composer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Namespaces (Espaces de Noms) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Constantes retires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Nouvel ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Notions de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Paramtrage/Configuration des Objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Shell / Task . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    i

  • Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Network . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36Network\Http . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36Network\Email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Controller\Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40TestSuite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42View\Helper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43I18n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47L10n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    4 Tutoriels et exemples 53Tutoriel de Bookmarker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53Tutoriel de Bookmarker Part 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Tutoriel dun Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67Tutoriel dun Blog - Partie 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Tutoriel dun Blog - Partie 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82Tutoriel dun Blog - Authentification et Autorisations . . . . . . . . . . . . . . . . . . . . . . . . 87

    5 Contribuer 97Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97Tickets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105Normes de codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107Guide de Compatibilit Rtroactive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

    6 Installation 121Conditions requises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Installer CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Serveur de Dveloppement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Production . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124A vous de jouer ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124URL Rewriting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

    7 Configuration 131Configurer votre Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131Chemins de Classe Supplmentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133Configuration de Inflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134Classe Configure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134Lire et Ecrire les Fichiers de Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136Crer vos Propres Readers de Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

    ii

  • Moteurs de Configuration intgrs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139Bootstrapping CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

    8 Routing 143Tour Rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Connecter les Routes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144Crer des Routes RESTful . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153Arguments Passs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155Gnrer des URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156Redirect Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157Custom Route Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158Handling Named Parameters in URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159RequestActionTrait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

    9 Les Objets Request & Response 167Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

    10 Controllers (Contrleurs) 181Le Controller App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181Droulement dune Requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182Les Actions du Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183Interactions avec les Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184Rediriger vers dAutres Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186Chargement des Models Supplmentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188Paginer un Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188Configurer les Components Charger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189Configurer les Helpers Charger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189Request Life-cycle callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189Plus sur les Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

    11 Views (Vues) 231The App View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231Templates de Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232Utiliser les Blocks de Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Crer vos propres Classes de View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242En savoir plus sur les vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

    12 Models (Modles) 323Exemple Rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323Pour en savoir plus sur les Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325

    13 Gestion des Erreurs & Exceptions 441Configuration des Erreurs et des Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441Crer vos Propres Gestionnaires dErreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442Changer le Comportement des Erreurs Fatales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442Classes des Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443

    iii

  • Exceptions Intgres de CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443Utiliser les Exceptions HTTP dans vos Controllers . . . . . . . . . . . . . . . . . . . . . . . . . 446Exception Renderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446Crer vos Propres Exceptions dans votre Application . . . . . . . . . . . . . . . . . . . . . . . . 446Etendre et Implmenter vos Propres Gestionnaires dExceptions . . . . . . . . . . . . . . . . . . 447

    14 La mise en cache 451Configuration de la classe Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452Ecrire dans un Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454Lire depuis un Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455Suppression dun Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456Effacer les Donnes du Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456Utiliser le Cache pour Stocker les Compteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457Utiliser le Cache pour Stocker les Rsultats de Requtes Courantes . . . . . . . . . . . . . . . . . 457Utilisation des Groupes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457Activer ou Dsactiver Globalement le Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458Cration dun moteur de stockage pour le Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . 459

    15 Console & Shells 461La console de CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461Crer un Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462Les Tches Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464Appeler dautres Shells partir de votre Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466Rcuprer les Entres de lUtilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466Crer des Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467Sortie de la Console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467Niveaux de sortie de la Console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468Style de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468Mthodes Hook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470Configurer les options et gnrer de laide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470Routing dans shells / CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477Plus de sujets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478

    16 Console Bake 485Gnration de Code avec Bake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485Etendre Bake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487

    17 Debugger 493Debug Basique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493Utiliser la Classe Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493Affichage des Valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493Logging With Stack Traces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494Generating Stack Traces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494Getting an Excerpt From a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495Utiliser les Logs pour Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495Kit de Debug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496

    18 Dploiement 497

    iv

  • Mise jour de config/app.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497Vrifier Votre Scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498Dfinir le Document Root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498Amliorer les performances de votre application . . . . . . . . . . . . . . . . . . . . . . . . . . . 498

    19 Email 499Utilisation basique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500Envoyer les pices jointes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504Utiliser les Transports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505Envoyer des Messages Rapidement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506Envoyer des Emails depuis CLI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506

    20 vnements systme 509Exemple dUtilisation dEvenement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Accder aux Gestionnaires dEvnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Le gestionnaire dvnement global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511Dispatcher les Evnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511Enregistrer les Listeners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517Lecture Supplmentaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517

    21 Internationalisation & Localisation 519Internationaliser Votre Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519Utiliser les Fonctions de Traduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521Crer Vos Propres Traducteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525

    22 Journalisation (logging) 529Configuration des flux dun log (journal) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529Journalisation des Erreurs et des Exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531Interagir avec les Flux de Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532Utilisation de lAdaptateur FileLog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532Logging vers Syslog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532Ecrire dans les logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533Scopes de Journalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534lAPI de Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535Logging Trait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536Utiliser Monolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536

    23 Pagination 539Utiliser Controller : :paginate() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539Utiliser Directement Paginator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542Contrle les Champs Utiliss pour le Tri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542Limiter le Nombre Maximum de Lignes qui peuvent tre Rcupres . . . . . . . . . . . . . . . . 543Faire des Jointures dAssociations Supplmentaires . . . . . . . . . . . . . . . . . . . . . . . . . 543Requtes de Page Out of Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543Pagination dans la Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544

    24 Modelless Forms 545

    v

  • Creating a Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545Processing Request Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546Getting Form Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547Creating HTML with FormHelper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547

    25 Plugins 549Installer un Plugin Avec Composer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549Charger un Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550Configuration du Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551Utiliser un Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552Crer Vos Propres Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552Controllers du Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553Models du Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555Vues du Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556Assets de Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557Components, Helpers et Behaviors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558Etendez votre Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558

    26 REST 559Mise en place Simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559Accepter lInput dans dAutres Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562

    27 Securit 563Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563Cross Site Request Forgery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565SecurityComponent (Scurit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566

    28 Sessions 571Session Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571Gestionnaires de Session intgrs & Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . 572Configurer les Directives ini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575Crer un Gestionnaire de Session Personnalis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575Accder lObjet Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577Lire & Ecrire les Donnes de Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577Dtruire la Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578Faire une Rotation des Identificateurs de Session . . . . . . . . . . . . . . . . . . . . . . . . . . . 578Messages Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578

    29 Testing 579Installer PHPUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579Tester la Configuration de la Base de Donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580Vrifier la Configuration Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580Conventions des cas de Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581Crer Votre Premier Cas de Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581Lancer les Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583Les Callbacks du Cycle de vie des cas de Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584Fixtures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585Tester les classes Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590

    vi

  • Test dintgrations des Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592Tester les Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598Tester les Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598Tester les Helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600Crer les Test Suites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601Crer des Tests pour les Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602Gnrer des Tests avec Bake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603Intgration avec Jenkins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604

    30 Validation 607Crer les Validators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607Valider les Donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612Valider les Entities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613Rgles de Validation du Cur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614

    31 Classe App 615Trouver les Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615Trouver les Chemins vers les Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615Localiser les Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616Localiser les Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616Charger les Fichiers de Vendor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616

    32 Collections 619Exemple Rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619Liste des Mthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620Faire une Itration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620Filtrer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623Agrgation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624Trier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627Utiliser des Donnes en Arbre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628Autres Mthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629

    33 Folder & File 635Utilisation Basique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635API de Folder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636LAPI de File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640

    34 Hash 643Syntaxe de chemin Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643

    35 Http Client 659Faire des Requtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659Crer des Requtes Multipart avec des Fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . 660Envoyer des Corps de Requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660Options de la Mthode Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661Authentification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661Crer des Scoped Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662Configurer et Grer les Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663Objets Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664

    vii

  • 36 Inflector 667Crer des Formes Pluriel et Singulier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667Crer des Formes en CamelCase et en Underscore . . . . . . . . . . . . . . . . . . . . . . . . . . 667Crer des Formes Lisibles par lHomme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668Creating Table and Class Name Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668Crer des Noms de Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668Crer des Chanes dURL Safe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668Configuration dInflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669

    37 Number 671Formatage des Devises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671Paramtrage de la Devise par Dfaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672Formatage Des Nombres A Virgules Flottantes . . . . . . . . . . . . . . . . . . . . . . . . . . . 673Formatage Des Pourcentages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673Interagir Avec Des Valeurs Lisibles Par LHomme . . . . . . . . . . . . . . . . . . . . . . . . . . 673Formatage Des Nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674Formatage Des Diffrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675

    38 Objets Registry 677Charger les Objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677Attraper les Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677Dsactiver les Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678

    39 Text 679Gnrer des UUIDs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680Simple String Parsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680Formatting Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680Wrapping Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681Highlighting Substrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681Retirer les Liens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682Tronquer le Texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682Truncating the Tail of a String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683Extracting an Excerpt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684Converting an Array to Sentence Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684

    40 Time 687Crer des Instances Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687Manipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688Formatage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691Comparer Avec le Present . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691Comparer Avec les Intervals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692Accepter des Donnes de Request Localises . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692

    41 Xml 693Importer les donnes vers la classe Xml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693Transformer une chane de caractres XML en tableau . . . . . . . . . . . . . . . . . . . . . . . 694Transformer un tableau en une chane de caractres XML . . . . . . . . . . . . . . . . . . . . . . 694

    viii

  • 42 Globales & Fonctions 697Fonctions Globales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697Dfinitions des constantes du noyau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699Dfinition de Constantes de Temps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700

    43 Debug Kit 701Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701Stockage de DebugKit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701Utilisation de la Toolbar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702Utiliser le Panneau dHistorique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702Dvelopper vos Propres Panneaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702

    44 Annexes 7053.0 Guide de Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705Informations gnrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740

    45 Index et tables 743

    PHP Namespace Index 745

    Index 747

    ix

  • x

  • CHAPITRE 1

    CakePHP en un Coup dOeil

    CakePHP est conu pour faciliter et simplifier les tches classiques du dveloppement web. En fournissantune boite outil tout-en-un pour vous aider dmarrer, les diffrentes parties de CakePHP fonctionnentaussi bien ensemble que sparment.

    Le but de cette prsentation est dintroduire les concepts gnraux de CakePHP, et de vous donner un aperurapide de la faon dont ces concepts sont mis en uvre dans CakePHP. Si vous tes impatient de dmarrerun projet, vous pouvez commencer avec le tutoriel, ou plonger dans la documentation.

    Conventions plutt que Configuration

    CakePHP fournit une structure organisationnelle de base qui comprend les noms de classes, les noms defichiers, les noms de table de base de donnes, et dautres conventions. Mme si les conventions prennent dutemps apprendre, en suivant les conventions offertes par CakePHP, vous pouvez viter les configurationsinutiles et construire une structure dapplication uniforme ce qui facilite le travail quand vous travaillezsur de multiples projets. Le chapitre sur les conventions couvre les diffrentes conventions utilises parCakePHP.

    La Couche Model (Modle)

    La couche Model reprsente la partie de lapplication qui excute la logique applicative. Elle est responsablede rcuprer les donnes et de les convertir selon des concepts significatifs pour votre application. Celainclut le traitement, la validation, lassociation et beaucoup dautres tches concernant la manipulation desdonnes.

    Dans le cas dun rseau social, la couche Model soccuperait des tches telles que sauvegarder les donnesutilisateur, sauvegarder les associations damis, enregistrer et rcuprer les photos des utilisateurs, trouverdes suggestions de nouveaux amis, etc ... Tandis que les objets Models seront Friend, User, Comment,Photo. Si nous voulions charger des donnes depuis notre table users, nous pourrions faire :

    1

  • CakePHP Cookbook Documentation, Version 3.x

    use Cake\ORM\TableRegistry;

    $users = TableRegistry::get(Users);$query = $users->find();foreach ($query as $row) {

    echo $row->username;}

    Vous remarquerez peut-tre que nous navons pas eu crire de code avant que nous puissions commencer travailler avec nos donnes. En utilisant les conventions, CakePHP utilisera des classes standards pour lesclasses table et entity qui nont pas encore t dfinies.

    Si nous voulions crer un nouvel utilisateur et lenregistrer (avec validation), nous ferions ceci :

    use Cake\ORM\TableRegistry;

    $users = TableRegistry::get(Users);$user = $users->newEntity([email => [email protected]]);$users->save($user);

    La Couche View (Vue)

    La View retourne une prsentation des donnes modlises. Etant spare des objets Model, elle est re-sponsable de lutilisation des informations dont elle dispose pour produire nimporte quelle interface deprsentation ncessaire votre application.

    Par exemple, la view pourrait utiliser les donnes du model pour afficher une page HTML les contenant ouun rsultat au format XML pour que dautres lutilisent :

    // Dans un fichier de view, nous afficherons un element pour chaque utilisateur (user).

    La couche View fournit un certain nombre dextensions tels que les Elements et les Cells pour vous permettrede r-utiliser facilement votre logique de prsentation.

    La couche View nest pas seulement limite au HTML ou la reprsentation en texte de donnes. Elle peutaussi tre utilise pour offrir une grande varit de formats tels que JSON, XML et grce une architecturemodulable tout autre format dont vous auriez besoin.

    La Couche Controller (Contrleur)

    La couche Controller gre les requtes des utilisateurs. Elle est responsable de retourner une rponse aveclaide mutuelle des couches Model et View.

    2 Chapitre 1. CakePHP en un Coup dOeil

  • CakePHP Cookbook Documentation, Version 3.x

    Les Controllers peuvent tre imagins comme des managers qui ont pour mission que toutes les ressourcesncessaires pour accomplir une tche soient dlgues aux bonnes personnes. Il attend des requtes desclients, vrifie leur validit selon lauthentification et les rgles dautorisation, dlgue la rcupration etle traitement des donnes la couche Model, puis slectionne les types de prsentation accepts par clientpour finalement dlguer le processus de rendu la couche View. Un exemple de controller denregistrementdutilisateur serait :

    public function add(){

    $user = $this->Users->newEntity();if ($this->request->is(post)) {

    $user = $this->Users->patchEntity($user, $this->request->data);if ($this->Users->save($user, [validate => registration])) {

    $this->Flash->success(__(Vous tes maintenant enregistr.));} else {

    $this->Flash->error(__(Il y a eu un problme.));}

    }$this->set(user, $user);

    }

    Notez que nous navons jamais explicitement rendu de view. Les conventions de CakePHP prendront soinde slectionner la bonne view et de la rendre avec les donnes prpares avec set().

    Cycle de Requte CakePHP

    Maintenant que vous tes familier avec les diffrentes couches de CakePHP, voyons comment fonctionne lecycle dune requte CakePHP :

    Le cycle dune requte CakePHP typique dbute avec une requte utilisateur qui demande une page ou uneressource de votre application. haut niveau chaque requte passe par les tapes suivantes :

    1. La requte est dabord aiguille par les routes.

    2. Aprs que la requte a t route, le dispatcher va slectionner le bon objet controller pour la traiter.

    3. Laction du controller est appelle et le controller interagit avec les Models et Components ncessaires.

    4. Le controller delgue la cration de la response la View pour gnrer le rsultat obtenu partir desdonnes de model.

    Que le Dbut

    Esprons que ce bref aperu ait veill votre intrt. Quelques autres grandes fonctionnalits de CakePHPsont : Un framework de cache qui sintgre Memcache, Redis et dautres. Un outil de gnration de code puissant pour partir sur les chapeaux de roue. Un framework de tests intgr pour vous assurer que votre code fonctionne correctement.Les prochaines tapes videntes sont de tlcharger CakePHP , lire le tutoriel et construire un truc gnial.

    Cycle de Requte CakePHP 3

  • CakePHP Cookbook Documentation, Version 3.x

    Lectures Complmentaires

    O obtenir de laide

    Le Site Officiel de CakePHP

    http ://www.cakephp.org

    Le site officiel de CakePHP est toujours un endroit patant visiter. Il propose des liens vers des out-ils frquemment utiliss par le dveloppeur, des didacticiels vido, des possibilits de faire un don et destlchargements.

    Le Cookbook

    http ://book.cakephp.org

    Ce manuel devrait probablement tre le premier endroit o vous rendre pour obtenir des rponses. Commepour beaucoup dautres projets open source, nous accueillons de nouvelles personnes rgulirement. Fatestout votre possible pour rpondre vos questions vous-mme dans un premier temps. Les rponses peuventvenir lentement, mais elles resteront longtemps et vous aurez ainsi allg notre charge de travail en supportutilisateur. Le manuel et lAPI ont tous deux une version en ligne.

    4 Chapitre 1. CakePHP en un Coup dOeil

    http://www.cakephp.orghttp://book.cakephp.org
  • CakePHP Cookbook Documentation, Version 3.x

    La Boulangerie

    http ://bakery.cakephp.org

    La Boulangerie (Bakery) est une chambre de compensation pour tout ce qui concerne CakePHP. Vous ytrouverez des tutoriels, des tudes de cas et des exemples de code. Lorsque vous serez familiariss avecCakePHP, connectez-vous pour partager vos connaissances avec la communaut et obtenez en un instant lagloire et la fortune.

    LAPI

    http ://api.cakephp.org/

    Allez droit au but et atteignez le graal des dveloppeurs, lAPI CakePHP (Application Programming In-terface) est la documentation la plus complte sur tous les dtails essentiels au fonctionnement interne duframework. Cest une rfrence directe au code, donc apportez votre chapeau hlice.

    Les Cas de Test

    Si vous avez toujours le sentiment que linformation fournie par lAPI est insuffisante, regardez le code descas de test fournis avec CakePHP. Ils peuvent servir dexemples pratiques pour lutilisation dune fonctionet de donnes membres dune classe.

    tests/TestCase/

    Le Canal IRC

    Canaux IRC sur irc.freenode.net : #cakephp Discussion gnrale. #cakephp-docs Documentation. #cakephp-bakery Bakery. #cakephp-fr Canal francophone.Si vous tes paum, poussez un hurlement sur le canal IRC de CakePHP. Une personne de lquipe dedveloppement 1 sy trouve habituellement, en particulier durant les heures du jour pour les utilisateursdAmrique du Nord et du Sud. Nous serions ravis de vous couter, que vous ayez besoin dun peu daide,que vous vouliez trouver des utilisateurs dans votre rgion ou que vous souhaitiez donner votre nouvellemarque de voiture sportive.

    Groupes de Discussion Officiels de CakePHP

    CakePHP Google Group 2

    CakePHP a aussi son groupe officiel sur Google Groups. Il y a des centaines de personne qui discutent desprojets CakePHP, qui saident les uns les autres, rsolvent des problmes, qui construisent des projets et

    1. https ://github.com/cakephp ?tab=members2. http ://groups.google.com/group/cake-php

    Lectures Complmentaires 5

    http://bakery.cakephp.orghttp://api.cakephp.org/https://github.com/cakephp?tab=membershttps://github.com/cakephp?tab=membershttp://groups.google.com/group/cake-php
  • CakePHP Cookbook Documentation, Version 3.x

    partagent leurs ides. Cela peut tre une grande ressource pour trouver des rponses archives, des ques-tions frquemment poses et obtenir des rponses aux problmes urgents. Rejoignez dautres utilisateurs deCakePHP dans les communauts suivantes.

    Stackoverflow

    http ://stackoverflow.com/ 3

    Taggez vos questions avec cakephp et la version spcifique que vous utilisez pour activer les utilisateursexistants de stackoverflow pour trouver vos questions.

    O Trouver de lAide dans Votre Langue

    Franaise

    Communaut de CakePHP Francophone 4

    Portugais brsilien

    Communaut de CakePHP brsilienne 5

    Conventions de CakePHP

    Nous sommes de grands fans des conventions plutt que de la configuration. Bien que cela rclame unpeu de 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 main-tenance du suivi des fichiers de configuration. Les conventions crent un environnement de dveloppementuniforme, permettant dautres dveloppeurs de sinvestir dans le code plus facilement.

    Les Conventions des Controllers

    Les noms des classes de controller sont au pluriel, en CamelCase et se terminent par Controller.PeopleController et LatestArticlesController sont des exemples respectant cette conven-tion.

    les mthodes publiques des controllers sont souvent exposes comme des actions accessiblesvia un navigateur web. Par exemple /articles/view correspond la mthode view() deArticlesController sans rien modifier. Les mthodes prives ou protges ne peuvent pas tre ac-cdes avec le routing.

    3. http ://stackoverflow.com/questions/tagged/cakephp/4. http ://cakephp-fr.org5. http ://cakephp-br.org

    6 Chapitre 1. CakePHP en un Coup dOeil

    http://stackoverflow.com/questions/tagged/cakephp/http://cakephp-fr.orghttp://cakephp-br.org
  • CakePHP Cookbook Documentation, Version 3.x

    Considrations concernant les URLs et les Noms des Controllers

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

    Les controllers avec plusieurs mots peuvent tre de forme inflect qui correspondent au nom du controller : /redApples /RedApples /Red_apples /red_applesPointeront tous vers lindex du controller RedApples. Cependant, la convention est que vos URLs soient enminuscules avec des tirets en utilisant la classe DashedRoute, donc /red-apples/go-pick est labonne forme pour accder laction RedApplesController::goPick().

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

    Conventions des Fichiers et des Noms de Classe

    En gnral, les noms de fichiers correspondent aux noms des classes et suivent les standards PSR-0 et PSR-4pour lautoloading (chargement automatique). Voici quelques exemples de noms de classes et de fichiers : 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 Table ValeurOptionsTable devra se trouver dans un fichier nomm ValeurOptionsTable.php. La classe Entity ValeurOptionEntity 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

    LeMeilleurQuiSoitHelper.php.Chaque fichier sera situ dans le rpertoire/namespace appropri dans le dossier de votre application.

    Conventions pour les Models et les Bases de Donnes

    Les noms de classe de model sont au pluriel et en CamelCase. People, BigPeople, et ReallyBigPeople 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.

    Lectures Complmentaires 7

    http://exemple.com/apples
  • CakePHP Cookbook Documentation, Version 3.x

    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) de la table associe, suivi de _id. Donc, si Cuisiniers hasMany Cakes, la table cakes se rfrera la table cuisiniersvia une cl trangre cuisinier_id. Pour une table avec un nom de plusieurs mots commetype_categories, la cl trangre sera type_categorie_id.

    Les tables de jointure utilises dans les relations BelongsToMany entre models doivent tre nommesdaprs le nom des tables quelles unissent, dans lordre alphabtique (pommes_zebres plutt que ze-bres_pommes).

    Conventions des Views

    Les fichiers de template de view sont nomms daprs les fonctions du controller quelles affichent, sousune forme avec underscores. La fonction soyezPret() de la classe PeopleController cherchera un gabarit deview dans src/Template/People/soyez_pret.ctp.

    Le schma classique est src/Template/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 de la base de donnes : people Classe Table : PeopleTable se trouvant dans src/Model/Table/PeopleTable.php Classe Entity : Person se trouvant dans src/Model/Entity/Person.php Classe Controller : PeopleController se trouvant dans src/Controller/PeopleController.php Template de View se trouvant dans src/Template/People/index.ctpEn 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 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 pour voir comment les choses sarticulent.

    Structure du dossier de CakePHP

    Aprs avoir tlcharg et extrait lapplication CakePHP, voici les fichiers et rpertoires que vous devriezvoir : bin config logs plugins src tests

    8 Chapitre 1. CakePHP en un Coup dOeil

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

    tmp vendor webroot .htaccess composer.json index.php README.mdVous remarquerez quelques dossiers principaux : Le dossier bin contient les executables de la console Cake. Le dossier config contient les (quelques) fichiers de Configuration que CakePHP utilise. Les dtails sur la

    connexion la base de donnes, le bootstrapping, les fichiers de configuration du cur et consorts doiventtre stocks ici.

    Le dossier logs contient normalement vos fichiers de log dpendant de votre configuration des logs. Le dossier plugins est lendroit o sont stocks les Plugins que votre application utilise. Le dossier src sera celui o vous exercerez votre magie : cest l que vous placerez les fichiers de votre

    application. Le dossier tests est lendroit o vous mettez les cas de test pour votre application. Le dossier tmp est lendroit o CakePHP stocke les donnes temporaires. Les donnes quil stocke dpen-

    dent de la faon dont vous avez configur CakePHP mais ce dossier est gnralement utilis pour stockerles descriptions de model, les logs, et parfois les informations de session.

    Le dossier vendor est lendroit o CakePHP et dautres dpendances de lapplication vont tre installs.Engagez-vous personnellement ne pas modifier les fichiers dans ce dossier. Nous ne pourrons pas vousaider si vous avez modifi le cur du framework.

    Le rpertoire webroot est la racine publique de votre application. Il contient tous les fichiers que voussouhaitez voir accessibles publiquement.Assurez-vous que les dossiers tmp et logs existent et quils sont en criture, autrement la performance devotre application sera svrement impacte. En mode debug, CakePHP vous avertira si ce nest pas le cas.

    Le Dossier Src

    Le rpertoire src de CakePHP est lendroit o vous raliserez la majorit du dveloppement de votre appli-cation. Regardons dun peu plus prs les dossiers lintrieur de src.

    Console Contient les commandes de la console et les Tasks de la console pour votre application. Pour plusdinformations, regardez Console & Shells.

    Controller Contient les Controllers et les Components de votre application.Locale Stocke les fichiers pour linternationalisation.Model Pour les Tables, Entity et Behaviors de votre application.View Les fichiers de prsentation sont placs ici : Vue Grille, helpers et templates de vues.Template Les fichiers de prsentation se trouvent ici : elements, pages derreur, les layouts, et les fichiers

    de template de vue.

    Lectures Complmentaires 9

  • CakePHP Cookbook Documentation, Version 3.x

    10 Chapitre 1. CakePHP en un Coup dOeil

  • CHAPITRE 2

    Guide de Dmarrage Rapide

    Le meilleur moyen de tester et dapprendre CakePHP est de sassoir et de construire une application simplede bookmarks.

    Tutoriel de Bookmarker

    Ce tutoriel va vous montrer la cration dune application simple de bookmarking (bookmarker). Pour com-mencer, nous allons installer CakePHP, crer notre base de donnes et utiliser les outils que CakePHP nousfournit pour crer une application rapidement.

    Voici ce dont vous allez avoir besoin :

    1. Un serveur de base de donnes. Nous allons utiliser un serveur MySQL dans ce tutoriel. Vous devrezen savoir assez sur SQL pour crer une base de donnes : CakePHP prendra les rnes partir de l.Puisque nous utilisons MySQL, assure-vous aussi davoir pdo_mysql activ dans PHP.

    2. Des connaissances de base en PHP.

    Cest parti !

    Rcuprer CakePHP

    La faon la plus simple pour installer CakePHP est dutiliser Composer. Composer est un moyen simpledinstaller CakePHP depuis votre terminal ou votre prompteur de ligne de commandes. Dabord, vous aurezbesoin de tlcharger et dinstaller Composer si vous ne lavez pas dj fait. Si vous avez cURL install,cest aussi facile que de lancer ce qui suit :

    curl -s https://getcomposer.org/installer | php

    Ou alors vous pouvez tlcharger composer.phar depuis le site de Composer 1.

    Ensuite tapez simplement la ligne suivante dans votre terminal partir du rpertoire dinstallation pourinstaller le squelette dapplication CakePHP dans le rpertoire bookmarker.

    1. https ://getcomposer.org/download/

    11

    https://getcomposer.org/download/
  • CakePHP Cookbook Documentation, Version 3.x

    php composer.phar create-project --prefer-dist -s dev cakephp/app bookmarker

    Lavantage dutiliser Composer est quil va automatiquement faire des tches de configuration importantes,comme de dfinir les bonnes permissions de fichier et crer votre fichier config/app.php pour vous.

    Il y a dautres faons dinstaller CakePHP. Si vous ne pouvez ou ne voulez pas utiliser Composer, consultezla section Installation.

    Peu importe la faon dont vous avez tlcharg et install CakePHP, une fois que votre configuration estfaite, votre rpertoire devrait ressembler ce qui suit :

    /bookmarker/bin/config/logs/plugins/src/tests/tmp/vendor/webroot.editorconfig.gitignore.htaccess.travis.ymlcomposer.jsonindex.phpphpunit.xml.distREADME.md

    Cest le bon moment pour en apprendre un peu plus sur la faon dont la structure du rpertoire de CakePHPfonctionne. Consultez la section Structure du dossier de CakePHP.

    Vrifions notre Installation

    Nous pouvons rapidement vrifier que notre installation fonctionne, en vrifiant la page daccueil par dfaut.Avant de faire ceci, vous devrez dmarrer le serveur de dveloppement :

    bin/cake server

    Ceci va lancer le serveur web intgr de PHP sur le port 8765. Ouvrez http://localhost:8765 dansvotre navigateur web pour voir la page daccueil. Tous les points devront tre cochs sauf pour CakePHPqui nest pas encore capable de se connecter votre base de donnes. Si ce nest pas le cas, vous devrezinstaller des extensions PHP supplmentaires ou dfinir des permissions de rpertoire.

    Crer la Base de Donnes

    Ensuite, configurons la base de donnes pour notre application de bookmarking. Si vous ne lavez pas djfait, crez une base de donnes vide que nous allons utiliser dans ce tutoriel, avec un nom de votre choix,par exemple cake_bookmarks. Vous pouvez excuter le SQL suivant pour crer les tables ncessaires :

    12 Chapitre 2. Guide de Dmarrage Rapide

  • CakePHP Cookbook Documentation, Version 3.x

    CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,email VARCHAR(255) NOT NULL,password VARCHAR(255) NOT NULL,created DATETIME,updated DATETIME

    );

    CREATE TABLE bookmarks (id INT AUTO_INCREMENT PRIMARY KEY,user_id INT NOT NULL,title VARCHAR(50),description TEXT,url TEXT,created DATETIME,updated DATETIME,FOREIGN KEY user_key (user_id) REFERENCES users(id)

    );

    CREATE TABLE tags (id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255),created DATETIME,updated DATETIME,UNIQUE KEY (title)

    );

    CREATE TABLE bookmarks_tags (bookmark_id INT NOT NULL,tag_id INT NOT NULL,PRIMARY KEY (bookmark_id, tag_id),INDEX tag_idx (tag_id, bookmark_id),FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),FOREIGN KEY bookmark_key(bookmark_id) REFERENCES bookmarks(id)

    );

    Vous avez peut-tre remarqu que la table bookmarks_tags utilisait une cl primaire composite.CakePHP permet les cls primaires composites presque partout, facilitant la construction des applicationsmulti-tenanted.

    La table et les noms de colonnes que nous avons utiliss ntaient pas arbitraires. En utilisant les conven-tions de nommage de CakePHP, nous pouvons mieux contrler CakePHP et viter davoir configurer leframework. CakePHP est assez flexible pour saccommoder de tout schma de base de donnes, mais suivreles conventions va vous faire gagner du temps.

    Configuration de Base de Donnes

    Ensuite, indiquons CakePHP o se trouve notre base de donnes et comment sy connecter. Pour la plupartdentre vous, ce sera la premire et la dernire fois que vous devrez configurer quelque chose.

    La configuration est assez simple : remplacez juste les valeurs dans le tableau Datasources.defaultdans le fichier config/app.php avec ceux qui correspondent votre configuration. Un exemple simple

    Tutoriel de Bookmarker 13

  • CakePHP Cookbook Documentation, Version 3.x

    de tableau de configuration pourrait ressembler ce qui suit :

    return [// Plus de configuration au-dessus.Datasources => [

    default => [className => Cake\Database\Connection,driver => Cake\Database\Driver\Mysql,persistent => false,host => localhost,username => cakephp,password => AngelF00dC4k3~,database => cake_bookmarks,encoding => utf8,timezone => UTC,cacheMetadata => true,

    ],],// Plus de configuration en dessous.

    ];

    Une fois que vous avez sauvegard votre fichier config/app.php, vous devriez voir la section CakePHPest capable de se connecter la base de donnes coche.

    Note : Une copie du fichier de configuration par dfaut de CakePHP se trouve dansconfig/app.default.php.

    Gnration de Code Scaffold

    Comme notre base de donnes suit les conventions de CakePHP, nous pouvons utiliser lapplication deconsole bake pour gnrer rapidement une application basique. Dans votre terminal, lancez les commandessuivantes :

    bin/cake bake all usersbin/cake bake all bookmarksbin/cake bake all tags

    Ceci va gnrer les controllers, models, views, leurs cas de tests correspondants et les fixturespour nos ressources users, bookmarks et tags. Si vous stopp votre serveur, relancez-le et allez surhttp://localhost:8765/bookmarks.

    Vous devriez voir une application basique mais fonctionnelle fournissant des accs aux donnes vers lestables de la base de donnes de votre application. Une fois que vous avez la liste des bookmarks, ajoutezquelques users, bookmarks, et tags.

    Ajouter un Hashage de Mot de Passe

    Quand vous crez vos users, vous avez probablement remarqu que les mots de passe sont stocks en clair.Cest trs mauvais dun point du vue scurit, donc rglons ceci.

    14 Chapitre 2. Guide de Dmarrage Rapide

  • CakePHP Cookbook Documentation, Version 3.x

    Cest aussi un bon moment pour parler de la couche model dans CakePHP. Dans CakePHP, nous sparons lesmthodes qui agissent sur une collection dobjets, et un objet unique, dans des classes diffrentes. Les mth-odes qui agissent sur la collection des entities sont mises dans la classe Table, alors que les fonctionnalitscorrespondant un enregistrement unique sont mises dans la classe Entity.

    Par exemple, le hashage des mots de passe se fait pour un enregistrement individuel, donc nous allonsintgrer ce comportement sur lobjet entity. Comme nous voulons hasher le mot de passe chaque fois quilest dfini nous allons utiliser une mthode mutateur/setter. CakePHP va appeler les mthodes setter basessur les conventions chaque fois quune proprit est dfinie dans une de vos entities. Ajoutons un setterpour le mot de passe. Dans src/Model/Entity/User.php, ajoutez ce qui suit :

    namespace App\Model\Entity;

    use Cake\ORM\Entity;use Cake\Auth\DefaultPasswordHasher;

    class User extends Entity{

    // Code from bake.

    protected function _setPassword($value){

    $hasher = new DefaultPasswordHasher();return $hasher->hash($value);

    }}

    Maintenant mettez jour un des users que vous avez crez prcdemment, si vous changez son mot de passe,vous devriez voir un mot de passe hash la place de la valeur originale sur la liste ou les pages de vue.CakePHP hashe les mots de passe avec bcrypt 2 par dfaut. Vous pouvez aussi utiliser sha1 ou md5 si voustravaillez avec une base de donnes existante.

    Rcuprer les Bookmarks avec un Tag Spcifique

    Maintenant que vous avez stock les mots de passe de faon scuris, nous pouvons construire quelquesfonctionnalits intressantes dans notre application. Une fois que vous avez une collection de bookmarks,il peut tre pratique de pouvoir les chercher par tag. Ensuite nous allons intgrer une route, une action decontroller, et une mthode finder pour chercher les bookmarks par tag.

    Idalement, nous aurions une URL qui ressemble http://localhost:8765/bookmarks/tagged/funny/cat/gifsCela nous aide trouver tous les bookmarks qui ont les tags funny, cat et gifs. Avant de pouvoirintgrer ceci, nous allons ajouter une nouvelle route. Dans config/routes.php, ajoutez ce qui suit enhaut du fichier :

    Router::scope(/bookmarks,[controller => Bookmarks],function ($routes) {

    2. http ://codahale.com/how-to-safely-store-a-password/

    Tutoriel de Bookmarker 15

    http://codahale.com/how-to-safely-store-a-password/
  • CakePHP Cookbook Documentation, Version 3.x

    $routes->connect(/tagged/*, [action => tags]);}

    );

    Ce qui est au-dessus dfinit une nouvelle route qui connecte le chemin /bookmarks/tagged/*,vers BookmarksController::tags(). En dfinissant les routes, vous pouvezisoler la dfinition de vos URLs, de la faon dont ils sont intgrs. Si nous visitionshttp://localhost:8765/bookmarks/tagged, nous verrions une page derreur de CakePHP. In-tgrons maintenant la mthode manquante. Dans src/Controller/BookmarksController.php,ajoutez ce qui suit :

    public function tags(){

    $tags = $this->request->params[pass];$bookmarks = $this->Bookmarks->find(tagged, [

    tags => $tags]);$this->set(compact(bookmarks, tags));

    }

    Crer la Mthode Finder

    Dans CakePHP, nous aimons garder les actions de notre controller lgres, et mettre la plupart de la logiquede notre application dans les models. Si vous visitez lURL /bookmarks/tagged maintenant, vousverrez une erreur comme quoi la mthode findTagged na pas t encore intgre, donc faisons-le. Danssrc/Model/Table/BookmarksTable.php ajoutez ce qui suit :

    public function findTagged(Query $query, array $options){

    $fields = [Bookmarks.id,Bookmarks.title,Bookmarks.url,

    ];return $this->find()

    ->distinct($fields)->matching(Tags, function ($q) use ($options) {

    return $q->where([Tags.title IN => $options[tags]]);});

    }

    Nous intgrons juste des finders personnaliss. Cest un concept trs puissant dans CakePHP qui vouspermet de faire un package rutilisable de vos requtes. Dans notre finder nous avons amen la mthodematching() qui nous permet de trouver les bookmarks qui ont un tag qui match correspond.

    Crer la Vue

    Maintenant si vous vous rendez lurl /bookmarks/tagged, CakePHP va afficher une erreur vous disantque vous navez pas de fichier de vue. Ensuite, construisons le fichier de vue pour notre action tags. Dans

    16 Chapitre 2. Guide de Dmarrage Rapide

  • CakePHP Cookbook Documentation, Version 3.x

    src/Template/Bookmarks/tags.ctp mettez le contenu suivant :

    Bookmarks tagged with

    CakePHP sattend ce que nos templates suivent la convention de nommage o le template a la version enminuscule et en underscore du nom de laction du controller.

    Vous avez peut-tre remarqu que nous pouvions utiliser les variables $tags et $bookmarks dans notrevue. Quand nous utilisons la mthode set() dans notre controller, nous dfinissons les variables spci-fiques envoyer la vue. La vue va rendre disponible toutes les variables passes dans les templates envariables locales.

    Dans notre vue, nous avons utilis quelques uns des helpers intgrs. Les helpers sont utiliss pour rendre dela logique rutilisable pour le formatage des donnes, pour la cration de HTML ou pour laffichage dautrevue.

    Vous devriez maintenant pouvoir visiter lURL /bookmarks/tagged/funny et voir tous les book-marks taggs avec funny.

    Ainsi nous avons cr une application basique pour grer des bookmarks, des tags et des users. Cependant,tout le monde peut voir tous les tags de tout le monde. Dans le prochain chapitre, nous allons intgrer uneauthentification et restreindre la visibilit des bookmarks ceux qui appartiennent lutilisateur courant.

    Maintenant continuons avec Tutoriel de Bookmarker Part 2 pour construire votre application ou plongezdans la documentation pour en apprendre plus sur ce que CakePHP peut faire pour vous.

    Tutoriel de Bookmarker Part 2

    Aprs avoir fini la premire partie de ce tutoriel vous devriez avoir une application basique de bookmark-ing. Dans ce chapitre, nous ajouterons lauthentification et nous allons restreindre les bookmarks pour quechaque utilisateur puisse voir/modifier seulement ceux qui lui appartiennent.

    Ajouter la Connexion

    Dans CakePHP, lauthentification est gre par les Components (Composants). Les components peuvent treimagins comme des faons de crer des parties rutilisables de code du controller pour une fonctionnalit

    Tutoriel de Bookmarker Part 2 17

  • CakePHP Cookbook Documentation, Version 3.x

    spcifique ou un concept. Les components peuvent aussi se lancer dans le cycle de vie de levent du con-troller et intragir avec votre application de cette faon. Pour commencer, nous ajouterons AuthComponent notre application. Nous voulons que chaque mthode ncessite lauthentification, donc nous allons ajouterAuthComponent dans notre AppController :

    // Dans src/Controller/AppController.phpnamespace App\Controller;

    use Cake\Controller\Controller;

    class AppController extends Controller{

    public function initialize(){

    $this->loadComponent(Flash);$this->loadComponent(Auth, [

    authenticate => [Form => [

    fields => [username => email,password => password

    ]]

    ],loginAction => [

    controller => Users,action => login

    ]]);

    // Autorise laction display pour que notre controller de pages// continue de fonctionner.$this->Auth->allow([display]);

    }}

    Nous avons seulement indiqu CakePHP que nous souhaitions charger les components Flash et Auth.En plus, nous avons personnalis la configuration de AuthComponent, puisque notre table users utiliseemail comme username. Maintenant, si vous tapez nimporte quelle URL, vous serez renvoy vers/users/login, qui vous montrera une page derreur puisque nous navons pas encore crit ce code.Crons donc laction login :

    // Dans src/Controller/UsersController.php

    public function login(){

    if ($this->request->is(post)) {$user = $this->Auth->identify();if ($user) {

    $this->Auth->setUser($user);return $this->redirect($this->Auth->redirectUrl());

    }$this->Flash->error(Votre username ou mot de passe est incorrect.);

    18 Chapitre 2. Guide de Dmarrage Rapide

  • CakePHP Cookbook Documentation, Version 3.x

    }}

    Et dans src/Template/Users/login.ctp, ajoutez ce qui suit :

    Connexion

    Maintenant que nous avons un formulaire simple de connexion, nous devrions pouvoir nous connecter avecun de nos utilisateurs qui a un mot de passe hash.

    Note : Si aucun de vos utilisateurs na de mot de passe hash, commentez la ligneloadComponent(Auth). Puis allez modifier lutilisateur, crez- lui un nouveau mot de passe.

    Vous devriez maintenant pouvoir vous connecter. Si ce nest pas le cas, assurez-vous que vous utilisez unutilisateur qui a un mot de passe hash.

    Ajouter la Dconnexion

    Maintenant que les personnes peuvent se connecter, vous voudrez aussi probablement fournir un moyen dese dconnecter. Encore une fois, dans UsersController, ajoutez le code suivant :

    public function logout(){

    $this->Flash->success(Vous tes maintenant dconnect.);return $this->redirect($this->Auth->logout());

    }

    Maintenant vous pouvez visiter /users/logout pour vous dconnecter et tre renvoy vers la page deconnexion.

    Permettre de sEnregistrer

    Si vous ntes pas connect et que vous essayez de visiter /users/add vous serez renvoys vers la pagede connexion. Nous devrions rgler cela puisque nous voulons que les utilisateurs sinscrivent notre appli-cation. Dans UsersController, ajoutez ce qui suit :

    public function beforeFilter(\Cake\Event\Event $event){

    $this->Auth->allow(add);}

    Ce qui est au-dessus indique AuthComponent que laction add ne ncessite pas dauthentification oudautorisation. Vous pouvez prendre le temps de nettoyer Users/add.ctp et de retirer les liens, ou contin-uez vers la prochaine section. Nous ne ferons pas de fichier ddition (edit) ou de vue dun utilisateur (view),

    Tutoriel de Bookmarker Part 2 19

  • CakePHP Cookbook Documentation, Version 3.x

    ni de liste dutilisateurs (index) dans ce tutoriel donc ils ne fonctionneront pas puisque AuthComponentva vous refuser laccs pour ces actions de controller.

    Restreindre lAccs aux Bookmarks

    Maintenant que les utilisateurs peuvent se connecter, nous voulons limiter les bookmarks quils peu-vent voir ceux quils ont crs. Nous allons le faire en utilisant un adaptateur authorization.Puisque nos besoins sont assez simples, nous pouvons crire quelques lignes de code simple dans notreBookmarksController. Mais avant de le faire, nous voulons dire AuthComponent comment notreapplication va autoriser les actions. Dans notre AppController, ajoutez ce qui suit :

    public function isAuthorized($user){

    return false;}

    Ajoutez aussi ce qui suit dans la configuration de Auth dans AppController :

    authorize => Controller,

    Votre mthode initialize doit maintenant ressembler ceci :

    public function initialize(){

    $this->loadComponent(Flash);$this->loadComponent(Auth, [

    authorize=> Controller,//added this lineauthenticate => [

    Form => [fields => [

    username => email,password => password

    ]]

    ],unauthorizedRedirect => [

    controller => Users,action => login

    ]]);

    // Allow the display action so our pages controller// continues to work.$this->Auth->allow([display]);

    }

    Nous allons par dfaut refuser laccs, et permettre un accs incrmental o cela est utile. Dabord, nousallons ajouter la logique dautorisation pour les bookmarks. Dans notre BookmarksController, ajoutezce qui suit :

    20 Chapitre 2. Guide de Dmarrage Rapide

  • CakePHP Cookbook Documentation, Version 3.x

    public function isAuthorized($user){

    $action = $this->request->params[action];

    // Add et index sont toujours permises.if (in_array($action, [index, add, tags])) {

    return true;}// Tout autre action ncessite un id.if (empty($this->request->params[pass][0])) {

    return false;}

    // Vrifie que le bookmark appartient lutilisateur courant.$id = $this->request->params[pass][0];$bookmark = $this->Bookmarks->get($id);if ($bookmark->user_id == $user[id]) {

    return true;}return parent::isAuthorized($user);

    }

    Maintenant, si vous essayez de voir, de modifier ou de supprimer un bookmark qui ne vous appartient pas,vous devriez tre redirig vers la page do vous venez. Cependant, il ny a pas de message affich, doncensuite, rectifions cela :

    // Dans src/Template/Layout/default.ctp// Sous le message flash existant.

    Vous devriez maintenant voir les messages derreur dautorisation.

    Rgler la Vue de Liste et les Formulaires

    Alors que view et delete fonctionnent, edit, add et index ont quelques problmes :

    1. Lors de lajout dun bookmark, vous pouvez choisir lutilisateur.

    2. Lors de ldition dun bookmark vous pouvez choisir lutilisateur.

    3. La page de liste montre les bookmarks des autres utilisateurs.

    Attaquons nous dabord add. Pour commencer, retirez input(user_id) desrc/Template/Bookmarks/add.ctp. Une fois retir, nous allons aussi mettre jour la mth-ode add pour ressembler ceci :

    public function add(){

    $bookmark = $this->Bookmarks->newEntity($this->request->data);$bookmark->user_id = $this->Auth->user(id);if ($this->request->is(post)) {

    if ($this->Bookmarks->save($bookmark)) {$this->Flash->success(Le bookmark a t sauvegard.);return $this->redirect([action => index]);

    Tutoriel de Bookmarker Part 2 21

  • CakePHP Cookbook Documentation, Version 3.x

    }$this->Flash->error(Le bookmark ne peut tre sauvegard. Merci de rssayer.);

    }$tags = $this->Bookmarks->Tags->find(list);$this->set(compact(bookmark, tags));

    }

    En dfinissant la proprit entity avec les donnes de session, nous retirons la possibilit que lutilisateurpuisse modifier lauteur dun bookmark. Nous ferons la mme chose pour le formulaire et laction edit.Votre action edit devrait ressembler ceci :

    public function edit($id = null){

    $bookmark = $this->Bookmarks->get($id, [contain => [Tags]

    ]);if ($this->request->is([patch, post, put])) {

    $bookmark = $this->Bookmarks->patchEntity($bookmark, $this->request->data);$bookmark->user_id = $this->Auth->user(id);if ($this->Bookmarks->save($bookmark)) {

    $this->Flash->success(Le bookmark a t sauvegard.);return $this->redirect([action => index]);

    } else {$this->Flash->error(Le bookmark ne peut tre sauvegard. Merci de rssayer.);

    }}$tags = $this->Bookmarks->Tags->find(list);$this->set(compact(bookmark, tags));

    }

    Vue de Liste

    Maintenant nous devons afficher les bookmarks pour lutilisateur actuellement connect. Nous pouvons lefaire en mettant jour lappel paginate(). Faites en sorte que votre action index() ressemble ceci :

    public function index(){

    $this->paginate = [conditions => [

    Bookmarks.user_id => $this->Auth->user(id),]

    ];$this->set(bookmarks, $this->paginate($this->Bookmarks));

    }

    Nous devrions aussi mettre jour laction tags() et la mthode finder lie, mais nous vous laisserons cecien exercice que vous pouvez faire vous-mme.

    22 Chapitre 2. Guide de Dmarrage Rapide

  • CakePHP Cookbook Documentation, Version 3.x

    Amliorer lExperience de Tag

    Actuellement, ajouter des nouveaux tags est un processus difficile, puisque TagsController interdittous les accs. Plutt que de permettre laccs, nous pouvons amliorer lUI de slection de tag en utilisantun champ de texte spar par des virgules. Cela donnera une meilleure exprience nos utilisateurs, etutilisera quelques unes des super fonctionnalits de lORM.

    Ajouter un Champ Computed

    Comme nous voulons un accs simple vers les tags formats pour une entity, nous pouvons ajouter un champvirtuel/computed lentity. Dans src/Model/Entity/Bookmark.php ajoutez ce qui suit :

    use Cake\Collection\Collection;

    protected function _getTagString(){

    if (isset($this->_properties[tag_string])) {return $this->_properties[tag_string];

    }if (empty($this->tags)) {

    return ;}$tags = new Collection($this->tags);$str = $tags->reduce(function ($string, $tag) {

    return $string . $tag->title . , ;}, );return trim($str, , );

    }

    Cela nous laissera laccs la proprit computed $bookmark->tag_string. Nous utiliseronscette proprit dans inputs plus tard. Rappelez-vous dajouter la proprit tag_string dans la liste_accessible de votre entity, puisque nous voulons la sauvegarder plus tard.

    Dans le fichier src/Model/Entity/Bookmark.php, ajoutez tag_string la proprit_accessible comme ceci :

    protected $_accessible = [user_id => true,title => true,description => true,url => true,user => true,tags => true,tag_string => true,

    ];

    Mettre Jour les Vues

    Avec lentity mise jour, nous pouvons ajouter un nouvel input pour nos tags. Dans les vues add et edit,remplacez linput tags._ids existant avec ce qui suit :

    Tutoriel de Bookmarker Part 2 23

  • CakePHP Cookbook Documentation, Version 3.x

    Persister la Chane Tag

    Maintenant que nous pouvons voir les tags existants en chane, nous voudrions aussi sauvegarderles donnes. Comme nous marquons les tag_string accessibles, lORM va copier ces donnes partir de la requte dans notre entity. Nous pouvons utiliser une mthode hook beforeSavepour parser la chane de tag et trouver/construire les entities lies. Ajoutez ce qui suit danssrc/Model/Table/BookmarksTable.php :

    public function beforeSave($event, $entity, $options){

    if ($entity->tag_string) {$entity->tags = $this->_buildTags($entity->tag_string);

    }}

    protected function _buildTags($tagString){

    $new = array_unique(array_map(trim, explode(,, $tagString)));$out = [];$query = $this->Tags->find()

    ->where([Tags.title IN => $new]);

    // Retire les tags existants de la liste des tags nouveaux.foreach ($query->extract(title) as $existing) {

    $index = array_search($existing, $new);if ($index !== false) {

    unset($new[$index]);}

    }// Ajoute les tags existants.foreach ($query as $tag) {

    $out[] = $tag;}// Ajoute les nouveaux tags.foreach ($new as $tag) {

    $out[] = $this->Tags->newEntity([title => $tag]);}return $out;

    }

    Alors que ce code est un peu plus compliqu que ce que nous avons dj fait, il permet de montrer lapuissance de lORM de CakePHP. Vous pouvez facilement manipuler les rsultats de requte en utilisant lesmthodes des Collections, et grer les scenariis o vous crer les entities la vole avec facilit.

    Rcapitulatif

    Nous avons largi notre application de bookmarking pour grer les scenariis de contrle dauthentificationet dautorisation/daccs basique. Nous avons aussi ajout quelques amliorations UX en tirant parti du

    24 Chapitre 2. Guide de Dmarrage Rapide

  • CakePHP Cookbook Documentation, Version 3.x

    FormHelper et des capacits de lORM.

    Merci davoir pris le temps dexplorer CakePHP. Ensuite, vous pouvez en apprendre plus sur lORM, ouvous pouvez lire attentivement /topics.

    Tutoriel de Bookmarker Part 2 25

  • CakePHP Cookbook Documentation, Version 3.x

    26 Chapitre 2. Guide de Dmarrage Rapide

  • CHAPITRE 3

    3.0 Guide de Migration

    Cette page rsume les changements de CakePHP 2.x qui aidera la migration dun projet vers la version3.0, ainsi quune rfrence pour tre jour des changements faits dans le cur depuis la branche CakePHP2.x. Assurez-vous de bien lire les autres pages de ce guide pour toutes les nouvelles fonctionnalits et leschangements de lAPI.

    Pr-requis

    CakePHP 3.x a besoin de la Version 5.4.16 ou suprieur de PHP. CakePHP 3.x a besoin de lextension mbstring. CakePHP 3.x a besoin de lextension intl.

    Warning : CakePHP 3.0 ne fonctionnera pas si vous navez pas les pr-requis ci-dessus.

    Outil dUpgrade

    Alors que ce document couvre tous les changements non rtro-compatibles et les volutions faites dansCakePHP 3.0, nous avons galement cr une application de console pour vous aider raliser facilementquelques changements qui consomment du temps. Vous pouvez Rcuprer loutil dupgrade depuis Github 1.

    Organisation des Rpertoires de lApplication

    Lorganisation des rpertoires de lapplication a chang et suit maintenant PSR-4 2. Vous devez utiliser leprojet de squelette dapplication 3 comme point de rfrence lors de la mise jour de votre application.

    1. https ://github.com/cakephp/upgrade2. http ://www.php-fig.org/psr/psr-4/3. https ://github.com/cakephp/app

    27

    https://github.com/cakephp/upgradehttp://www.php-fig.org/psr/psr-4/https://github.com/cakephp/app
  • CakePHP Cookbook Documentation, Version 3.x

    CakePHP doit tre install avec Composer

    Puisque CakePHP ne peut plus tre facilement install via PEAR, ou dans un rpertoire partag, ces optionsne sont plus supportes. A la place, vous devez utiliser Composer 4 pour installer CakePHP dans votreapplication.

    Namespaces (Espaces de Noms)

    Toutes les classes du cur de CakePHP sont maintenant dans des namespaces et suivent les sp-cifications du chargement PSR-4. Par exemple src/Cache/Cache.php est dans le namespaceCake\Cache\Cache. Les constantes globales et les mthodes de helper comme __() et debug()ne sont pas mis dans un namespace pour des raisons de commodit.

    Constantes retires

    Les constantes dprcies suivantes ont t retires : IMAGES CSS JS IMAGES_URL JS_URL CSS_URL DEFAULT_LANGUAGE

    Configuration

    La configuration dans CakePHP 3.0 est significativement diffrente des versions prcdentes. Vous devriezlire la documentation Configuration sur la faon dont la configuration est faite dans la version 3.0.

    Vous ne pouvez plus utiliser App::build() pour configurer les chemins de classe supplmentaires. Ala place, vous devez mapper les chemins supplmentaires en utilisant lautoloader de votre application.Regardez la section sur Chemins de Classe Supplmentaires pour plus dinformations.

    Trois nouvelles variables de configuration fournissent la configuration de chemin pour les plugins,les views et les fichiers locale. Vous pouvez ajouter plusieurs chemins App.paths.templates,App.paths.plugins et App.paths.locales pour configurer des chemins multiples pour respec-tivement les templates, les plugins et les fichiers locales.

    La cl de configuration www_root a t renomme wwwRoot par cohrence. Merci dajuster votre fichierde configuration app.php ainsi que chaque utilisation deConfigure : :read(App.wwwRoot).

    4. http ://getcomposer.org

    28 Chapitre 3. 3.0 Guide de Migration

    http://getcomposer.org
  • CakePHP Cookbook Documentation, Version 3.x

    Nouvel ORM

    CakePHP 3.0 dispose dun nouvel ORM qui a t reconstruit de zro. Le nouvel ORM est significativementdiffrent et incompatible avec la version prcdente. Mettre jour vers le nouvel ORM ncessite des change-ments importants dans toute application qui souhaite tre mise jour. Regardez la nouvelle documentationModels (Modles) pour des informations sur la faon dutiliser le nouvel ORM.

    Notions de base

    LogError() a t retire, elle ne fournissait aucun bnfice et ntait rarement/jamais utilise. Les fonctions globales suivantes ont t retires : config(), cache(), clearCache(),convertSlashes(), am(), fileExistsInPath(), sortByKey().

    Debugging

    Configure::write(debug, $bool) naccepte plus 0/1/2. Un simple boolen est utilis laplace pour changer entre le mode debug on et off.

    Paramtrage/Configuration des Objets

    Les Objets utiliss dans CakePHP ont maintenant un systme dinstance-configuration de stock-age/rcupration cohrent. Le code qui tait auparavant accessible par exemple comme ceci :$object->settings devra tre mis jour en utilisant la place $object->config().

    Cache

    Le moteur Memcache a t retir, utilisez Cake\Cache\Cache\Engine\Memcached la place. Les moteurs de Cache sont maintenant chargs automatiquement la premire utilisation. Cake\Cache\Cache::engine() a t ajoute. Cake\Cache\Cache::enabled() a t ajoute. celle-ci remplace loption de configurationCache.disable.

    Cake\Cache\Cache::enable() a t ajoute. Cake\Cache\Cache::disable() a t ajoute. Les configurations de Cache sont maintenant immutables. Si vous avez besoin de changer la configuration,

    vous devez dabord retirer la configuration et la recrer. Cela vite les problmes de synchronisation avecles options de configuration.

    Cache::set() a t retire. Il est recommand que vous criez des configurations de cache mul-tiples pour remplacer les rglages de configuration dexcution, ce qui tait auparavant possible avecCache::set().

    Toutes les sous-classes CacheEngine intgrent maintenant une mthode config(). Cake\Cache\Cache::readMany(), Cake\Cache\Cache::deleteMany(), etCake\Cache\Cache::writeMany() ont t ajoutes.

    Nouvel ORM 29

  • CakePHP Cookbook Documentation, Version 3.x

    Toutes les mthodes de Cake\Cache\Cache\CacheEngine sont maintenant responsables de la ges-tion du prfix de cl configur. Cake\Cache\CacheEngine::write() ne permet plus de dfinirla dure dcriture - la dure est prise par la configuration dexcution du moteur de cache. Appeler unemthode de cache avec une cl vide va maintenant lancer InvalidArgumentException, au lieu deretourner false.

    Core

    App

    App::pluginPath() a t retire. Utilisez CakePlugin::path() la place. App::build() a t retire. App::location() a t retire. App::paths() a t retire. App::load() a t retire. App::objects() a t retire. App::RESET a t retire. App::APPEND a t retire. App::PREPEND a t retire. App::REGISTER a t retire.

    Plugin

    Cake\Core\Plugin::load() ne configure pas dautoloader moins que vous dfinissiez loptionautoload true.

    Lors du chargement des plugins, vous ne pouvez plus fournir de callable. Lors du chargement des plugins, vous ne pouvez plus fournir un tableau de fichiers de configuration

    charger.

    Configure

    Cake\Configure\PhpReader renomm en Cake\Core\Configure\EnginePhpConfig Cake\Configure\IniReader renomm en Cake\Core\Configure\EngineIniConfig Cake\Configure\ConfigReaderInterface renomm en Cake\Core\Configure\ConfigEngineInterface Cake\Core\Configure::consume() a t ajoute. Cake\Core\Configure::load() attend maintenant un suffix du nom du fichier sans extension

    puisque celui-ci peut venir dun moteur. Par exemple, lutilisation de PhpConfig utilise app pour chargerapp.php.

    Dfinir une variable $config dans un fichier PHP de config est dprci.Cake\Core\Configure\EnginePhpConfig attend maintenant le fichier de config pourretourner un tableau.

    Un nouveau moteur de config Cake\Core\Configure\EngineJsonConfig a t ajout.

    30 Chapitre 3. 3.0 Guide de Migration

  • CakePHP Cookbook Documentation, Version 3.x

    Object

    La classe Object a t retire. Elle contenait au dbut un tas de mthodes qui taient utilises dansplusieurs endroits travers le framework. Les mthodes les plus utiles qui taient utilises ont t ex-traites dans des traits. Vous pouvez utiliser Cake\Log\LogTrait pour accder la mthode log().Cake\Routing\RequestActionTrait fournit requestAction().

    Console

    Lexcutable cake a t dplace du rpertoire app/Console vers le rpertoire bin dans le squelette delapplication. Vous pouvez maintenant lancer la console de CakePHP avec bin/cake.

    TaskCollection Remplace

    Cette classe a t renomme en Cake\Console\TaskRegistry. Regardez la section sur Objets Reg-istry pour plus dinformations sur les fonctionnalits fournies par la nouvelle classe. Vous pouvez utilisercake upgrade rename_collections pour vous aider mettre niveau votre code. Les Tasks nontplus accs aux callbacks, puisquil ny avait jamais de callbacks utiliser.

    Shell

    Shell::__construct() a chang. Il prend maintenant une instance deCake\Console\ConsoleIo.

    Shell::param() a t ajoute pour un accs pratique aux paramtre.

    De plus, toutes les mthodes du shell vont tre transformes en camel case lors de leur appel. Par exem-ple, si vous avez une mthode hello_world() dans un shell et que vous lappelez avec bin/cakemy_shell hello_world, vous devez renommer la mthode en helloWorld. Il ny a pas de change-ments ncessaires dans la faon dappeler les commandes.

    ConsoleOptionParser

    ConsoleOptionParser::merge() a t ajoute pour fusionner les parsers.

    ConsoleInputArgument

    ConsoleInputArgument::isEqualTo() a t ajoute pour comparer deux arguments.

    Shell / Task

    Shells et Tasks ont t dplacs de Console/Command et Console/Command/Task vers Shell etShell/Task.

    Console 31

  • CakePHP Cookbook Documentation, Version 3.x

    ApiShell Retir

    ApiShell a t retir puisquil ne fourni