Solutions avec Doctrine 2.0
-
Upload
anna-filina -
Category
Technology
-
view
1.026 -
download
3
Transcript of Solutions avec Doctrine 2.0
Solutions avec Doctrine 2.0PHP Québec, 5 mai 2011
Anna Filina
PHP Québec - groupe d’utilisateurs
ConFoo - conférence sans but lucratif
FooLab - solution TI pour entreprises
Étendue
ORM... De Kessé???
Setup
Commandes de base
Cas d’utilisation en entreprise
Gestion de rôles
API
Pourquoi un ORM?
Abstraction du SQL
Standardiser
Simplifier
Réutilisation et extensibilité
Setup
Entités
class Invoice{ public $id; public $items; public $total;}
Entités: table
/** * @Entity * @Table(name="invoice") */class Invoice {
Entités: colonne
/** * @Id * @Column(type="integer") * @GeneratedValue */public $id;
Bootstrap: driver
$connectionOptions = array( 'driver' => 'pdo_sqlite', 'path' => 'database.sqlite');
Schéma
>./doctrine orm:schema-tool:create
Commandes de base
Persistance
$entityManager = EntityManager::create($conn, $config);
$invoice = new Invoice();$invoice->total = 35.00;
$entityManager->persist($invoice);$entityManager->flush();
Persistance avec relations$invoice = new Invoice();
$item = new Item();$item->name = 'Unicorn';
$invoice->items[] = $item;
$entityManager->persist($invoice);$entityManager->flush();
Relation dans l’entité
/** * @ManyToMany(targetEntity="Item", * cascade={"persist"}) */public $items;
Requêtes
$query = $entityManager->createQuery( 'SELECT inv FROM Invoice inv');
$invoices = $query->getResult();
Requêtes: left join
$query = $entityManager->createQuery( 'SELECT inv, item FROM Invoice inv LEFT JOIN inv.items item');
$invoices = $query->getResult();
Requêtes: left joinarray
'id' => 284 'total' => 0 'items' => array 0 => array 'id' => 279 'name' => 'Rainbow' 'price' => 10 'quantity' => 3 1 => array 'id' => 280 'name' => 'Unicorn' 'price' => 15 'quantity' => 2
Cas d’utilisation:Gestion de rôles
Rôles
Admin: modifier tout
Author: modifier projets de la compagnie
Reader: voir projets publiés seulement
Filtres
Admin: *
Author: WHERE project.organisation_id = ?
Reader: WHERE project.organisation_id = ? AND project.status = “Published”
Author
class Author implements Role {
public function filterQuery(&$q) { $a = $q->getRootAlias(); $q->add('where', $a.'.organisation_id = :org_id'); $q->setParameter('org_id', $this->org_id);
}
}
Reader
class Reader implements Role {
public function filterQuery(&$q) { $a = $q->getRootAlias(); $q->add('where', $a.'.organisation_id = :org_id'); $q->setParameter('org_id', $this->org_id); $q->add('where', $a.'.status = "Published"'); }
}
Cas d’utilisation:API
API
But: via AJAX, récupérer des données du serveur et injecter dans une page
Input: critères de recherche pour une liste
Output: liste filtrée et paginée
Javascript
$.ajax({ url: '/project.json', data: { page: 0, pageSize: 10 } success: function(json) { refreshHtmlTable(json); }});
PHPclass API {
public function process($entity, $filters) { $q = $entity->getBaseQuery(); $q->setMaxResults($filters['pageSize']); $q->setFirstResult( $filters['pageSize'] * $filters['page']); $result = $q->getQuery() ->getResult(Query::HYDRATE_ARRAY);
return json_encode($result); }
}
Bonus Level!
Combinaisons
class API {
public function process($entity, $filters) { // [...] $this->user->role->filterQuery($q); $q->getQuery()->useResultCache(true, 3600, 'uid'); // [...] }
}