Symfony: Mieux développer en PHP avec Symfony 1.2 et Doctrine. Le tutoriel Jobeet enrichi et mis à jour par le créateur de Symfony. (Les cahiers du programmeur) (French Edition)
معرفی کتاب «Symfony: Mieux développer en PHP avec Symfony 1.2 et Doctrine. Le tutoriel Jobeet enrichi et mis à jour par le créateur de Symfony. (Les cahiers du programmeur) (French Edition)» نوشتهٔ Fabien Potencier, Hugo Hamon، منتشرشده توسط نشر Eyrolles در سال 2009. این کتاب در فرمت pdf، زبان فرانسوی ارائه شده است.
Reconnu dans le monde pour sa puissance et son élégance, Symfony est issu de plus de dix ans de savoir-faire. Le framework open source de Sensio fédère une très forte communauté de développeurs PHP professionnels. Il leur offre un ensemble d'outils et un environnement MVC pour créer des applications web robustes, maintenables et évolutives. Au fil d'une démarche rigoureuse et d'un exemple concret d'application web 2.0, ce cahier décrit le bon usage des outils Symfony mis à la disposition du développeur : de l'architecture MVC et autres design patterns à l'abstraction de base de données et au mapping objet-relationnel avec Doctrine, en passant par les tests unitaires et fonctionnels, la gestion des URL, des formulaires ou du cache, l'internationalisation ou encore la génération des interfaces d'administration... Au sommaire Avant-Propos Démarrage du projet L'étude de cas Concevoir le modèle de données Le contrôleur et la vue Le routage Optimisation du modèle et refactoring Concevoir et paginer la liste d'offres d'une catégorie Les tests unitaires Les tests fonctionnels Accélérer la gestion des formulaires Tester les formulaires Le générateur d'interface d'administration Authentification et droits avec l'objet sfUser Les flux de syndication ATOM Construire des services web Déployer un moteur de recherche Dynamiser l'interface utilisateur avec Ajax Internationalisation et localisation Les plug-ins La gestion du cache Le déploiement en production A - Le format YAML B - Le fichier de configuration settings.yml C - Le fichier de configuration factories.yml Index Découvrir l’étude de cas développée......Page 7 En quoi cet ouvrage est-il différent ?......Page 8 Organisation de l’ouvrage......Page 9 Remerciements......Page 13 1......Page 24 Démarrage du projet......Page 25 Installer les librairies du framework Symfony......Page 26 Générer la structure de base du projet......Page 29 Générer la structure de base de la première application frontend......Page 30 Découvrir les environnements émulés par Symfony......Page 31 Spécificités de l’environnement de développement......Page 32 Spécificités de l’environnement de production......Page 33 Méthode 1 : configuration dangereuse à ne pas reproduire......Page 34 Création d’un nouveau serveur virtuel pour Jobeet......Page 35 Tester la nouvelle configuration d’Apache......Page 36 Installer et configurer le dépôt Subversion......Page 38 En résumé.........Page 40 2......Page 42 L’étude de cas......Page 43 À la découverte du projet.........Page 44 Scénario F1 : voir les dernières offres en page d’accueil......Page 46 Scénario F2 : voir les offres d’une catégorie......Page 47 Scénario F4 : obtenir le détail d’une offre......Page 48 Scénario F5 : poster une nouvelle annonce......Page 49 Scénario B1 : gérer les catégories......Page 51 Scénario B4 : configurer le site Internet......Page 52 En résumé.........Page 53 3......Page 54 Concevoir le modèle de données......Page 55 Configurer la base de données pour le projet Symfony......Page 56 Présentation de la couche d’ORM Doctrine......Page 57 Qu’est-ce qu’un ORM ?......Page 58 Activer l’ORM Doctrine pour Symfony......Page 59 Découvrir le diagramme UML « entité-relation »......Page 60 Écrire le schéma de définition de la base de données......Page 61 Déclaration des attributs des colonnes d’une table en format YAML......Page 63 Construire la base de données automatiquement......Page 64 Découvrir les classes du modèle de données......Page 65 Générer la base de données et le modèle en une seule passe......Page 66 Découvrir les différents types de données d’un projet Symfony......Page 67 Définir des jeux de données initiales pour Jobeet......Page 68 Régénérer la base de données et le modèle en une seule passe......Page 70 Composition de base d’un module généré par Symfony......Page 71 Découvrir les actions du module « job »......Page 72 Comprendre l’importance de la méthode magique __toString()......Page 73 Ajouter et éditer les offres d’emploi......Page 74 En résumé.........Page 75 4......Page 76 Le contrôleur et la vue......Page 77 L’architecture MVC et son implémentation dans Symfony......Page 78 Décorer une page avec un en-tête et un pied de page......Page 79 Décorer le contenu d’une page avec un décorateur......Page 80 Récupérer les images et les feuilles de style......Page 82 Configurer la vue à partir d’un fichier de configuration......Page 83 Configurer la vue à l’aide des helpers de Symfony......Page 85 Écrire le contrôleur de la page : l’action index......Page 86 Créer la vue associée à l’action : le template......Page 87 Personnaliser les informations affichées pour chaque offre......Page 88 Créer le template du détail de l’offre......Page 90 Mettre à jour l’action show......Page 91 Fixer la valeur d’un slot dans un template......Page 92 Déclarer une valeur par défaut pour le slot......Page 93 Rediriger vers une page d’erreur 404 si l’offre n’existe pas......Page 94 Récupérer le détail de la requête envoyée au serveur......Page 95 Récupérer le détail de la réponse envoyée au client......Page 96 En résumé.........Page 97 5......Page 98 Le routage......Page 99 Qu’est-ce qu’une URL ?......Page 100 Découverte de la configuration par défaut du routage......Page 101 Comprendre le fonctionnement des URL par défaut de Symfony......Page 103 Configurer la route d’accès au détail d’une offre......Page 104 Limiter une requête à certaines méthodes HTTP......Page 106 Transformer la route d’une offre en route Doctrine......Page 107 Améliorer le format des URL des offres d’emploi......Page 108 Retrouver l’objet grâce à sa route depuis une action......Page 110 Le routage dans les templates......Page 111 Déclarer une nouvelle collection de routes Doctrine......Page 112 Émuler les méthodes PUT et DELETE......Page 114 Faciliter le débogage en listant les routes de l’application......Page 115 En résumé.........Page 117 6......Page 118 Optimisation du modèle et refactoring......Page 119 Présentation de l’objet Doctrine_Query......Page 120 Avoir recours à la barre de débogage......Page 121 Redéfinir la méthode save() d’un objet Doctrine......Page 122 Mettre à jour les données de test pour s’assurer de la validité des offres affichées......Page 123 Découvrir le fichier de configuration app.yml......Page 124 Remanier le code en continu pour respecter la logique MVC......Page 125 Avantages du remaniement de code......Page 126 Classer les offres d’emploi selon leur catégorie......Page 127 Limiter le nombre de résultats affichés......Page 129 Modifier les données de test dynamiquement par l’ajout de code PHP......Page 131 Empêcher la consultation d’une offre expirée......Page 132 En résumé.........Page 134 7......Page 136 Concevoir et paginer la liste d’offres d’une catégorie......Page 137 Implémenter l’accesseur getSlug() dans la classe JobeetJob......Page 138 Intégrer un lien pour chaque catégorie ayant plus de dix offres valides......Page 139 Implémenter la méthode countActiveJobs() de la classe JobeetCategoryTable......Page 140 Générer automatiquement le squelette du module......Page 142 Mise en place de l’action executeShow()......Page 143 Intégration du template showSuccess.php associé......Page 144 Découvrir le principe de templates partiels......Page 145 Faire appel au partiel dans un template......Page 146 Que sont les listes paginées et à quoi servent-elles ?......Page 147 Initialiser la classe de modèle et le nombre maximum d’objets par page......Page 148 Initialiser le composant de pagination......Page 149 Remanier les méthodes existantes de JobeetCategory......Page 150 Passer la collection d’objets Doctrine au template partiel......Page 151 Afficher les liens de navigation entre les pages......Page 152 Description des méthodes de l’objet sfDoctrinePager utilisées dans le template......Page 153 Code final du template showSuccess.php......Page 154 En résumé.........Page 155 8......Page 156 Les tests unitaires......Page 157 De la nécessité de passer par des tests unitaires......Page 158 Découverte des outils de tests de lime......Page 159 Exécuter une suite de tests unitaires......Page 160 Déterminer les tests à écrire......Page 161 Commenter explicitement les tests unitaires......Page 162 Ajouter des tests pour les nouvelles fonctionnalités......Page 164 Ajouter des tests suite à la découverte d’un bug......Page 165 Implémenter une meilleure méthode slugify......Page 166 Configuration de la base de données......Page 168 Initialiser les scripts de tests unitaires de modèles Doctrine......Page 169 Tester la méthode save() de l’objet JobeetJob......Page 170 Implémentation des tests unitaires dans d’autres classes Doctrine......Page 171 En résumé.........Page 172 9......Page 174 Les tests fonctionnels......Page 175 En quoi consistent les tests fonctionnels ?......Page 176 Tester la navigation en simulant le comportement d’un véritable navigateur......Page 177 Modifier le comportement du simulateur de navigateur......Page 178 Comprendre la structure des fichiers de tests......Page 179 Découvrir le testeur sfTesterResponse......Page 181 Charger des jeux de données de tests......Page 182 Écrire des tests fonctionnels pour le module d’offres......Page 183 Seulement N offres sont listées par catégorie......Page 184 Un lien vers la page d’une catégorie est présent lorsqu’il y a trop d’offres......Page 185 Les offres d’emploi sont triées par date......Page 186 Chacune des offres de la page d’accueil est cliquable......Page 187 Autres exemples de scénarios de tests pour les pages des modules job et category......Page 188 Exécuter successivement des tests fonctionnels......Page 191 En résumé.........Page 192 10......Page 194 Accélérer la gestion des formulaires......Page 195 Les formulaires de base......Page 196 Personnaliser le formulaire d’ajout ou de modification d’une offre......Page 198 Redéfinir plus précisément la configuration d’un champ......Page 199 Remplacer le champ permettant le choix du type d’offre par une liste déroulante......Page 200 Personnaliser le widget permettant l’envoi du logo associé à une offre......Page 202 Présentation de la classe finale de configuration du formulaire d’ajout d’une offre......Page 204 Générer le rendu d’un formulaire......Page 206 Découvrir les méthodes de l’objet sfForm......Page 207 Manipuler les formulaires dans les actions......Page 208 Découvrir les méthodes autogénérées du module job utilisant les formulaires......Page 209 Simplifier le traitement du formulaire dans le module job......Page 210 Définir les valeurs par défaut d’un formulaire généré par Doctrine......Page 211 Générer le jeton automatiquement à la création......Page 212 Redéfinir la route d’édition de l’offre grâce au jeton......Page 213 Construire la page de prévisualisation......Page 214 Préparer la route vers l’action de publication......Page 216 Implémenter la méthode publish() de l’objet JobeetJob......Page 217 Empêcher la publication et l’accès aux offres non actives......Page 218 En résumé.........Page 219 11......Page 220 Tester les formulaires......Page 221 Utiliser le framework de formulaires de manière autonome......Page 222 Tester l’envoi du formulaire de création d’offre......Page 223 Soumettre le formulaire à l’aide de la méthode click()......Page 224 Les méthodes de l’objet sfTesterForm......Page 225 Tester les objets générés par Doctrine......Page 226 Tester les erreurs des champs du formulaire......Page 227 La méthode isError() pour le contrôle des champs......Page 228 Tester la barre d’administration d’une offre......Page 229 Forcer l’utilisation de la méthode HTTP DELETE......Page 230 Simuler l’autopublication d’une offre......Page 231 Contrôler la redirection vers une page d’erreur 404......Page 232 Empêcher l’accès au formulaire d’édition lorsque l’offre est publiée......Page 233 Une route dédiée pour prolonger la durée d’une offre......Page 234 Implémenter la méthode executeExtend() aux actions du module job......Page 235 Tester la prolongation de la durée de vie d’une offre......Page 236 Sécurité native du framework de formulaire......Page 238 Les tâches automatiques de maintenance......Page 240 Créer la nouvelle tâche de maintenance jobeet:cleanup......Page 241 Implémenter la méthode cleanup() de la classe JobeetJobTable......Page 242 En résumé.........Page 243 12......Page 244 Le générateur d’interface d’administration......Page 245 Recharger les jeux de données initiales......Page 246 Générer les modules category et job......Page 247 Découvrir les fonctions des modules d’administration......Page 248 Améliorer le layout du backoffice......Page 249 Comprendre le cache de Symfony......Page 251 Introduction au fichier de configuration generator.yml......Page 252 Changer le titre des pages du module category......Page 253 Configurer les titres des pages du module job......Page 254 Surcharger localement les propriétés des champs du module......Page 255 Colonnes à afficher dans la liste des catégories......Page 256 Configurer le layout du tableau de la vue liste......Page 257 Déclarer des colonnes « virtuelles »......Page 258 Réduire le nombre de résultats par page......Page 259 Désactiver les actions par lot dans le module category......Page 260 Ajouter de nouvelles actions par lot dans le module job......Page 261 Supprimer les actions d’objets des catégories......Page 263 Configurer les actions globales de la vue liste......Page 264 Optimiser les requêtes SQL de récupération des enregistrements......Page 267 Configurer la liste des champs à afficher dans les formulaires des offres......Page 269 Implémenter une nouvelle classe de formulaire par défaut......Page 271 Implémenter un meilleur mécanisme de gestion des photos des offres......Page 273 Configurer la liste des filtres du module job......Page 275 Personnaliser les actions d’un module autogénéré......Page 276 Personnaliser les templates d’un module autogénéré......Page 277 Configuration finale du module job......Page 279 Configuration finale du module category......Page 280 En résumé.........Page 281 13......Page 282 Authentification et droits avec l’objet sfUser......Page 283 Découvrir les fonctionnalités de base de l’objet sfUser......Page 284 Écrire des messages flash depuis une action......Page 285 Stocker des informations dans la session courante de l’utilisateur......Page 286 Implémenter l’historique de navigation de l’utilisateur......Page 287 Implémenter l’historique de navigation dans la classe myUser......Page 288 Afficher l’historique des offres d’emploi consultées......Page 289 Implémenter un moyen de réinitialiser l’historique des offres consultées......Page 291 Découvrir le fichier de configuration security.yml......Page 292 Personnaliser la page de login par défaut......Page 293 Restreindre les actions d’une application à l’utilisateur......Page 294 Établir des règles de droits d’accès complexes......Page 295 Gérer les droits d’accès via l’objet sfBasicSecurityUser......Page 296 Installation du plug-in sfDoctrineGuardPlugin......Page 297 Implémenter de nouvelles méthodes à l’objet User via la classe sfGuardSecurityUser......Page 298 Activer le module sfGuardAuth et changer l’action de login par défaut......Page 299 Cacher le menu de navigation lorsque l’utilisateur n’est pas authentifié......Page 300 Ajouter un nouveau module de gestion des utilisateurs......Page 301 Implémenter de nouveaux tests fonctionnels pour l’application frontend......Page 302 En résumé.........Page 303 14......Page 304 Les flux de syndication ATOM......Page 305 Définir le format de sortie d’une page......Page 306 Présentation générale du format ATOM......Page 307 Le flux ATOM minimal valide......Page 308 Déclarer un nouveau format de sortie......Page 309 Rappel des conventions de nommage des templates......Page 310 Ajouter le lien vers le flux des offres dans le layout......Page 311 Générer les informations globales du flux......Page 312 Générer les entrées du flux ATOM......Page 313 Flux ATOM des dernières offres d’une catégorie......Page 314 Mise à jour des liens des flux de la catégorie......Page 315 Factoriser le code de génération des entrées du flux......Page 316 Générer le template du flux des offres d’une catégorie......Page 317 En résumé.........Page 319 15......Page 320 Construire des services web......Page 321 Préparer des jeux de données initiales des affiliés......Page 322 Déclaration de la route dédiée du service web......Page 324 Implémenter la méthode getActiveJobs() de l’objet JobeetAffiliate......Page 325 Implémenter l’action executeList() du module api......Page 326 Implémenter la méthode asArray() de JobeetJob......Page 327 Le format XML......Page 328 Le format JSON......Page 329 Le format YAML......Page 330 Écrire des tests fonctionnels pour valider le service web......Page 333 Déclarer la route dédiée du formulaire d’inscription......Page 334 Construction des templates......Page 335 Implémenter les actions du module affiliate......Page 336 Tester fonctionnellement le formulaire......Page 338 Générer le module d’administration affiliate......Page 339 Paramétrer le module affiliate......Page 340 Implémenter les nouvelles fonctionnalités d’administration......Page 341 Installer et configurer le framework Zend......Page 344 Implémenter l’envoi d’un e-mail à l’activation du compte de l’affilié......Page 345 En résumé.........Page 347 16......Page 348 Déployer un moteur de recherche......Page 349 Présentation de Zend Lucene......Page 350 Créer et récupérer le fichier de l’index......Page 351 Mettre à jour l’index à la sérialisation d’une offre......Page 352 Sécuriser la sérialisation d’une offre à l’aide d’une transaction Doctrine......Page 354 Implémenter la recherche d’informations pour Jobeet......Page 355 Tester la méthode getForLuceneQuery() de JobeetJob......Page 358 Nettoyer régulièrement l’index des offres périmées......Page 359 En résumé.........Page 361 17......Page 362 Dynamiser l’interface utilisateur avec Ajax......Page 363 Découvrir la librairie jQuery......Page 364 Charger la librairie jQuery sur chaque page du site......Page 365 Découvrir les comportements JavaScript avec jQuery......Page 366 Intercepter la valeur saisie par l’utilisateur dans le moteur de recherche......Page 367 Exécuter un appel Ajax pour interroger le serveur web......Page 368 Faire patienter l’utilisateur avec un « loader »......Page 369 Déplacer le code JavaScript dans un fichier externe......Page 370 Déterminer que l’action provient d’un appel Ajax......Page 371 Message spécifique pour une recherche sans résultat......Page 372 En résumé.........Page 373 18......Page 374 Internationalisation et localisation......Page 375 Que sont l’internationalisation et la localisation ?......Page 376 Modifier la culture par défaut de Symfony......Page 377 Déterminer les langues favorites de l’utilisateur......Page 378 Transformer le format des URLs de Jobeet......Page 379 Attribuer dynamiquement la culture de l’utilisateur d’après la configuration de son navigateur......Page 380 Tester les nouvelles implémentations liées à la culture......Page 383 Changer de langue manuellement......Page 384 Intégration non conforme du formulaire de changement de langue......Page 385 Intégration du formulaire de changement de langue avec un composant Symfony......Page 386 Paramétrer le support des langues, jeux de caractères et encodages......Page 389 Utiliser le helper de traduction __()......Page 391 Extraire les contenus internationalisés vers un catalogue XLIFF......Page 393 Traduire des contenus dynamiques......Page 394 Le cas des chaînes dynamiques simples......Page 395 Traduire des contenus pluriels à partir du helper format_number_choice()......Page 396 Activer la traduction des objets Doctrine......Page 397 Mettre à jour les données initiales de test......Page 398 Surcharger la méthode findOneBySlug() du modèle JobeetCategoryTable......Page 399 Mettre à jour le modèle et la route de la catégorie......Page 400 Mise à jour de la route category de l’application frontend......Page 401 Utiliser la méthode embedI18n() de l’objet sfFormDoctrine......Page 402 Internationalisation de l’interface du générateur d’administration......Page 403 Tester l’application pour valider le processus de migration de l’I18N......Page 404 Les helpers du groupe Number......Page 405 Régionaliser les formats de données dans les formulaires......Page 406 En résumé.........Page 407 19......Page 408 Les plug-ins......Page 409 Les plug-ins privés......Page 410 Découvrir la structure de fichiers d’un plug-in Symfony......Page 411 Créer le plug-in sfJobeetPlugin......Page 412 Transformer les classes concrètes en classes abstraites......Page 413 Reconstruire le modèle de données......Page 414 Déplacer la classe Jobeet vers le plug-in......Page 416 Renommer les noms des classes d’actions et de composants......Page 417 Mettre à jour les actions et les templates......Page 418 Mettre à jour le fichier de configuration du routage......Page 419 Activer les modules de l’application frontend......Page 421 Migrer les fichiers d’internationalisation de l’application......Page 422 Configuration du plug-in......Page 423 Développement de la classe JobeetUser......Page 424 Comparaison des structures des projets et des plug-ins......Page 426 Naviguer dans l’interface dédiée aux plug-ins......Page 427 Les différentes manières d’installer des plug-ins......Page 428 Écrire le fichier package.xml......Page 429 Héberger un plug-in public dans le dépôt officiel de Symfony......Page 432 En résumé.........Page 433 20......Page 434 La gestion du cache......Page 435 Pourquoi optimiser le temps de chargement des pages ?......Page 436 Comprendre la configuration par défaut du cache......Page 437 Créer le contrôleur frontal du nouvel environnement......Page 438 Manipuler le cache de l’application......Page 439 Activation du cache de la page d’accueil de Jobeet......Page 440 Principe de fonctionnement du cache de Symfony......Page 441 Nettoyer le cache de fichiers......Page 442 Exclure la mise en cache du layout......Page 443 Fonctionnement de la mise en cache sans layout......Page 444 Configuration du cache......Page 445 Principe de fonctionnement de la mise en cache......Page 446 Comprendre la problématique de la mise en cache des formulaires......Page 447 Désactiver la création du jeton unique......Page 448 Forcer la régénération du cache depuis une action......Page 449 Tester la mise en cache du formulaire de création d’une offre d’emploi......Page 451 En résumé.........Page 452 21......Page 454 Le déploiement en production......Page 455 Vérifier la configuration du serveur web......Page 456 Embarquer le framework Symfony......Page 457 Garder Symfony à jour en temps réel......Page 458 Remplacer les pages d’erreur interne par défaut......Page 460 Modifier le répertoire par défaut de la racine web......Page 461 À la découverte des factories......Page 462 Modification du nom du cookie de session......Page 463 Définir la durée de vie maximale d’une session......Page 464 Définir les objets d’enregistrement d’erreur......Page 465 Déploiement à l’aide d’une connexion SSH et rsync......Page 466 Configurer rsync pour exclure certains fichiers du déploiement......Page 467 Nettoyer le cache de configuration du serveur de production......Page 468 En résumé.........Page 469 Le format YAML......Page 471 Les chaînes de caractères......Page 472 Les nombres octaux......Page 473 Les valeurs booléennes......Page 474 Les associations simples......Page 475 Les associations complexes imbriquées......Page 476 Syntaxe alternative pour les séquences et associations......Page 477 Les fichiers YAML dynamiques......Page 478 Exemple complet récapitulatif......Page 479 Le fichier de configuration settings.yml......Page 481 Configuration de la section .settings......Page 482 Configuration par défaut......Page 483 escaping_strategy......Page 484 charset......Page 485 etag......Page 486 no_script_name......Page 487 compressed......Page 488 web_debug_dir......Page 489 max_forwards......Page 490 Le fichier de configuration factories.yml......Page 491 Configuration du service request......Page 492 Configuration du service storage......Page 493 Configuration du service logger......Page 494 path_info_key......Page 495 send_http_headers......Page 496 Configuration par défaut......Page 497 Configuration par défaut......Page 498 session_cache_limiter......Page 499 Le service view_cache......Page 500 source......Page 501 Configuration par défaut......Page 502 extra_parameters_as_query_string......Page 503 Configuration par défaut......Page 504 Configuration par défaut......Page 505 Les services de cache anonymes......Page 506 F......Page 507 P......Page 508 T......Page 509 Z......Page 510
دانلود کتاب Symfony: Mieux développer en PHP avec Symfony 1.2 et Doctrine. Le tutoriel Jobeet enrichi et mis à jour par le créateur de Symfony. (Les cahiers du programmeur) (French Edition)