Petite surprise : on va apprendre un nouveau langage.

Mais pas de panique, c'est un langage très simple, utilisé pour définir le schéma de données de Doctrine.
Le langage Yaml
Ce langage est un langage de description, un peu comme le XML, mais moins lourd. Pour info, YAML est un acronyme récursif, tout comme PHP, et signifie
YAML Ain't Markup Language.
Comme vous allez le voir, la syntaxe du Yaml repose presque uniquement sur l'indentation du code. Attention, quelque chose de très important : l'indentation doit se faire
UNIQUEMENT AVEC DES ESPACES, jamais avec des tabulations.
Le langage repose sur ces règles principales :
- Les nombres (entiers, flottants, etc.) sont écrits naturellement.
- La valeur Null peut être indiquée avec null ou ~.
- Les booléens sont exprimés par true ou false.
- Les dates sont écrites au format ISO-8601, c'est-à-dire, par exemple, 2010-06-03 23:30:53.
- Les chaînes de caractères peuvent être écrites sans délimiteurs, délimitées par des simple quotes ('), ou par des doubles quotes ("). Lorsque la chaîne s'étend sur plusieurs lignes, il faut utiliser le symbole pipe | pour l'indiquer.
- Les paires clé/valeur sont séparées par ':'.
- Plutôt que l'indentation, on peut utiliser les symboles [] et {} pour indiquer explicitement un tableau, par exemple, tableau: { cle: valeur, cle2: valeur2 }. Les accolades indiquent des paires clé/valeur, les crochets indiquent simplement des valeurs. Par exemple : tableau: [valeur1, valeur2, valeur3].
- Les commentaires sont indiqués par #. Toute ligne contenant un # devient commentaire sur le reste de la ligne.
Ces règles sont très intuitives, voyez par vous-mêmes.
Le schéma
Voyons tout de suite le schéma que j'utiliserai dans la suite de ce tutoriel. Nous placerons tout ceci dans le fichier
~/config/schema.yml :
Code : Autre - ~/config/schema.yml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| # Cela représentera nos articles :
Article:
columns:
title:
type: string(255)
notnull: true
content:
type: string
notnull: true
user_id:
type: integer
relations:
User:
class: User
local: user_id
foreign: id
alias: User # Inutile, puisque l'alias par défaut est le nom de la classe.
foreignAlias: Articles
# Et là les utilisateurs :
User:
tableName: member
columns:
login:
type: string(255)
unique: true
notnull: true
password:
type: string(255)
notnull: true |
Détaillons maintenant le schéma ci-dessus. Les clés de premier niveau représentent nos classes (
Article et
User). Chaque classe sera représentée par une table dans la base de données. Doctrine déduit automatiquement le nom de la table, si on ne spécifie pas l'option
tableName.
À l'intérieur, on retrouve les clés
columns (qui contient la définition des colonnes de la table) et
relations (qui définit les relations entre les tables).
Les colonnes
Chaque colonne accepte plusieurs options, dont :
- type : un des types suivants : boolean, integer, float, decimal, string, blob, clob, timestamp, time, date, enum, gzip, array, object. Doctrine adapte ensuite le type utilisé dans la base de données selon ce que le SGBD supporte ;
- notnull : indique si le champ peut être vide ou s'il doit toujours contenir une valeur (true ou false) ;
- unique : indique si le champ doit être unique ou non (true ou false).
Vous avez dû remarquer que l'on peut indiquer comme type array ou object ; or, ces types n'existent pas dans un SGBD classique. En fait, Doctrine va s'occuper de sérialiser/désérialiser automatiquement la valeur de ces champs. Ils sont utiles lorsque l'on veut éviter de créer une table supplémentaire avec des relations, parfois un peu lourdes à gérer pour pas grand-chose.
Les relations
Il y a plusieurs manières de définir les relations. Ici, nous sommes partis de l'objet Article et avons indiqué qu'ils ont un auteur. Nous aurions aussi pu indiquer cette relation à partir de l'objet User et indiquer que chacun peut posséder plusieurs articles.
Nous commençons par donner un nom à notre relation ('User'). La classe étrangère est indiquée par
class. L'identifiant local est spécifié par
local, et l'identifiant étranger par
foreign. Doctrine nous donne la possibilité de donner des alias avec
alias et
foreignAlias. Ceci nous permettra d'utiliser ensuite :
<?php $article->AliasPourUser->login.