Doctrine 2 est un mapper objet-relationnel pour PHP 5.3.3+ qui fournis de la persistance transparente pour des objets PHP. La séparation complète de la logique et de la persistance dans un système de stockage relationnel est le but principale.
L'avantage de Doctrine pour un programmeur est de permettre un meilleur focus sur sur la logique objet orienté et de pouvoir considérer la persistance comme un problème secondaire.
Les fonctions clés de Doctrine 2 incluent :
En utilisant MySQLi :
$stmt = $mysqli->prepare('INSERT INTO users (username, password) VALUES (?, ?)');
$stmt->bind_param('s', $username);
$stmt->bind_param('s', $password);
$stmt->execute();
echo $mysqli->insert_id;
En utilisant Doctrine 2 :
$user = new User(); $user->username = $username; $user->password = $password; $entityManager->persist($user); $entityManager->flush(); echo $user->id;
Doctrine utilise les commentaires pour permettre au programmeur d'attacher des méta-données aux membres d'une classe afin de contrôler la persistance.
/** * @Entity @Table(name="table") **/
Les principaux éléments sont:
La propriété @Column est une des instructions les plus importantes. Elle comporte un grand nombre d'options :
/**
* @Entity @Table(name="users")
**/
class User
{
/** @Id @Column(type="integer") @GeneratedValue **/
protected $id;
/** @Column(type="string") **/
protected $username;
/** @Column(type="string") **/
protected $password;
// ...
Doctrine supporte tous les scénarios d'associations par l'utilisation de propriétés en commentaire.
Dans tous les cas, le paramètres targetEntity est nécessaire et dans les cas ou l'association est bidirectionnelle, mappedBy est nécessaire au propriétaire et inversedBy pour l'autre côté de l'association.
Dans l'exemple, un Post possède plusieurs Comment, on observe donc une relation One-to-Many.
/**
* @Entity @Table(name="posts")
**/
class Post {
/** @Id @Column(type="integer") @GeneratedValue **/
protected $id;
/** @OneToMany(targetEntity="Comment", mappedBy="post") **/
protected $comments;
/**
* @Entity @Table(name="comments")
**/
class Comment {
/** @Id @Column(type="integer") @GeneratedValue **/
protected $id;
/** @ManyToOne(targetEntity="Post", inversedBy="comments") **/
protected $post;
L'EntityManager est la pièce centrale qui permet d'accéder au système de persistance.
Une installation standard de Doctrine 2 va exposer une variable $entityManager ou similaire pour y permettre l'accès.
Les fonctions membres principales de l'EntityManager sont les suivantes :
L'EntityManager permet l'accès à un objet Repository pour effectuer des requêtes sur les entity en base de données.
$repo = $entityManager->getRepository('Entity');
L'objet expose les fonctions suivantes :
Un nouvel entity peut être persisté en base de données par l'EntityManager.
$gab = new Gab(); $gab->money = 31337; $entityManager->persist($gab); $entityManager->flush();
Les objets déja en base de données soit récupéré par un Repository ou précédemment persisté sont déjà lié à l'EntityManager et il suffit d'exécuter la méthode flush() pour sauvegarder les changements.
$repo = $entityManager->getRepository('Gab');
$gab = $repo->find(42);
$gab->money = 1337;
$entityManager->flush();
La structure et la nomenclature des fichiers joue un rôle très important dans tout projet PHP, mais particulièrement lorsqu'un framework est en jeu.
L'organisation typique d'un projet avec Doctrine 2 est la suivante :
Le fichier composer.json contrôle les dépendances du projet PHP.
{
"require": {
"doctrine/orm": "2.4.*"
},
"autoload": {
"psr-0": {
"": "src/"
}
}
}
Il suffit de naviguer en ligne de commande vers le dossier du projet et exécuter la ligne suivante pour installer les dépendances dans le dossier vendor/ :
$ cd MonProjet $ composer install
Le fichier bootstrap.php s'occupe de charger les dépendances et d'initialiser l'EntityManager de Doctrine. Ce fichier devra être inclus une seule fois au tout début de chaque script de page.
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
require_once 'vendor/autoload.php';
// Créé une configuration de type "annotation" avec le chemin vers les "entities".
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__.'/src'), $isDevMode);
// Paramètres de connexion à la base de données.
$conn = array(
'driver' => 'pdo_mysql',
'user' => 'root',
'password' => '',
'dbname' => 'db'
);
// Création de l'EntityManager, soit le pont entre les objets et la DB.
$entityManager = EntityManager::create($conn, $config);
Le fichier cli-config.php est utilisé par l'outil en ligne de commande pour identifier les entities et les paramètres de connexion.
use Doctrine\ORM\Tools\Console\ConsoleRunner; require_once 'bootstrap.php'; return ConsoleRunner::createHelperSet($entityManager);
À ce stade, on peux générer la base de données à partir des entities en utilisant la ligne de commande.
$ cd MonProjet $ php vendor/bin/doctrine orm:shema-tool:create
Comme dans l'exemple d'association, le projet fera usage de deux entity, soit un Post et un Comment.
Définition du Post :
Définition du Comment :
Un Post possède plusieurs Comment.
Informations de contact: