Doctrine

Installation au SIF

Téléchargement de composer et préparation de l’installation

~/public_html/Archiweb$ mkdir TestDoctrine
~/public_html/Archiweb$ cd TestDoctrine 
~/public_html/Archiweb/TestDoctrine$ curl -sS https://getcomposer.org/installer | php
~/public_html/Archiweb/TestDoctrine$ emacs composer.json
{
    "require": {
        "doctrine/orm": "*"",
        "symfony/yaml": "*"
    }
}

Installation de doctrine

$ php composer.phar install

Utilisation de doctrine au SIF

créer un fichier bootstrap.php

<?php
// bootstrap.php
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

require_once "vendor/autoload.php";

//METADATA YAML
$isDevMode=true;
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yaml"), $isDevMode);

// database configuration parameters
$dsn =  array(
    'dbname' => 'mmeynard',
    'user' => 'mmeynard',
    'password' => 'Le votre !',
    'host' => 'venus',    // '127.0.0.1' ne fonctionne pas car serveur MySQL sur venus
    'driver' => 'pdo_mysql',
    'charset' => 'utf8' ,    // sinon les char utf-8 ne passent pas en BD
);
// obtaining the entity manager
$entityManager = EntityManager::create($dsn, $config);

puis créer un fichier cli-config.php pour faire fonctionner la commande doctrine

<?php
// cli-config.php
require_once "bootstrap.php";

return \Doctrine\ORM\Tools\Console\ConsoleRunner::createHelperSet($entityManager);

puis créer en rétro-ingéniérie, les fichiers yaml dans /config/yaml définissant les métadonnées, puis les fichiers php dans le répertoire src définissant les classes d’entités

mkdir config/yaml
php vendor/bin/doctrine orm:convert-mapping --from-database yml config/yaml
mkdir src 
php vendor/bin/doctrine orm:generate-entities src/

On listera le répertoire src qui contient les classes Etudiant, Options,  Stagea : ls src; less Etudiant.php

on peut maintenant écrire un script php listant les étudiants (des stages d’analyse) : listetud.php : OUF !

<?php
include "src/Etudiant.php";
include "src/Options.php";
include "src/Stagea.php";

require_once "bootstrap.php";
$etudRep=$entityManager->getRepository('Etudiant');
$letud=$etudRep->findAll();
foreach($letud as $e){
  print($e->getNom() . " " . $e->getPrenom() . "<br>");
}
?>

Afin de ne pas avoir à inclure chaque classe avant utilisation, on utilisera la fonctionnalité de chargement automatique fournie par doctrine :

use Doctrine\Common\ClassLoader;
require 'vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php';
$classLoader = new ClassLoader(null, 'src/'); // null : pas d'espace de nom
$classLoader->register();

Attention les instances d’étudiant récupérées font référence à des instances d’Options et de Stagea (qui font eux  même référence à des étudiants grâce aux métadonnées) : ne pas faire de print_r car la récursivité risque d’être infinie !

foreach($letud as $e){
 print($e->getNom() . " " . $e->getPrenom() . " : " . 
 ($e->getOpt()?$e->getOpt()->getNom():"PAS D'OPTION") . "<br>");
}

permettra d’afficher :

GUILLAUME Julien : Langue naturelle
GUITARD Brice : Web et BD
HAET Franck : PAS D'OPTION
HERIZI Abderraouf : Bio-Informatique