Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
tutoriel:demarrer_un_projet_web_avec_symfony [Le 14/12/2018, 12:07] – [Démarrer un projet Web avec Symfony] 195.221.251.177 | tutoriel:demarrer_un_projet_web_avec_symfony [Le 07/05/2019, 12:26] (Version actuelle) – Obsolète 82.251.241.242 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag> | ||
+ | |||
+ | ---- | ||
+ | <note important> | ||
+ | ====== Démarrer un projet Web avec Symfony ====== | ||
+ | <note important> | ||
+ | |||
+ | Pour la première partie de ce tutoriel, c'est mon expérience de la mise en œuvre du guide d' | ||
+ | |||
+ | J' | ||
+ | |||
+ | Comme je souhaitais produire un modèle générique de base pour mes propres besoins éventuels, j'ai adapté les exemples du tutoriel pour un projet générique que je nomme Projet01. Cela m'a poussé à toujours bien comprendre les étapes, procédures et commandes, pour que le tout soit cohérent et bien sûr fonctionnel pour mes futurs projets. Je ne suis pas certain d' | ||
+ | |||
+ | Bon concert ! | ||
+ | |||
+ | |||
+ | ===== Introduction ===== | ||
+ | |||
+ | Dans ce document, on retrouve toutes les étapes à suivre pour amorcer un nouveau projet Symfony 1.2.8 sous Linux Kubuntu 9.04, incluant une première installation. Cela implique l' | ||
+ | |||
+ | Si vous êtes sous Gnome ou Xfce, au lieu de KDE, la principale et peut-être la seule différence pour vous se trouve au niveau de l' | ||
+ | |||
+ | Si Apache, MySQL, PHP, PhpMyAdmin et Symfony sont déjà installés et configurés, | ||
+ | |||
+ | ===== Première installation ===== | ||
+ | |||
+ | ==== Installer un serveur Apache ==== | ||
+ | |||
+ | [[: | ||
+ | |||
+ | Vérification du fonctionnement d' | ||
+ | |||
+ | http:// | ||
+ | |||
+ | Si tout s'est bien passé, vous devriez voir une page Web dans laquelle s' | ||
+ | |||
+ | it works! | ||
+ | |||
+ | Je vous suggère d' | ||
+ | |||
+ | Pour activer le mode en lecture et écriture " | ||
+ | |||
+ | sudo a2enmod rewrite | ||
+ | |||
+ | ==== Installer MySQL ==== | ||
+ | |||
+ | [[: | ||
+ | |||
+ | À la fin de l' | ||
+ | |||
+ | Entrer ce nouveau mot de passe pour ce nouveau compte "MySQL Root" et valider par la touche " | ||
+ | |||
+ | Enregistrer ce nouveau mot de passe pour ce nouveau compte "MySQL Root" pour le retrouver au besoin. | ||
+ | |||
+ | Si cela n'est pas déjà dans votre habitude, je vous recommande d' | ||
+ | |||
+ | Par exemple, pour le mot de passe de "MySQL Root", j'ai les lignes suivantes dans mon fichier | ||
+ | |||
+ | MySQL : | ||
+ | Nom d' | ||
+ | Mot de passe : 12345678 | ||
+ | |||
+ | ==== Installer PHP ==== | ||
+ | |||
+ | [[: | ||
+ | |||
+ | Éditer le fichier apache2.conf pour y ajouter le nom (adresse) du serveur : | ||
+ | |||
+ | sudo kate / | ||
+ | |||
+ | Ajouter à la fin du fichier, la ligne suivante : | ||
+ | |||
+ | ServerName 127.0.0.1 | ||
+ | |||
+ | Enregistrer le fichier et fermer le fichier. | ||
+ | |||
+ | Pour que ce changement soit pris en compte, il faut recharger le serveur apache2 avec la commande suivante dans un terminal : | ||
+ | |||
+ | sudo / | ||
+ | |||
+ | ==== Vérification du bon fonctionnement de PHP5 ==== | ||
+ | |||
+ | Nous allons créer un programme PHP, le fichier " | ||
+ | |||
+ | Créez le fichier / | ||
+ | |||
+ | sudo kate / | ||
+ | |||
+ | Copiez-y le code suivant : | ||
+ | |||
+ | <?php | ||
+ | phpinfo(); | ||
+ | ?> | ||
+ | |||
+ | Rééditer le fichier apache2.conf : | ||
+ | |||
+ | sudo kate / | ||
+ | |||
+ | Copiez à la fin du fichier les lignes suivantes : | ||
+ | |||
+ | AddType application/ | ||
+ | AddType application/ | ||
+ | |||
+ | Recharger le serveur apache2 : | ||
+ | |||
+ | sudo / | ||
+ | |||
+ | Une fois le fichier " | ||
+ | |||
+ | http:// | ||
+ | |||
+ | Je vous suggère d' | ||
+ | |||
+ | ==== Sécurisation de MySQL ==== | ||
+ | |||
+ | Pour l' | ||
+ | |||
+ | Si vous avez une erreur comme celle-là : | ||
+ | |||
+ | < | ||
+ | ERROR 2002 (HY000): Can't connect to local MySQL server through socket / | ||
+ | </ | ||
+ | |||
+ | lancer MySQL avant de faire ces manipulations avec la commande suivante dans un terminal : | ||
+ | |||
+ | sudo / | ||
+ | |||
+ | Exécutons le scripte de sécurisation avec la commande suivante dans un terminal : | ||
+ | |||
+ | sudo mysql_secure_installation | ||
+ | |||
+ | Des questions simples sont posées et il suffit d'y répondre puis de passer à la suivante. | ||
+ | |||
+ | À la question : | ||
+ | |||
+ | Enter current password for root (enter for none): | ||
+ | |||
+ | Il faut un mot de passe pour bien exécuter le script. Le mot de passe demandé précédemment en fin d' | ||
+ | |||
+ | Validez votre entrée avec la touche " | ||
+ | |||
+ | À la question : | ||
+ | |||
+ | < | ||
+ | Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation. | ||
+ | Set root password? [Y/n] | ||
+ | </ | ||
+ | |||
+ | Appuyez sur la touche " | ||
+ | |||
+ | New password: | ||
+ | |||
+ | Entrez le mot de passe de votre choix et validez par la touche " | ||
+ | |||
+ | À la question : | ||
+ | |||
+ | < | ||
+ | By default, a MySQL installation has an anonymous user, allowing anyone | ||
+ | to log into MySQL without having to have a user account created for | ||
+ | them. This is intended only for testing, and to make the installation | ||
+ | go a bit smoother. | ||
+ | production environment. | ||
+ | Remove anonymous users? [Y/n] | ||
+ | </ | ||
+ | |||
+ | Appuyez sur la touche « Entrée » pour supprimer l' | ||
+ | |||
+ | À la question : | ||
+ | |||
+ | < | ||
+ | Normally, root should only be allowed to connect from ' | ||
+ | ensures that someone cannot guess at the root password from the network. | ||
+ | Disallow root login remotely? [Y/n] | ||
+ | </ | ||
+ | |||
+ | Vous n'avez pas besoin d' | ||
+ | |||
+ | À la question : | ||
+ | |||
+ | Remove test database and access to it? [Y/n] | ||
+ | |||
+ | Validez par la touche " | ||
+ | |||
+ | À la question : | ||
+ | |||
+ | < | ||
+ | Reloading the privilege tables will ensure that all changes made so far | ||
+ | will take effect immediately. | ||
+ | Reload privilege tables now? [Y/n] | ||
+ | </ | ||
+ | |||
+ | Validez par la touche " | ||
+ | |||
+ | ==== Installer PhpMyAdmin ==== | ||
+ | |||
+ | ATTENTION : Pendant l' | ||
+ | |||
+ | [[: | ||
+ | |||
+ | Pour vérifier le bon fonctionnement de PhpMyAdmin, rendez-vous à l'URL : | ||
+ | |||
+ | http:// | ||
+ | | ||
+ | si vous tombez sur une page (not found), Tapez la command | ||
+ | |||
+ | sudo kate / | ||
+ | |||
+ | et ajoutez à la fin un nouveau ligne | ||
+ | |||
+ | Include / | ||
+ | |||
+ | |||
+ | Vous arriverez alors sur la page d' | ||
+ | |||
+ | root | ||
+ | |||
+ | et le mot de passe choisi lors de la sécurisation de MySQL | ||
+ | |||
+ | Remarque : si votre compte est dupont ne pas mettre dupont comme utilisateur, | ||
+ | |||
+ | - Si tout s'est bien passé, vous devriez être connecté à PhpMyAdmin et pouvoir créer et gérer vos bases de données. | ||
+ | - Si vous arrivez pas à vous connecter à PhpMyAdmin il faut créer un lien symbolique vers MyPhpAdmin, il faut juste faire la commande suivante: " sudo ln -s / | ||
+ | Il existe déjà deux bases de données, n'y touchez pas. Elles servent au bon fonctionnement de MySQL. | ||
+ | |||
+ | Je vous suggère d' | ||
+ | |||
+ | ==== Modification des droits pour les fichiers du site Web ==== | ||
+ | |||
+ | Cette section est utile seulement si vous mettez en ligne votre projet Web et que votre ordinateur devient un serveur en ligne sur Internet, ce qui n'est pas expliqué dans le présent tutoriel. | ||
+ | |||
+ | Le répertoire contenant les sites lus par Apache est par défaut le suivant : | ||
+ | |||
+ | /var/www/ | ||
+ | |||
+ | Ses droits par défaut sont : | ||
+ | |||
+ | propriétaire=root | ||
+ | group=root | ||
+ | droits rwXr-Xr-X | ||
+ | |||
+ | Les X signifie droit x pour les répertoires, | ||
+ | |||
+ | Le groupe utilisateur pour Apache est " | ||
+ | |||
+ | Pour accéder aux fichiers qu'il doit lire, Apache utilise donc en standard le droit " | ||
+ | |||
+ | Il faut commencer par s' | ||
+ | |||
+ | sudo addgroup $USER www-data | ||
+ | |||
+ | Par la suite, on modifie les droits du dossier et des fichiers avec les commandes suivantes : | ||
+ | |||
+ | sudo chown -R www-data: | ||
+ | sudo chmod -R 770 /var/www | ||
+ | |||
+ | Il faut actualiser fermer et rouvrir votre gestionnaire de fichiers (Dolpin ou Konqueror) pour que cela soit pris en compte. | ||
+ | |||
+ | Vous avez maintenant un serveur Apache gérant le PHP avec des bases de données MySQL. | ||
+ | |||
+ | ==== Installer Symfony ==== | ||
+ | |||
+ | [[: | ||
+ | |||
+ | Pour configurer Symfony avec PEAR, entrer les commandes : | ||
+ | |||
+ | sudo pear channel-discover pear.symfony-project.com | ||
+ | |||
+ | sudo pear install symfony/ | ||
+ | |||
+ | Si tout s'est bien passé, vous aurez le message suivant : | ||
+ | |||
+ | install ok: channel:// | ||
+ | | ||
+ | Tapez cette comand dans le terminal : | ||
+ | |||
+ | sudo pear install --alldeps http:// | ||
+ | |||
+ | Nous avons un premier niveau d'aide pour Symfony avec la commande suivante : | ||
+ | |||
+ | symfony | ||
+ | |||
+ | La commande suivante nous donne la version installée de Symfony : | ||
+ | |||
+ | symfony -V | ||
+ | |||
+ | C'est tout ce qu'il faut pour Symfony ! | ||
+ | |||
+ | ===== Installer un nouveau projet ===== | ||
+ | |||
+ | ==== Préambule ==== | ||
+ | |||
+ | Pour notre exemple, nous créons le projet " | ||
+ | |||
+ | sudo mkdir / | ||
+ | |||
+ | Chez moi, cela pourrait donner comme chemin de dossier ce qui suit : | ||
+ | |||
+ | / | ||
+ | |||
+ | |||
+ | Si vous procédez différemment, | ||
+ | |||
+ | ==== Configurer un domaine local virtuel ==== | ||
+ | |||
+ | Pour nous donner le plus de latitude possible et pour pouvoir travailler sur plusieurs projets à la fois, nous créons un domaine local virtuel pour chaque projet. Vous pourrez procéder de la même manière pour chacun de vos projets de site Web. | ||
+ | |||
+ | === Configuration du serveur === | ||
+ | |||
+ | Ouvrer le fichier /etc/hosts avec la commande suivante dans un terminal : | ||
+ | |||
+ | sudo kate /etc/hosts | ||
+ | |||
+ | Puis ajoutez à la fin de la ligne qui commence par " | ||
+ | |||
+ | dev.projet01.com | ||
+ | |||
+ | === Création du serveur virtuel === | ||
+ | |||
+ | Créez un nouveau fichier " | ||
+ | |||
+ | sudo kate / | ||
+ | |||
+ | Copiez-y les lignes suivantes en remplacent le mot " | ||
+ | |||
+ | < | ||
+ | < | ||
+ | ServerName dev.projet01.com | ||
+ | DocumentRoot "/ | ||
+ | DirectoryIndex index.php | ||
+ | < | ||
+ | AllowOverride All | ||
+ | Allow from All | ||
+ | </ | ||
+ | |||
+ | Alias /sf / | ||
+ | < | ||
+ | AllowOverride All | ||
+ | Allow from All | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Activons ce nouveau domaine avec la commande suivante dans un terminal : | ||
+ | |||
+ | sudo a2ensite projet01 | ||
+ | | ||
+ | | ||
+ | Pour que ces changements soient pris en compte, il faut relancer le serveur Apache avec la commande suivante : | ||
+ | |||
+ | sudo / | ||
+ | |||
+ | Entrez l' | ||
+ | |||
+ | dev.projet01.com | ||
+ | |||
+ | Je vous suggère d' | ||
+ | |||
+ | ==== Initialisation du projet ==== | ||
+ | |||
+ | Assurez-vous d' | ||
+ | |||
+ | Créons maintenant le canevas de base avec Symfony avec la commande suivante dans le terminal : | ||
+ | |||
+ | sudo symfony generate: | ||
+ | |||
+ | Si vous avez un message d' | ||
+ | |||
+ | Cette commande génère la structure par défaut des répertoires et crée les fichiers nécessaires d'un projet symfony. | ||
+ | |||
+ | ^ Dossier ^ Description ^ | ||
+ | | apps | Contient les applications du projet | | ||
+ | | cache | Les fichiers en cache | | ||
+ | | config | Les fichiers de configuration du projet | | ||
+ | | lib | Les librairies et classes du projet | | ||
+ | | log | Les fichiers de logs du framework | | ||
+ | | plugins | Les plugins installés | | ||
+ | | test | Les tests unitaires et fonctionnels | | ||
+ | | web | Le répertoire racine web (voir dessous) | | ||
+ | |||
+ | Pourquoi autant de fichiers ? Un des bénéfices est de standardiser les développements. Grâce à cette structure par défaut des fichiers et répertoires de symfony, n' | ||
+ | |||
+ | À la racine du projet, un raccourci la commande symfony y est pour faciliter l' | ||
+ | |||
+ | === Création d' | ||
+ | |||
+ | D’abord assurez vous que vous situés sous le répertoire projet symfone, dans notre cas projet01 : | ||
+ | |||
+ | cd / | ||
+ | |||
+ | Créons l' | ||
+ | sudo symfony generate: | ||
+ | |||
+ | Cette commande crée la structure par défaut des répertoires de l' | ||
+ | |||
+ | ^ Dossier ^ Description ^ | ||
+ | | config | Les fichiers de configuration de l' | ||
+ | | lib | Les librairies et classes de l' | ||
+ | | modules | Le code de l' | ||
+ | | templates | Les gabarits principaux | | ||
+ | |||
+ | Avec cette commande nous avons passé deux paramètres en options pour la sécurité, " | ||
+ | |||
+ | En passant ces deux options, nous avons sécurisé le développement des deux plus courantes vulnérabilités trouvées sur le web. Symfony va automatiquement prendre les mesures de sécurité pour nous. | ||
+ | |||
+ | Lors de la portabilité du projet sur hébergement sur le Web, nous changerons le chemin absolu de l' | ||
+ | |||
+ | Pour ce faire, vous ouvrirez le fichier requis avec la commande : | ||
+ | |||
+ | kate config/ | ||
+ | |||
+ | Remplacerez la ligne : | ||
+ | |||
+ | require_once '/ | ||
+ | |||
+ | Par la ligne suivante qui est un chemin relatif si vous y copier le dossier de l' | ||
+ | |||
+ | require_once dirname(__FILE__).'/ | ||
+ | |||
+ | De cette façon, nous pourrons déplacer le projet, cela fonctionnera toujours. | ||
+ | |||
+ | Si vous jetez un oeil au répertoire web/, vous trouvez deux fichiers PHP, soit index.php et frontend_dev.php. Ces fichiers sont appelés front controllers. Toutes les requêtes vers l' | ||
+ | |||
+ | Mais pourquoi avoir deux front controllers alors que nous n' | ||
+ | |||
+ | Les deux fichiers pointent sur la même application, | ||
+ | |||
+ | - L' | ||
+ | |||
+ | - L' | ||
+ | |||
+ | - L' | ||
+ | |||
+ | - L' | ||
+ | |||
+ | Dans l' | ||
+ | |||
+ | Dans l' | ||
+ | |||
+ | Dans Symfony un environnement est un jeu unique de paramètres de configuration et Symfony est installé avec trois d' | ||
+ | |||
+ | ==== Création de la base du projet ==== | ||
+ | |||
+ | Ouvrer fichier du schéma de la base de données avec la commande : | ||
+ | |||
+ | kate config/ | ||
+ | |||
+ | Copiez-y le texte suivant : | ||
+ | |||
+ | < | ||
+ | propel: | ||
+ | projet01_category: | ||
+ | id: ~ | ||
+ | name: { type: varchar(255), | ||
+ | |||
+ | projet01_job: | ||
+ | id: ~ | ||
+ | category_id: | ||
+ | type: { type: varchar(255) } | ||
+ | company: | ||
+ | logo: { type: varchar(255) } | ||
+ | url: { type: varchar(255) } | ||
+ | position: | ||
+ | location: | ||
+ | description: | ||
+ | how_to_apply: | ||
+ | token: | ||
+ | is_public: | ||
+ | is_activated: | ||
+ | email: | ||
+ | expires_at: | ||
+ | created_at: | ||
+ | updated_at: | ||
+ | |||
+ | projet01_affiliate: | ||
+ | id: ~ | ||
+ | url: { type: varchar(255), | ||
+ | email: | ||
+ | token: | ||
+ | is_active: | ||
+ | created_at: | ||
+ | |||
+ | projet01_category_affiliate: | ||
+ | category_id: | ||
+ | affiliate_id: | ||
+ | </ | ||
+ | |||
+ | Avec mysqladmin, nous créons la base de données avec la commande suivante <B>en prenant soin de modifier la commande. Si votre nom d' | ||
+ | |||
+ | sudo mysqladmin -u1111 -p2222222 create projet01 | ||
+ | |||
+ | Pour indiquer à Symfony la base de données que nous utilisons pour le projet, entrons la commande suivante <B>en prenant soin de modifier la commande. Si votre nom d' | ||
+ | |||
+ | sudo symfony configure: | ||
+ | |||
+ | Avec la description de la base de données dans le fichier schema.yml, nous pouvons utiliser les tâches intégrées de l'ORM pour générer les déclarations SQL nécessaires pour créer des tables : | ||
+ | |||
+ | symfony propel: | ||
+ | |||
+ | Cette commande génère le déclarations SQL dans le répertoire data/sql, optimisées pour le moteur de base de données que nous avons configuré. | ||
+ | |||
+ | Pour créer les tables dans la base de données, entrer la commande suivante dans le terminal : | ||
+ | |||
+ | symfony propel: | ||
+ | |||
+ | L'ORM génère également les classes PHP qui font la correspondance entre les enregistrements des tables et les objets | ||
+ | |||
+ | Générer les fichiers PHP qui seront utilisés pour interagir avec la base de données dans le répertoire lib/model avec la commande suivante : | ||
+ | |||
+ | symfony propel: | ||
+ | |||
+ | En navigant parmi les fichiers générés, vous avez probablement remarqué que Propel génère quatre classes par table. | ||
+ | |||
+ | Les valeurs des colonnes d'un enregistrement peuvent être manipulées par l' | ||
+ | |||
+ | $job = new Projet01Job(); | ||
+ | $job-> | ||
+ | $job-> | ||
+ | | ||
+ | echo $job-> | ||
+ | | ||
+ | $job-> | ||
+ | |||
+ | Vous pouvez également définir les clés étrangères en liant les objets entre eux : | ||
+ | |||
+ | $category = new Projet01Category(); | ||
+ | $category-> | ||
+ | | ||
+ | $job = new Projet01Job(); | ||
+ | $job-> | ||
+ | |||
+ | La tâche propel: | ||
+ | |||
+ | symfony propel: | ||
+ | |||
+ | La tâche propel: | ||
+ | |||
+ | Comme nous le verrons un peu plus tard, Symfony charge automatiquement les classes PHP pour vous, ce qui signifie que vous n'avez jamais besoin d' | ||
+ | |||
+ | symfony cache:clear | ||
+ | |||
+ | Une tâche Symfony est composée d'un espace de nom et d'un nom de tâche. Chaque tâche a un raccourci avec le moins d' | ||
+ | |||
+ | symfony cc | ||
+ | |||
+ | ==== Créer les données initiales ==== | ||
+ | |||
+ | Les tables ont été créées dans la base de données, mais elles sont vides. Pour chaque application web, il y a trois types de données : | ||
+ | |||
+ | - Les données initiales : Les données initiales sont nécessaires pour que l' | ||
+ | |||
+ | - Les données de test : Les données de test sont nécessaires pour tester l' | ||
+ | |||
+ | - Les données utilisateurs : | ||
+ | |||
+ | Chaque fois que Symfony crée des tables dans la base de données, les données sont perdues. Pour envoyer des données initiales à la base nous pouvons écrire un script PHP, ou exécuter du code SQL avec le programme MySQL. | ||
+ | |||
+ | Mais comme le besoin est commun, il y a une meilleure méthode avec Symfony. Créez un fichier YAML dans le répertoire data/ | ||
+ | |||
+ | Créer les deux fichiers suivants avec leur contenu respectif dans le dossier data/ | ||
+ | |||
+ | Fichier 1) 010_categories.yml | ||
+ | |||
+ | < | ||
+ | Projet01Category: | ||
+ | design: | ||
+ | programming: | ||
+ | manager: | ||
+ | administrator: | ||
+ | </ | ||
+ | |||
+ | Fichier 2) 020_jobs.yml | ||
+ | |||
+ | < | ||
+ | Projet01Job: | ||
+ | job_sensio_labs: | ||
+ | category_id: | ||
+ | type: | ||
+ | company: | ||
+ | logo: | ||
+ | url: http:// | ||
+ | position: | ||
+ | location: | ||
+ | description: | ||
+ | You've already developed websites with symfony and you want to work | ||
+ | with Open-Source technologies. You have a minimum of 3 years | ||
+ | experience in web development with PHP or Java and you wish to | ||
+ | participate to development of Web 2.0 sites using the best | ||
+ | frameworks available. | ||
+ | how_to_apply: | ||
+ | Send your resume to fabien.potencier [at] sensio.com | ||
+ | is_public: | ||
+ | is_activated: | ||
+ | token: | ||
+ | email: | ||
+ | expires_at: | ||
+ | |||
+ | job_extreme_sensio: | ||
+ | category_id: | ||
+ | type: | ||
+ | company: | ||
+ | logo: | ||
+ | url: http:// | ||
+ | position: | ||
+ | location: | ||
+ | description: | ||
+ | Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do | ||
+ | eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut | ||
+ | enim ad minim veniam, quis nostrud exercitation ullamco laboris | ||
+ | nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor | ||
+ | in reprehenderit in. | ||
+ | |||
+ | Voluptate velit esse cillum dolore eu fugiat nulla pariatur. | ||
+ | Excepteur sint occaecat cupidatat non proident, sunt in culpa | ||
+ | qui officia deserunt mollit anim id est laborum. | ||
+ | how_to_apply: | ||
+ | Send your resume to fabien.potencier [at] sensio.com | ||
+ | is_public: | ||
+ | is_activated: | ||
+ | token: | ||
+ | email: | ||
+ | expires_at: | ||
+ | </ | ||
+ | |||
+ | Un fichier de jeu de données tests est écrit en YAML. Il utilise le modèle des objets avec un nom unique pour chaque enregistrement. Ce nom est utile pour lier les objets relationnels entre eux sans à avoir à définir une clé primaire (qui sont souvent des champs auto-incrémentés et ne peuvent être définis). Par exemple, le poste job_sensio_labs utilise la catégorie programming, | ||
+ | |||
+ | Un fichier de jeu de données peut contenir des objets d'un ou plusieurs modèles. | ||
+ | |||
+ | Remarquez le nombre qui préfixe le nom du fichier. C'est un moyen simple de contrôler l' | ||
+ | |||
+ | Dans un fichier de jeu de données, vous n'avez pas besoin de définir toutes les valeurs de colonnes. Dans ce cas Symfony, va utiliser la valeur par défaut indiquée dans le schéma de la base de données. Et comme Symfony utilise un Propel pour charger les données en base, tous les comportements à la création (comme pour created_at ou updated_at) ou les comportements que vous aurez ajoutés au modèle sont activés. | ||
+ | |||
+ | Charger les données initiales dans la base de données est aussi simple que d' | ||
+ | |||
+ | symfony propel: | ||
+ | |||
+ | Le voir en action dans le navigateur | ||
+ | |||
+ | Nous avons beaucoup utilisé l' | ||
+ | |||
+ | Voyons comment afficher la liste des postes, comment éditer un poste existant, et comment l' | ||
+ | |||
+ | Symfony est capable de générer automatiquement pour un modèle un module qui fournit des fonctionnalités basiques. Entrer les commandes suivantent pour les frontend affiliate, category et job : | ||
+ | |||
+ | symfony propel: | ||
+ | |||
+ | symfony propel: | ||
+ | |||
+ | symfony propel: | ||
+ | |||
+ | symfony propel: | ||
+ | |||
+ | Cette commande génère un module job dans l' | ||
+ | |||
+ | ^ Directory ^ Description ^ | ||
+ | | actions | Les actions du module | | ||
+ | | templates | Les gabarits du module | | ||
+ | |||
+ | Le fichier actions/ | ||
+ | |||
+ | ^ Action name ^ Description ^ | ||
+ | | index | Affiche les enregistrements de la table | | ||
+ | | show | Affiche les champs d'un enregistrement donné | | ||
+ | | new | Affiche un formulaire pour créer un nouvel enregistrement | | ||
+ | | create | Créer un nouvel enregistrement | | ||
+ | | edit | Affiche un formulaire pour éditer un enregistrement | | ||
+ | | update | Mise à jour d'un enregistrement avec les données soumises | | ||
+ | | delete | Efface un enregistrement donné | | ||
+ | |||
+ | Vous pouvez tester dès maintenant les modules dans votre navigateur : | ||
+ | |||
+ | http:// | ||
+ | |||
+ | http:// | ||
+ | |||
+ | http:// | ||
+ | |||
+ | http:// | ||
+ | |||
+ | Je vous suggère d' | ||
+ | |||
+ | ==== Modification du cadre global des pages ==== | ||
+ | |||
+ | La mise en page par défaut d'une application est appelée layout.php et se trouve dans le dossier " | ||
+ | |||
+ | Avec la commande : | ||
+ | |||
+ | kate apps/ | ||
+ | |||
+ | Remplacez le contenu par défaut du fichier par le code suivant : | ||
+ | |||
+ | < | ||
+ | <!-- apps/ | ||
+ | < | ||
+ | " | ||
+ | <html xmlns=" | ||
+ | < | ||
+ | < | ||
+ | <link rel=" | ||
+ | <?php include_javascripts() ?> | ||
+ | <?php include_stylesheets() ?> | ||
+ | </ | ||
+ | < | ||
+ | <div id=" | ||
+ | <div id=" | ||
+ | <div class=" | ||
+ | < | ||
+ | <img src="/ | ||
+ | </ | ||
+ | |||
+ | <div id=" | ||
+ | <div class=" | ||
+ | < | ||
+ | <div> | ||
+ | <a href="<? | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <div class=" | ||
+ | < | ||
+ | <form action="" | ||
+ | <input type=" | ||
+ | id=" | ||
+ | <input type=" | ||
+ | <div class=" | ||
+ | Enter some keywords (city, country, position, ...) | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <div id=" | ||
+ | <?php if ($sf_user-> | ||
+ | <div class=" | ||
+ | <?php endif; ?> | ||
+ | |||
+ | <?php if ($sf_user-> | ||
+ | <div class=" | ||
+ | <?php endif; ?> | ||
+ | |||
+ | <div class=" | ||
+ | <?php echo $sf_content ?> | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <div id=" | ||
+ | <div class=" | ||
+ | <span class=" | ||
+ | <img src="/ | ||
+ | powered by <a href=" | ||
+ | <img src="/ | ||
+ | </ | ||
+ | <ul> | ||
+ | < | ||
+ | <li class=" | ||
+ | < | ||
+ | <li class=" | ||
+ | </ul> | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Un template Symfony n'est ni plus ni moins qu'un fichier PHP. Dans le template layout, vous trouverez des appels à des fonctions PHP et des références à des variables PHP. sf_content est la variable la plus intéressante : elle est définie par le framework lui-même et contient le code HTML généré par l' | ||
+ | |||
+ | Si vous parcourez le module job avec votre navigateur : | ||
+ | |||
+ | http:// | ||
+ | |||
+ | Vous verrez que toutes les actions sont mises en page selon le modèle défini dans le layout. | ||
+ | |||
+ | Nous utiliserons les images et les fichiers CSS du tutoriel Jobeet, sans les modifier pour ne pas alourdir le présent texte. Vous de jouer avec ces fichiers si le coeur vous en dit. | ||
+ | |||
+ | Télécharger et décompresser les archives et l' | ||
+ | |||
+ | http:// | ||
+ | |||
+ | Copier le dossier " | ||
+ | |||
+ | http:// | ||
+ | |||
+ | Copier le dossier " | ||
+ | |||
+ | http:// | ||
+ | |||
+ | Copier l' | ||
+ | |||
+ | Vider la cache avec la commande : | ||
+ | |||
+ | symfony cc | ||
+ | |||
+ | Recharger les pages pour les voir enjolivée des nouveaux ajouts. | ||
+ | |||
+ | http:// | ||
+ | |||
+ | http:// | ||
+ | |||
+ | http:// | ||
+ | |||
+ | http:// | ||
+ | |||
+ | ===== Principes de configuration dans Symfony ===== | ||
+ | |||
+ | Par défaut, la tâche generate: | ||
+ | |||
+ | Bien que le fichier main.css n'est défini nul part dans le layout par défaut, il est nécessairement présent dans le code HTML généré. Mais pas les autres. Comment est-ce possible ? | ||
+ | |||
+ | ==== Les helper ==== | ||
+ | |||
+ | La feuille de style a été inclue grâce à la fonction include_stylesheets() située entre les balises < | ||
+ | |||
+ | Mais comment le helper sait quelle feuille de style inclure ? | ||
+ | |||
+ | La couche vue peut être paramétrée en éditant le fichier de configuration view.yml de l' | ||
+ | |||
+ | < | ||
+ | # apps/ | ||
+ | default: | ||
+ | http_metas: | ||
+ | content-type: | ||
+ | |||
+ | metas: | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | stylesheets: | ||
+ | |||
+ | javascripts: | ||
+ | |||
+ | has_layout: | ||
+ | layout: | ||
+ | </ | ||
+ | |||
+ | Le fichier view.yml contient les paramètres par défaut (default) pour tous les templates de l' | ||
+ | |||
+ | Dans le fichier de configuration par défaut view.yml, le fichier référence est main.css, et non pas css/ | ||
+ | |||
+ | Si plusieurs fichiers sont définis, Symfony les inclura dans le même ordre que celui dans lequel ils ont été définis : | ||
+ | |||
+ | stylesheets: | ||
+ | |||
+ | Vous pouvez également définir l' | ||
+ | |||
+ | stylesheets: | ||
+ | |||
+ | Cette configuration génèrera le code suivant : | ||
+ | |||
+ | <link rel=" | ||
+ | <link rel=" | ||
+ | <link rel=" | ||
+ | <link rel=" | ||
+ | |||
+ | Le fichier de configuration view.yml définit également le layout utilisé par défaut pour l' | ||
+ | |||
+ | Tel quel, le site répond à nos attentes. Le fichier jobs.css est uniquement utile pour la page d' | ||
+ | |||
+ | Sous les sections indexSuccess et showSuccess (qui sont les noms des templates associés aux actions index et show, comme nous le verrons plus tard), vous pouvez personnaliser les entrées se trouvant sous la section default du fichier view.yml de l' | ||
+ | |||
+ | Pour beaucoup de fichiers de configuration de Symfony, un même paramètre peut être définit à différents niveaux : | ||
+ | |||
+ | - Au niveau du framework lui-même | ||
+ | - Au niveau du projet (dans le répertoire config/) | ||
+ | - A un niveau plus local, celui de l' | ||
+ | - Au niveau restreint au module (dans le répertoire apps/ | ||
+ | |||
+ | Lors de l' | ||
+ | |||
+ | En règle générale, quand quelque chose est configurable via un fichier de configuration, | ||
+ | |||
+ | <?php use_stylesheet(' | ||
+ | |||
+ | Vous pouvez également utiliser ce helper dans le layout pour inclure une feuille de style globale à l' | ||
+ | |||
+ | Le choix entre une méthode ou l' | ||
+ | |||
+ | De la même manière, la configuration JavaScript est faite via l' | ||
+ | |||
+ | La page d' | ||
+ | |||
+ | Comme déjà vu, la page d' | ||
+ | |||
+ | < | ||
+ | apps/ | ||
+ | frontend/ | ||
+ | modules/ | ||
+ | job/ | ||
+ | actions/ | ||
+ | actions.class.php | ||
+ | templates/ | ||
+ | indexSuccess.php | ||
+ | </ | ||
+ | |||
+ | ==== L' | ||
+ | |||
+ | Chaque action est représentée par une méthode de classe. Pour la page d' | ||
+ | |||
+ | |||
+ | < | ||
+ | // apps/ | ||
+ | class jobActions extends sfActions | ||
+ | { | ||
+ | public function executeIndex(sfWebRequest $request) | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | // ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Analysons de plus près le code : la méthode executeIndex() (couche Contrôleur) appelle la (couche) Modèle Projet01JobPeer pour renvoyer tous les jobs (new Criteria()). Le modèle renvoie un tableau d' | ||
+ | |||
+ | Toutes les propriétés des objets sont automatiquement passées au template (la couche Vue). Pour transmettre des données du Contrôleur à la Vue, il vous suffit simplement de créer une nouvelle propriété : | ||
+ | |||
+ | < | ||
+ | public function executeFooBar(sfWebRequest $request) | ||
+ | { | ||
+ | $this-> | ||
+ | $this-> | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Cette méthode rendra les variables $foo et $bar accessibles depuis le template. | ||
+ | Le Template | ||
+ | |||
+ | Par défaut, le nom du template associé à l' | ||
+ | |||
+ | Le template indexSuccess.php génère une table HTML pour tous les jobs : | ||
+ | |||
+ | < | ||
+ | <!-- apps/ | ||
+ | < | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <tr> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | <!-- more columns here --> | ||
+ | < | ||
+ | < | ||
+ | </tr> | ||
+ | </ | ||
+ | < | ||
+ | <?php foreach ($projet01_job_list as $projet01_job): | ||
+ | <tr> | ||
+ | <td> | ||
+ | <a href="<? | ||
+ | <?php echo $projet01_job-> | ||
+ | </a> | ||
+ | </td> | ||
+ | < | ||
+ | < | ||
+ | <!-- more columns here --> | ||
+ | < | ||
+ | < | ||
+ | </tr> | ||
+ | <?php endforeach; ?> | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <a href="<? | ||
+ | </ | ||
+ | |||
+ | Dans ce code, la boucle foreach parcourt la liste d' | ||
+ | |||
+ | Souvenez-vous, | ||
+ | |||
+ | Faisons un peu de tri dans tout ça afin de n' | ||
+ | |||
+ | < | ||
+ | <!-- apps/ | ||
+ | <?php use_stylesheet(' | ||
+ | |||
+ | <div id=" | ||
+ | <table class=" | ||
+ | <?php foreach ($projet01_job_list as $i => $job): ?> | ||
+ | <tr class="<? | ||
+ | <td class=" | ||
+ | <td class=" | ||
+ | <a href="<? | ||
+ | <?php echo $job-> | ||
+ | </a> | ||
+ | </td> | ||
+ | <td class=" | ||
+ | </tr> | ||
+ | <?php endforeach; ?> | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | La fonction url_for() utilisée dans ce template est un helper Symfony. | ||
+ | |||
+ | === Le template de la page d'un job === | ||
+ | |||
+ | Personnalisons maintenant le template de la page d'un job. Ouvrez le fichier showSuccess.php avec la commande | ||
+ | |||
+ | kate apps/ | ||
+ | |||
+ | Remplacez son contenu par le code suivant : | ||
+ | |||
+ | < | ||
+ | <?php use_stylesheet(' | ||
+ | <?php use_helper(' | ||
+ | |||
+ | <div id=" | ||
+ | < | ||
+ | < | ||
+ | <h3> | ||
+ | <?php echo $job-> | ||
+ | < | ||
+ | </h3> | ||
+ | |||
+ | <?php if ($job-> | ||
+ | <div class=" | ||
+ | <a href="<? | ||
+ | <img src="/ | ||
+ | alt="<? | ||
+ | </a> | ||
+ | </ | ||
+ | <?php endif; ?> | ||
+ | |||
+ | <div class=" | ||
+ | <?php echo simple_format_text($job-> | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | |||
+ | <p class=" | ||
+ | |||
+ | <div class=" | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | <div style=" | ||
+ | <a href="<? | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Ce template utilise la variable $job passée en paramètre par l' | ||
+ | |||
+ | < | ||
+ | <?php | ||
+ | |||
+ | /** | ||
+ | * job actions. | ||
+ | * | ||
+ | * @package | ||
+ | * @subpackage job | ||
+ | * @author | ||
+ | * @version | ||
+ | */ | ||
+ | class jobActions extends sfActions | ||
+ | { | ||
+ | public function executeIndex(sfWebRequest $request) | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | public function executeShow(sfWebRequest $request) | ||
+ | { | ||
+ | $this-> | ||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | public function executeNew(sfWebRequest $request) | ||
+ | { | ||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | public function executeCreate(sfWebRequest $request) | ||
+ | { | ||
+ | $this-> | ||
+ | |||
+ | $this-> | ||
+ | |||
+ | $this-> | ||
+ | |||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | public function executeEdit(sfWebRequest $request) | ||
+ | { | ||
+ | $this-> | ||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | public function executeUpdate(sfWebRequest $request) | ||
+ | { | ||
+ | $this-> | ||
+ | $this-> | ||
+ | $this-> | ||
+ | |||
+ | $this-> | ||
+ | |||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | public function executeDelete(sfWebRequest $request) | ||
+ | { | ||
+ | $request-> | ||
+ | |||
+ | $this-> | ||
+ | $projet01_job-> | ||
+ | |||
+ | $this-> | ||
+ | } | ||
+ | |||
+ | protected function processForm(sfWebRequest $request, sfForm $form) | ||
+ | { | ||
+ | $form-> | ||
+ | if ($form-> | ||
+ | { | ||
+ | $projet01_job = $form-> | ||
+ | |||
+ | $this-> | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Remarquez que certains accesseurs Propel prennent des paramètres. Comme nous avons défini la colonne created_at de type timestamp, l' | ||
+ | |||
+ | $job-> | ||
+ | |||
+ | La description d'un job utilise le helper simple_format_text() afin de formater le texte en HTML, en remplaçant notamment les retours chariots par des balises <br />. Comme ce helper fait parti du groupe Text et que celui-ci n'est pas chargé par défaut, nous le chargeons manuellement en utilisant le helper use_helper(). | ||
+ | |||
+ | |||
+ | ===== Liens utiles ===== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== Les tutoriels ==== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | Configuration SVN pour un projet Symfony]] | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ===== Autres pages en lien avec les sujets ===== | ||
+ | |||
+ | {{topic> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | // | ||