Solutions avec Doctrine 2.0

Post on 02-Jul-2015

1.026 views 3 download

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'); // [...] }

}

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