banniere
Ecrit par leknoppix le 9-12-2009 à 16:33:52
Les bases de donnee et les frameworks

Voici le troisième tutoriel de cette nouvelle série. Avant de rentrer dans le codage, nous allons nous arrêter sur les bases de données. Comme présenté dans le précédent article, le projet autour duquel va s'agencer les tutoriels est la création d'un blog assez simple. Dans une première partie, je vais présenter les fonctions de base du blog et dans une seconde, présenter la mise en place de la base de données en fonction du framework.

Qu'est ce qu'un blog?

Selon Wikipédia

Un blog ou blogue est un site Web constitué par la réunion de billets agglomérés au fil du temps et souvent classés par ordre antéchronologique (les plus récents en premier). Chaque billet (appelé aussi « note » ou « article ») est, à l'image d'un journal de bord ou d'un journal intime, un ajout au blog ; le blogueur (celui qui tient le blog) y délivre un contenu souvent textuel, enrichi d'hyperliens et d'éléments multimédias, sur lequel chaque lecteur peut généralement apporter des commentaires.

Du point de vue administration, il s'agit d'un utilisateur qui publie des articles. Dans ce projet, il y aura un seul rédacteur même s'il est très simple d'en rajouter d'autre.

Il faudra donc créer une table d'identification contenant les informations sur l'administrateur. Ensuite pour l'article, il faut lister les informations le caractérisant: titre, contenu, date. Un article appartient à une catégorie, donc il sera nécessaire d'avoir une table catégorie. En dernier, tous les articles pourront être commentés par les visiteurs.

Je vous laisse créer votre base de donnée. Non, je vous ai tout fait, voici le schéma de la base de donnée, je l'ai effectué à l'aide du logiciel MySQLWorkbench qui permet de faire des schémas de base de données, mais également d'obtenir le script à exécuter dans phpmyadmin pour avoir directement la base de données.

schéma mysqlworkbrench

Et voici le code SQL:

 

-- -----------------------------------------------------
-- Table ``.`categories`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS ``.`categories` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `title` VARCHAR(255) NULL ,
  PRIMARY KEY (`id`) )
ENGINE = INNODB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
 
 
-- -----------------------------------------------------
-- Table ``.`posts`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS ``.`posts` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `title` VARCHAR(255) NULL ,
  `content` LONGTEXT NULL ,
  `DATE` DATETIME NULL ,
  `category_id` INT NULL ,
  PRIMARY KEY (`id`) ,
  CONSTRAINT `category_id`
    FOREIGN KEY (`category_id` )
    REFERENCES ``.`categories` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = INNODB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
 
CREATE INDEX `category_id` ON ``.`posts` (`category_id` ASC) ;
 
 
-- -----------------------------------------------------
-- Table ``.`comments`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS ``.`comments` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `pseudo` VARCHAR(250) NULL ,
  `mail` VARCHAR(250) NULL ,
  `content` TEXT NULL ,
  `post_id` INT NULL ,
  PRIMARY KEY (`id`) ,
  CONSTRAINT `comments2post`
    FOREIGN KEY (`post_id` )
    REFERENCES ``.`posts` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = INNODB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
 
CREATE INDEX `comments2post` ON ``.`comments` (`post_id` ASC) ;
 
 
-- -----------------------------------------------------
-- Table ``.`user`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS ``.`user` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `login` VARCHAR(150) NULL ,
  `password` VARCHAR(150) NULL ,
  PRIMARY KEY (`id`) )
ENGINE = INNODB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
 
 
 
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

 

 

Passons à la deuxième partie, l'installation de la base de données sur les deux Frameworks.

logo cakephp Base de donnée pour CakePHP

La mise en place de la base de données dans cakephp est très simple. Copiez le code SQL ci-dessous, puis collez-le dans phpmyadmin.

cakephp phpmyadmin

Ensuite, pour éviter des problèmes, il conviendra de vérifier les informations du fichier database.php présent dans le dossier config. Vérifier les identifiants de connexion ainsi que le nom de la base de données. Voila, le tour est joué et vous pouvez commencer à coder avec cakephp. Mais non, n'allez pas si vite, maintenant, passons à symfony.

logo symfony Base de donnée pour Symfony

La première étape consiste à créer le projet, c'est à dire à lancer le projet. Pour cela, ouvrez votre terminal et tapez les instructions suivantes:

cd /home/projetbysymfony/nom_du_projet
php lib/vendor/symfony/data/bin/symfony generate:project monblog

Ici le "monblog" après projet est le nom du projet. Cette action aura pour but la création de nouveau dossier et fichier nécessaire pour l'exécution et la réalisation du projet. Ci après, un aperçu des fichiers et dossiers créés automatiquement:

fichier créer automatiquement

Maintenant pour pouvoir installer la base de données, nous devons créer une partie du projet. Le projet va être constitué de deux zones, le frontend (ou partie visible du blog) et le backend (backoffice, la zone administration). Grâce à symfony, une instruction en ligne de commande permettra de générer le frontend. Dans le même terminal que le précédent, tapez les instructions suivantes: 

php symfony generate:app --escaping-strategy=on --csrf-secret="UniqueSecret" frontend

Cette instruction créera dans le dossier web, le dossier frontend ainsi que d'autres dossiers qui permettront de contenir les fichiers de configuration, les scripts php, les templates ....

Maintenant, nous allons devoir créer un hote virtuel afin de pouvoir accéder à notre projet. Je vais vous montrer la méthode qui fonctionne sur mon ordinateur en local, mais il ne s'agit pas de la meilleure. Pour ajouter ce virtualhost, il faut éditer le fichier httpd.conf de Apache et y ajouter, à la fin le code suivant:

Listen 127.0.0.1:8080
 
<VirtualHost 127.0.0.1:8080>
  DocumentRoot "/home/projetbysymfony/nom_du_projet/web"
  DirectoryIndex index.php
  <Directory "/home/projetbysymfony/nom_du_projet/web">
    AllowOverride All
    Allow from All
  </Directory>
 
  Alias /sf /home/projetbysymfony/nom_du_projet/lib/vendor/symfony/data/web/sf
  <Directory "/home/projetbysymfony/nom_du_projet/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost> 

Maintenant pour accéder à votre projet, il faudra taper dans le navigateur l'adresse http://localhost:8080/. Si tout a fonctionnée, vous devriez accéder à un écran dans ce genre.

symfony fonctionnel

Nous allons maintenant passer à la configuration de la base de donnée. Pour ne pas changer, nous allons devoir utiliser une ligne de commande. La première étape est de créer une base de données. Dans mon cas, elle s'appelle pre_symfony_tutorial. Maintenant, je tape et complète les informations nécessaires pour la configuration du fichier.

php symfony configure:database --name=doctrine --class=sfDoctrineDatabase "mysql:host=NOMDUHOST;dbname=NOMDELABASEDEDONNEE" USER PASSWORD

Cette instruction aura pour effet la création d'un fichier config/databases.yml contenant les informations au dessus.

Contrairement à cakePHP, symfony présente une couche ORM qui permet de faciliter la création de la base de données ainsi que de leurs interractions. Il existe deux types de système d'ORM inclut dans symfony, mais l'un deux, ne présente plus de communauté de développement pour un maintien à jour, pour la suite des tutoriels nous utiliserons doctrine.

Nous allons donc désactiver Propel et mettre en avant Doctrine. Nous allons éditer le fichier config/ProjectConfiguration.class.php.

<?php
class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->enableAllPluginsExcept(array('sfPropelPlugin','sfCompat10Plugin'));
  }
}
?>

Il faut ensuite vider le cache.

php symfony cc

Nous devons maintenant activer un plugin pour rendre tout fonctionnel. 

php symfony plugin:publish-assets

Pour éviter de faire des erreurs dans la suite du tutoriel ou même du développement, il apparait interressant de supprimer propel pour éviter toutes erreurs. Pour cela, il suffit de supprimer le dossier sfPropelPlugin 

rm -rf config/propel.ini config/schema.yml web/sfPropelPlugin

Maintenant, reprenez le code sql situé plus haut et insérez le dans phpmyadmin. Je suis sûr que vous vous demandez à quoi va servir doctrine. Pas si vite, j'arrive....

Editez le fichier config/databases.yml et remplacez le contenu présent par celui qui suit: 

dev:
 
test:
 
all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: "mysql:host=NOMDUHOST;dbname=NOMDELABASEDEDONNEE"
      username: USER
      password: PASSWORD

Il ne manque plus qu'à taper une instruction pour générer la relation entre symfony et la base de données.

symfony doctrine:build-schema

Cette action génèrera un fichier yum qui sera très utile par la suite, il contiendra les différents champs de la base de données ainsi que les relations.

Voila ce tutoriel est fini pour aujourd'hui. Vous avez pu remarquer une grosse différence entre ces deux frameworks, l'un est très rapide et l'autre est plus pénible vu qu'il nécessite énormément de lignes de commande. Je ne vais pas vous rassurer, symfony c'est un framework fonctionnant beaucoup avec les lignes de commande, mais beaucoup de commandes permettent de gagner du temps, nous le verrons dans les prochains tutoriels.

Si vous avez des problèmes, n'hésitez pas à poster à la suite du tutoriel.

 

 

 

 

Publier sur mon compte twitterPublier sur mon viadeoPublier sur mon deliciousPublier sur mon compte twitter

Ajoute ton commentaire

Pseudo : *
E-Mail : *
MSN :
Site internet :
Blog :
Note : *
Commentaire : *
Ne pas compléter :

Le 23-01-2010 à 0:07:51 par Nami-Doc

avataret symfony doctrine:build --all ;) ?

Note :  notenotenotenotenote
Le 3-01-2010 à 9:33:56 par zaxxon77

avatarMerci pour ce tuto, je pense que la philosophie des 2 frameworks est vraiment différente. Cakephp c'est la base de donnée qui est référent, du coup on utilise les outils classiques de base de donnée (sql, myadmin). Sf c'est le schema.yml qui est le référent et qui génère la base de donnée. (Avec ce dernier il est plus simple de créer sa base en créant le schema.yml en premier, il ne nécessite pas d'autre outil).

Note :  notenotenotenotenote
© 2007-2017