Solutions avec Doctrine 2.0

29
Solutions avec Doctrine 2.0 PHP Québec, 5 mai 2011

Transcript of Solutions avec Doctrine 2.0

Page 1: Solutions avec Doctrine 2.0

Solutions avec Doctrine 2.0PHP Québec, 5 mai 2011

Page 2: Solutions avec Doctrine 2.0

Anna Filina

PHP Québec - groupe d’utilisateurs

ConFoo - conférence sans but lucratif

FooLab - solution TI pour entreprises

Page 3: Solutions avec Doctrine 2.0

Étendue

ORM... De Kessé???

Setup

Commandes de base

Cas d’utilisation en entreprise

Gestion de rôles

API

Page 4: Solutions avec Doctrine 2.0

Pourquoi un ORM?

Abstraction du SQL

Standardiser

Simplifier

Réutilisation et extensibilité

Page 5: Solutions avec Doctrine 2.0

Setup

Page 6: Solutions avec Doctrine 2.0

Entités

class Invoice{ public $id; public $items; public $total;}

Page 7: Solutions avec Doctrine 2.0

Entités: table

/** * @Entity * @Table(name="invoice") */class Invoice {

Page 8: Solutions avec Doctrine 2.0

Entités: colonne

/** * @Id * @Column(type="integer") * @GeneratedValue */public $id;

Page 9: Solutions avec Doctrine 2.0

Bootstrap: driver

$connectionOptions = array( 'driver' => 'pdo_sqlite', 'path' => 'database.sqlite');

Page 10: Solutions avec Doctrine 2.0

Schéma

>./doctrine orm:schema-tool:create

Page 11: Solutions avec Doctrine 2.0

Commandes de base

Page 12: Solutions avec Doctrine 2.0

Persistance

$entityManager = EntityManager::create($conn, $config);

$invoice = new Invoice();$invoice->total = 35.00;

$entityManager->persist($invoice);$entityManager->flush();

Page 13: Solutions avec Doctrine 2.0

Persistance avec relations$invoice = new Invoice();

$item = new Item();$item->name = 'Unicorn';

$invoice->items[] = $item;

$entityManager->persist($invoice);$entityManager->flush();

Page 14: Solutions avec Doctrine 2.0

Relation dans l’entité

/** * @ManyToMany(targetEntity="Item", * cascade={"persist"}) */public $items;

Page 15: Solutions avec Doctrine 2.0

Requêtes

$query = $entityManager->createQuery( 'SELECT inv FROM Invoice inv');

$invoices = $query->getResult();

Page 16: Solutions avec Doctrine 2.0

Requêtes: left join

$query = $entityManager->createQuery( 'SELECT inv, item FROM Invoice inv LEFT JOIN inv.items item');

$invoices = $query->getResult();

Page 17: Solutions avec Doctrine 2.0

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

Page 18: Solutions avec Doctrine 2.0

Cas d’utilisation:Gestion de rôles

Page 19: Solutions avec Doctrine 2.0

Rôles

Admin: modifier tout

Author: modifier projets de la compagnie

Reader: voir projets publiés seulement

Page 20: Solutions avec Doctrine 2.0

Filtres

Admin: *

Author: WHERE project.organisation_id = ?

Reader: WHERE project.organisation_id = ? AND project.status = “Published”

Page 21: Solutions avec Doctrine 2.0

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);

}

}

Page 22: Solutions avec Doctrine 2.0

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"'); }

}

Page 23: Solutions avec Doctrine 2.0

Cas d’utilisation:API

Page 24: Solutions avec Doctrine 2.0

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

Page 25: Solutions avec Doctrine 2.0

Javascript

$.ajax({ url: '/project.json', data: { page: 0, pageSize: 10 } success: function(json) { refreshHtmlTable(json); }});

Page 26: Solutions avec Doctrine 2.0

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); }

}

Page 27: Solutions avec Doctrine 2.0

Bonus Level!

Page 28: Solutions avec Doctrine 2.0

Combinaisons

class API {

public function process($entity, $filters) { // [...] $this->user->role->filterQuery($q); $q->getQuery()->useResultCache(true, 3600, 'uid'); // [...] }

}

Page 29: Solutions avec Doctrine 2.0

http://www.doctrine-project.orghttp://annafilina.com