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
10 commentaires:
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 ...
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
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
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
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)
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
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
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
Keep this going please, great job!
Here is my website Boutique Guess
Enregistrer un commentaire