La base de données et le projet: Watch My Desk
Dans cette deuxième partie, nous allons définir le projet Watch My Desk plus en détail, sa base de données ...
Ensuite, nous verrons comment configurer correctement Symfony avec notre base de données et générer le schéma de la BDD à partir de nos tables MySQL précédemment créées.
Le projet Watch My Desk
Afin d'illustrer le tutorial, j'ai pensé à créer un site qui soit à la fois fun, pas complètement inutile et suffisamment complexe pour voir un peu tous les points spécifiques du
framework Symfony.
Mise en contexte
Tout bon développeur, graphiste ou acteur du web a souvent du matériel informatique à la pointe de la technologie.
En général votre espace de travail, à savoir votre bureau, est un lieu qui vous tient très à coeur et que vous tentez (certains au moins !) de garder ergonomique, propre et design comme lorsque vous développez ou designez.
Watch My Desk
Watch My Desk est un
portail communautaire présentant
les bureaux des acteurs du web.
Chaque internaute aura la possibilité de mettre en ligne la description de son bureau, accompagné par une ou plusieurs photos mettant en évidence son matériel et son espace de travail.
Chaque internaute aura la possibilité de consulter ces "fiches bureaux" et d'y poster un commentaire, de le noter etc.
Sur la homepage, un classement des bureaux les plus populaires et plus récents sera affiché.
Ce projet est parti d'un passe temps personnel. En effet j'aime voir sur quoi travail telle ou telle personne derrière son écran. Et je pense ne pas être le seul !
[h4]Les modules et fonctionnalités[h4]
- Frontend:
Index:
- 5 Derniers bureaux postés (images miniatures) description...
- 5 Bureaux les plus populaires (images miniatures) description...
- Accès rapides pour: S'inscrire, s'identifier, retrouver son mdp.
Liste des bureaux:
- Simple liste paginable avec les miniatures des bureaux et une courte description
- Classements: Par titre, par auteur, par popularité, par date d'ajout
Détail des bureaux:
Lors du clic sur un bureau, on affiche le détail de ce dernier:
- Titre
- Photo principale en grand
- Liste des autres photos en miniatures: Au clic, la photo se charge à la place de la principale
- Description de l'auteur
- Auteur
- Date d'ajout
- Note: assez visible (et permettre de voter juste à coté)
- Classement: Position suivant la note et nbr votants
- Commentaires: En bas
- Permettre d'ajouter un commentaire
S'inscrire:
Formulaire d'inscription ultra simplifié: Login / Pass / Email / Pays
Poster un bureau (être identifié)
- Formulaire complet:
- Titre
- Multi Upload pour les photos
- Choix de l'image principale
- Description
Voir le profil d'un membre
- Ses commentaires
- Ses bureaux
- son Pays
- Backend
Gestion des membres
- Liste
- Ajout
- Modification
- Suppression
- Infos sur un membre: Dates d'inscription, IP d'inscription, niveau, statistiques: Coms + bureaux + notes
Gestion des commentaires
Gestion des bureaux
- Liste des bureaux en attente de validation
- Valider la mise en ligne d'un bureau
- Liste des bureaux validés
- Ajout
- Modification
- Suppression
Statistiques
- Nombre de bureaux: A valider / Publiés
- Nombre de commentaires
- Nombre de membres
Voilà en gros les fonctionnalités qui devront être présentes sur notre site. Il se peut que l'on en supprime en court de route, si le temps nous manque, mais voici la base que je me suis fixé.
La base de données MySQL
Maintenant que l'on a vu quelles fonctionnalités seront présentes dans notre projet, passons à la base de données.
Avec Symfony, vous avez deux possibilités pour gérer votre base de données:
- Soit vous créer le SQL dans votre base puis vous générez le schéma de la BDD
- Soit vous créer manuellement le schéma de la base avec un fichier de configuration YML puis vous générez le SQL
En ce qui me concerne, je préfère créer la base de données visuellement avec MySQL Workbench pour bien réfléchir à tous les champs et liaisons, générer le SQL qui en découle, puis générer le schéma de la BDD Symfony.
MySQL Workbench
Si vous ne connaissez pas encore ce merveilleux outil gratuit, je vous invite à
consulter ce billet.
MySQL Workbench à l'avantage de créer toutes les contraintes MySQL comme les clés primaires, étrangères, index etc. Très utiles par la suite dans notre projet Symfony.
Le schéma de notre base de données ne va pas être très compliqué.
Membres
Un membre peut poster un ou plusieurs bureaux
Un membre peut poster un ou plusieurs commentaires
Un membre peut voter pour un ou plusieurs bureaux
Votes
Un vote est associé à un membre et à un bureau donné
Un vote comporte une note sur 20
Commentaires
Un commentaire est associé à un membre et un bureau donné
Il comporte un état: 1 = Publié / 0 = en attente de publication / 2 = Modéré
Bureaux
Un bureau est posté par un membre
Un bureau peut avoir plusieurs commentaires
Un bureau est soumis aux votes des membres, ce qui lui donne une note finale stockée dans la table
Un bureau est classé, en fonction de ses votes et sa note
Un bureau dispose d'une photo principale et peut avoir d'autres photos complémentaires
Photos
Une photo est associée à un bureau donné
Chaque photo est stockée sur le serveur, on conserve son URL dans la table
Voilà en ce qui concerne le schéma de la BDD du projet.
Vous pouvez maintenant générer le SQL du schéma:
Sauvegardez votre fichier SQL exporté.
Créez ensuite un nouveau compte MySQL avec une base de données vierge sur laquelle l'utilisateur MySQL aura tous les droits.
Exemple avec phpMyAdmin: Privilèges > Ajouter un utilisateur
Il ne vous reste plus qu'à importer le SQL des tables que l'on a créé avec MySQL Workbench.
Vous pouvez télécharger le SQL:
Sur la Ferme du Web
Vérifiez bien que toutes vos tables aient bien été créées.
Nous sommes prêts pour passer à la configuration de notre projet Symfony !
Générer le schéma de la BDD sous Symfony
Repassons à notre projet Symfony, vous pouvez réouvrir votre console SSH sur votre serveur.
Un ORM pour gérer la base de données: Propel ou Doctrine
Symfony utilise un ORM pour gérer les requêtes et accès en base de données.
ORM pour Object-Relational Mapping.
Pour faire simple, un ORM permet de créer des objets à partir des tables d'une base de données fonctionnelle. C'est en quelque sorte une couche entre les objets d'un langage et les tables d'une base de données.
Symfony supporte deux ORM PHP5: Propel et Doctrine.
Toutefois, l'avenir de Propel est limité, contrairement à celui de Doctrine.
Jetez un coup d'oeil à ce billet
comparatif entre les deux ORMs Doctrine et Propel.
Dans ce tutorial, nous prendront en charge l'ORM Doctrine.
Configurer les accès à la base de données
Commençons par configurer les accès à notre base de données dans symfony.
Pour le faire, vous pouvez utiliser la commande suivante:
symfony configure:database --name=doctrine --class=sfDoctrineDatabase
"mysql:host=localhost;dbname=watchmydesk" watchmydesk PASS_USER_MYSQL_WATCHMYDESK |
(Commande sur une ligne)
En remplaçant bien les valeurs par les votre. (Nom de la base, utilisateur MySQL et mot de passe de la base).
Jetons un oeil au fichier de configuration de la base de données:
nano config/databases.yml |
Vous devriez avoir quelque chose comme ceci:
|
dev:
propel:
param:
classname: DebugPDO
test:
propel:
param:
classname: DebugPDO
all:
propel:
class: sfPropelDatabase
param:
classname: PropelPDO
dsn: "mysql:dbname=watchmydesk;host=localhost"
username: root
password: null
encoding: utf8
persistent: true
pooling: true
doctrine:
class: sfDoctrineDatabase
param:
dsn: "mysql:host=localhost;dbname=watchmydesk"
username: watchmydesk
password: PASS_USER_MYSQL_WATCHMYDESK |
Tous les fichiers de configuration dans Symfony, utilisent un format favorisant la lecture, le YAML, fichiers ayant pour extension: .yml
Vous l'aurez vite compris, le YAML se structure hiérarchiquement en utilisant un double espace (Attention à ne pas mettre de tabulation ! Seulement un double espace.)
Pour revenir à notre fichier de configuration database.yml, vous pouvez voir qu'il reste des instructions dédiées à Propel, qui est l'ORM par défaut dans Symfony 1.2
Nous allons donc devoir faire du ménage, comme ceci:
|
dev:
test:
all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: "mysql:host=localhost;dbname=watchmydesk"
username: watchmydesk
password: PASS_USER_MYSQL_WATCHMYDESK |
Sauvegardez le fichier une fois les modifications faites.
Pour le moment, nous ne pouvons toujours pas utiliser Doctrine car Propel est toujours activé, il faut donc procéder à quelques modifications supplémentaires pour l'éradiquer complètement.
nano config/ProjectConfiguration.class.php |
Modifiez ensuite la ligne suivante:
|
$this->enableAllPluginsExcept(array("sfDoctrinePlugin", "sfCompat10Plugin")); |
Comme ceci:
|
$this->enableAllPluginsExcept(array("sfPropelPlugin", "sfCompat10Plugin")); |
Ainsi, nous désactivons le module Propel et activons doctrine.
Quelques fichiers spécifiques à Propel demeurent encore dans notre projet, supprimons-les:
rm -rf config/propel.ini config/schema.yml web/sfPropelPlugin |
Et créons le répertoire dédié à doctrine qui stockera le schema.yml généré:
Pour que Symfony prenne en compte nos modifications, nous allons supprimer le cache:
Et installer le nouveau plugin doctrine à l'aide de cette commande:
symfony plugin:publish-assets |
Génération du schéma de la BDD dans Symfony
Symfony doit connaitre à tout moment les relations entre vos tables, les champs, contraintes etc. afin de pouvoir utiliser correctement les fonctions de Doctrine.
Symfony stocke un fichier schema.yml, encore un fichier de configuration YAML, qui représente votre base de données.
Comme nous avons déjà créé notre SQL, nous allons générer ce fichier à partir de notre base. Mais il aurait été possible de créer le fichier schema.yml à la main puis générer la base de données MySQL.
On génère le schéma:
symfony doctrine:build-schema |
Je vous conseille d'aller faire un tour dans le fichier pour comprendre comment cela fonctionne:
nano config/doctrine/schema.yml |
Voilà pour cette deuxième partie, nous attaquerons le MVC dès lundi prochain !