mardi 2 février 2010

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

$ 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 }


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

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

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

É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

É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'

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 :

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

 

10 commentaires:

SckyzO a dit…

Bonjour, je ne sais pas si tu es au courant, mais ton code est super sale ... Je te conseille de regarder sur le Planet-Libre la gueule de ton code pour voir que tu as des balise < pre > ou < span > un peu partout ...

Kamagatos a dit…
Ce commentaire a été supprimé par l'auteur.
Anonyme a dit…

Hello, this weekend is fastidious in support of me, for the reason that this point in time i
am reading this fantastic informative paragraph here at my residence.



my web page ... Air Jordan 2013

Anonyme a dit…

This is very interesting, You're a very skilled blogger. I've joined your feed and look forward to seeking more of your magnificent post.
Also, I have shared your site in my social networks!

Check out my blog post: related site

Anonyme a dit…

I believe that is one of the such a lot important info for me.

And i am satisfied reading your article. But wanna statement on some common things, The web site style is great,
the articles is actually great : D. Excellent task, cheers

Feel free to surf to my blog - next page

Anonyme a dit…

Valuable information. Lucky me I discovered your website accidentally, and
I am surprised why this twist of fate did not happened
in advance! I bookmarked it.

Look at my blog post; Tory Burch Outlet (http://www.ngosummit.com/tory-burch-outlet.html)

Anonyme a dit…

Hey! Do you know if they make any plugins to protect against hackers?
I'm kinda paranoid about losing everything I've worked hard on.
Any tips?

Also visit my web-site: Nike Free

Anonyme a dit…

Everyone loves what you guys are usually up too.
This type of clever work and reporting! Keep up the amazing works guys I've added you guys to my own blogroll.

Here is my site: Sac Louis Vuitton Pas Cher

Anonyme a dit…

I read this post fully regarding the difference of most recent and preceding technologies,
it's awesome article.

Feel free to visit my blog Sac Louis Vuitton

Anonyme a dit…

Keep this going please, great job!

Here is my website Boutique Guess