Symfony: Configuration et mise en place de la BDD jobeet
Dans la première partie de ce mini tuto, nous avons configuré notre environnement de développement et installé le framework Symfony. Toujours en suivant la logique du projet jobeet, nous allons mettre en place rapidement et simplement la base de données et le premier module du projet.
Symfony étant un framework orienté objet, nous allons favoriser l'utilisation des objets au lieu d'instructions SQL pour accéder aux enregistrements de la base de données. Symfony nous livre deux outils ORM simples et efficaces pour le faire : Propel et Doctrine. Dans le cadre de notre projet, nous n'utiliserons que Doctrine.
Nous allons tout d'abord fournir à l'ORM une description des tables et leurs relations pour créer les classes.
Pour ce faire, éditez le fichier schema.yml
Copiez ces lignes à l'intérieur du fichier (Ces lignes renseignent sur la description des tables et leurs relations sous le format Yaml)
Création de la base de données
On choisira comme base de données dans cet exemple, MySQL sinon toutes les bases de données supportant PDO (PostgreSQL, SQLite, Oracle, MSSQL) sont compatibles avec symfony.
Installons tout d'abord un MySQL-client 5.1
Le mot de passe entrée pendant l'installation correspondra désormais au mot de passe d'accès à la base de données. Le nom d'utilisateur est root.
lancez la commande suivante :
On vous demande d'entrer votre mot de passe. Entrez celui que vous avez défini lors de l'installation de MySQL.
On configure Symfony pour qu'il puisse utiliser cette base de données pour le projet. Remplacez MotdePasse par le mot de passe d'accès à la base de données (celui défini lors de l'installation de mysql)
Nous allons maintenant générer les requêtes SQL pour construire nos tables grâce au fichier schema.yml que nous avons crée au début du tutoriel.
On construit d'abord les modèles :
Ensuite on génère le code :
Enfin on insère le code dans la base de données
Très souvent les utilisateurs rencontrent un problème à ce niveau. La commande renvoie le message d'erreur suivant : Couldn't locate driver named mysql
Si vous vous retrouvez dans une telle situation, exécutez les commandes suivantes :
Installez pears et php5-dev
Installez pdo
Installez pdo_mysql
Si vous obtenez une erreur du genre :
lancez la commande
ensuite relancez l'installation de pdo_mysql.
Mettez à jour votre base de données des fichiers.
Éditez le fichier de configuration /etc/php5/apache2/php.ini et /etc/php5/cli/php.ini
Copiez ces deux lignes à la fin des fichiers
Redémarrez Apache
Et
(Merci à theatons pour cette dernière partie )
Maintenant que nous avons une base de données pleinement fonctionnelle, nous allons y insérer les données initiales (création d'un compte administrateur et les données de tests)
Téléchargez ces deux images.
Éditez le fichier data/fixtures/categories.yml
Collez ces lignes à l'intérieur du fichier
Éditez le deuxième fichier puis coller les lignes qui suivent à l'intérieur
On charge nos données dans la BDD.
Cette tâche va générer vos formulaires, vos filtres, vos modèles, supprimer votre base de données et re-créer toutes les tables.
La commande ci dessous nous permet de générer un module pour le modèle que nous avons défini avec des fonctions de manipulations de base.
Vous pouvez tester le module job dans votre navigateur :
Symfony étant un framework orienté objet, nous allons favoriser l'utilisation des objets au lieu d'instructions SQL pour accéder aux enregistrements de la base de données. Symfony nous livre deux outils ORM simples et efficaces pour le faire : Propel et Doctrine. Dans le cadre de notre projet, nous n'utiliserons que Doctrine.
Nous allons tout d'abord fournir à l'ORM une description des tables et leurs relations pour créer les classes.
Pour ce faire, éditez le fichier schema.yml
$ cd ~/sfprojects/jobeet
$ gedit config/doctrine/schema.yml
Copiez ces lignes à l'intérieur du fichier (Ces lignes renseignent sur la description des tables et leurs relations sous le format Yaml)
# config/doctrine/schema.yml
JobeetCategory:
actAs: { Timestampable: ~ }
columns:
name: { type: string(255), notnull: true, unique: true }
JobeetJob:
actAs: { Timestampable: ~ }
columns:
category_id: { type: integer, notnull: true }
type: { type: string(255) }
company: { type: string(255), notnull: true }
logo: { type: string(255) }
url: { type: string(255) }
position: { type: string(255), notnull: true }
location: { type: string(255), notnull: true }
description: { type: string(4000), notnull: true }
how_to_apply: { type: string(4000), notnull: true }
token: { type: string(255), notnull: true, unique: true }
is_public: { type: boolean, notnull: true, default: 1 }
is_activated: { type: boolean, notnull: true, default: 0 }
email: { type: string(255), notnull: true }
expires_at: { type: timestamp, notnull: true }
relations:
JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs }
JobeetAffiliate:
actAs: { Timestampable: ~ }
columns:
url: { type: string(255), notnull: true }
email: { type: string(255), notnull: true, unique: true }
token: { type: string(255), notnull: true }
is_active: { type: boolean, notnull: true, default: 0 }
relations:
JobeetCategories:
class: JobeetCategory
refClass: JobeetCategoryAffiliate
local: affiliate_id
foreign: category_id
foreignAlias: JobeetAffiliates
JobeetCategoryAffiliate:
columns:
category_id: { type: integer, primary: true }
affiliate_id: { type: integer, primary: true }
relations:
JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id }
JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }
JobeetCategory:
actAs: { Timestampable: ~ }
columns:
name: { type: string(255), notnull: true, unique: true }
JobeetJob:
actAs: { Timestampable: ~ }
columns:
category_id: { type: integer, notnull: true }
type: { type: string(255) }
company: { type: string(255), notnull: true }
logo: { type: string(255) }
url: { type: string(255) }
position: { type: string(255), notnull: true }
location: { type: string(255), notnull: true }
description: { type: string(4000), notnull: true }
how_to_apply: { type: string(4000), notnull: true }
token: { type: string(255), notnull: true, unique: true }
is_public: { type: boolean, notnull: true, default: 1 }
is_activated: { type: boolean, notnull: true, default: 0 }
email: { type: string(255), notnull: true }
expires_at: { type: timestamp, notnull: true }
relations:
JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs }
JobeetAffiliate:
actAs: { Timestampable: ~ }
columns:
url: { type: string(255), notnull: true }
email: { type: string(255), notnull: true, unique: true }
token: { type: string(255), notnull: true }
is_active: { type: boolean, notnull: true, default: 0 }
relations:
JobeetCategories:
class: JobeetCategory
refClass: JobeetCategoryAffiliate
local: affiliate_id
foreign: category_id
foreignAlias: JobeetAffiliates
JobeetCategoryAffiliate:
columns:
category_id: { type: integer, primary: true }
affiliate_id: { type: integer, primary: true }
relations:
JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id }
JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }
Création de la base de données
On choisira comme base de données dans cet exemple, MySQL sinon toutes les bases de données supportant PDO (PostgreSQL, SQLite, Oracle, MSSQL) sont compatibles avec symfony.
Installons tout d'abord un MySQL-client 5.1
Le mot de passe entrée pendant l'installation correspondra désormais au mot de passe d'accès à la base de données. Le nom d'utilisateur est root.
# sudo apt-get install mysql-server-5.1
lancez la commande suivante :
$ mysqladmin -uroot -p create jobeet
On vous demande d'entrer votre mot de passe. Entrez celui que vous avez défini lors de l'installation de MySQL.
On configure Symfony pour qu'il puisse utiliser cette base de données pour le projet. Remplacez MotdePasse par le mot de passe d'accès à la base de données (celui défini lors de l'installation de mysql)
$ php symfony configure:database "mysql:host=localhost;dbname=jobeet" root MotdePasse
Nous allons maintenant générer les requêtes SQL pour construire nos tables grâce au fichier schema.yml que nous avons crée au début du tutoriel.
On construit d'abord les modèles :
$ cd ~/sfprojects/jobeet/
$ php symfony doctrine:build --model
$ php symfony doctrine:build --model
Ensuite on génère le code :
$ php symfony doctrine:build --sql
Enfin on insère le code dans la base de données
$ php symfony doctrine:insert-sql
Très souvent les utilisateurs rencontrent un problème à ce niveau. La commande renvoie le message d'erreur suivant : Couldn't locate driver named mysql
Si vous vous retrouvez dans une telle situation, exécutez les commandes suivantes :
Installez pears et php5-dev
# sudo apt-get install php-pear php5-dev
Installez pdo
# sudo pecl install pdo
Installez pdo_mysql
# sudo pecl install pdo_mysql
Si vous obtenez une erreur du genre :
checking for mysql_config... not found configure: error: Cannot find MySQL header files under ERROR: `/tmp/pear/temp/PDO_MYSQL/configure' failed
lancez la commande
# sudo apt-get install libmysqlclient15-dev
ensuite relancez l'installation de pdo_mysql.
Mettez à jour votre base de données des fichiers.
# sudo updatedb
Éditez le fichier de configuration /etc/php5/apache2/php.ini et /etc/php5/cli/php.ini
# sudo gedit /etc/php5/apache2/php.ini
# sudo gedit /etc/php5/cli/php.ini
# sudo gedit /etc/php5/cli/php.ini
Copiez ces deux lignes à la fin des fichiers
extension=pdo.so extension=pdo_mysql.so
Redémarrez Apache
# sudo /etc/init.d/apache2 restart
Et
$ php symfony doctrine:insert-sql
(Merci à theatons pour cette dernière partie )
Maintenant que nous avons une base de données pleinement fonctionnelle, nous allons y insérer les données initiales (création d'un compte administrateur et les données de tests)
Téléchargez ces deux images.
$ wget -P web/uploads/jobs/ http://www.symfony-project.org/get/jobeet/extreme-sensio.gif
$ wget -P web/uploads/jobs/ http://www.symfony-project.org/get/jobeet/sensio-labs.gif
$ wget -P web/uploads/jobs/ http://www.symfony-project.org/get/jobeet/sensio-labs.gif
Éditez le fichier data/fixtures/categories.yml
$ gedit data/fixtures/categories.yml
Collez ces lignes à l'intérieur du fichier
# data/fixtures/categories.yml
JobeetCategory:
design:
name: Design
programming:
name: Programming
manager:
name: Manager
administrator:
name: Administrator
JobeetCategory:
design:
name: Design
programming:
name: Programming
manager:
name: Manager
administrator:
name: Administrator
Éditez le deuxième fichier puis coller les lignes qui suivent à l'intérieur
$ gedit data/fixtures/jobs.yml
# data/fixtures/jobs.yml
JobeetJob:
job_sensio_labs:
JobeetCategory: programming
type: full-time
company: Sensio Labs
logo: sensio-labs.gif
url: http://www.sensiolabs.com/
position: Web Developer
location: Paris, France
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: true
is_activated: true
token: job_sensio_labs
email: job@example.com
expires_at: '2010-10-10'
job_extreme_sensio:
JobeetCategory: design
type: part-time
company: Extreme Sensio
logo: extreme-sensio.gif
url: http://www.extreme-sensio.com/
position: Web Designer
location: Paris, France
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: true
is_activated: true
token: job_extreme_sensio
email: job@example.com
expires_at: '2010-10-10'
JobeetJob:
job_sensio_labs:
JobeetCategory: programming
type: full-time
company: Sensio Labs
logo: sensio-labs.gif
url: http://www.sensiolabs.com/
position: Web Developer
location: Paris, France
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: true
is_activated: true
token: job_sensio_labs
email: job@example.com
expires_at: '2010-10-10'
job_extreme_sensio:
JobeetCategory: design
type: part-time
company: Extreme Sensio
logo: extreme-sensio.gif
url: http://www.extreme-sensio.com/
position: Web Designer
location: Paris, France
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: true
is_activated: true
token: job_extreme_sensio
email: job@example.com
expires_at: '2010-10-10'
On charge nos données dans la BDD.
$ php symfony doctrine:data-load
Cette tâche va générer vos formulaires, vos filtres, vos modèles, supprimer votre base de données et re-créer toutes les tables.
$ php symfony doctrine:build --all --and-load
La commande ci dessous nous permet de générer un module pour le modèle que nous avons défini avec des fonctions de manipulations de base.
$ php symfony doctrine:generate-module --with-show --non-verbose-templates frontend job JobeetJob
Vous pouvez tester le module job dans votre navigateur :
http://localhost:8080/frontend_dev.php/job
Tout devrait fonctionner normalement mais si toutefois vous obtenez une erreur sur la page du navigateur comme celle ci :
Dans le cas de lampp, copiez la ligne qui suit dans le fichier /opt/lampp/etc/php.ini :
sinon copiez cette ligne
/var/run/mysqld/mysqld.sock
N'oubliez surtout pas de redémarrer apache.
Tout devrait fonctionner normalement mais si toutefois vous obtenez une erreur sur la page du navigateur comme celle ci :
500 | Internal Server Error | Doctrine_Connection_Exception
PDO Connection Error: SQLSTATE[HY000] [2002] Invalid argument
Vous devez specifiez au fichier php.ini où trouver mysql.sock.Dans le cas de lampp, copiez la ligne qui suit dans le fichier /opt/lampp/etc/php.ini :
pdo_mysql.default_socket = /opt/lampp/var/mysql/mysql.sock
sinon copiez cette ligne
/var/run/mysqld/mysqld.sock
N'oubliez surtout pas de redémarrer apache.
# sudo /etc/init.d/apache2 restart