64
O modelo. Doctrine2 Nacho Martín

Doctrine2 sf2Vigo

Embed Size (px)

DESCRIPTION

Doctrine2 para usuarios Symfony2. Jornadas Symfony Vigo 2011.

Citation preview

Page 1: Doctrine2 sf2Vigo

O modelo.Doctrine2Nacho Martín

Page 2: Doctrine2 sf2Vigo

El modeloen MVC

Page 3: Doctrine2 sf2Vigo
Page 4: Doctrine2 sf2Vigo

Smart User Interface<html><head><title>Mi primera web dinámica</title></head><body><blink><?php $visitas = consulta_SQL('visitas'); echo $visitas; guarda_SQL($visitas + 1); ?></blink></body></html>

Page 5: Doctrine2 sf2Vigo
Page 6: Doctrine2 sf2Vigo

Vista

Modelo

Controlador

Page 7: Doctrine2 sf2Vigo

Vista

Modelo

Controlador

Page 8: Doctrine2 sf2Vigo

“ “Responsable de representar conceptos sobre la situación del dominio y sus reglas.Los detalles de almacenamiento se deleganen la infraestructura.

Eric Evans, Domain Driven Design

Page 9: Doctrine2 sf2Vigo

“ “Responsable de representar conceptos sobre la situación del dominio y sus reglas.Los detalles de almacenamiento se deleganen la infraestructura.

Eric Evans, Domain Driven Design

Esta capa es el corazón del software.

Page 10: Doctrine2 sf2Vigo

“ “Symfony2 va sobre proporcionar herramientaspara el Controlador y la Vista, pero no parael Modelo.

Fabien Potencier

Page 11: Doctrine2 sf2Vigo
Page 12: Doctrine2 sf2Vigo

Doctrine

Page 13: Doctrine2 sf2Vigo

Doctrine ORM

Doctrine DBAL

PDO

Puente entre el modelo relacional y los objetos

API de la capa deabstracción de la BD

API interfaz para distintosdrivers de BD

MS SQL Server, Firebird/Interbase, IBM, INFORMIX, MySQL, Oracle, ODBC y DB2, PostgreSQL, SQLite

Page 14: Doctrine2 sf2Vigo

DBAL

Page 15: Doctrine2 sf2Vigo

# app/config/config.yml

doctrine: dbal: driver: pdo_mysql dbname: Symfony2 user: root password: null charset: UTF8

Page 16: Doctrine2 sf2Vigo

$conn = $this->get('database_connection'); $users = $conn->fetchAll('SELECT * FROM users');

Page 17: Doctrine2 sf2Vigo

<?php$conn = $this->get('database_connection');$queryBuilder = $conn->createQueryBuilder();$users = $queryBuilder ->select('u.id') ->addSelect('p.id') ->from('users', 'u') ->leftJoin('u', 'phonenumbers', 'u.id = p.user_id') ->setFirstResult(30) ->setMaxResults(25) ->execute();

Page 18: Doctrine2 sf2Vigo

ORM

Page 19: Doctrine2 sf2Vigo

ActiveRecord(Doctrine 1)

Post

idtítuloautortags

save()delete()...

Page 20: Doctrine2 sf2Vigo

ActiveRecord(Doctrine 1)

Post

idtítuloautortags

save()delete()...

DataMapper(Doctrine 2)

Post

idtítuloautortags

Page 21: Doctrine2 sf2Vigo

Record

Page 22: Doctrine2 sf2Vigo

Entidad

Page 23: Doctrine2 sf2Vigo

class Post{ private $id; private $titulo; private $autor; private $tags;}

Page 24: Doctrine2 sf2Vigo

class Post{

private $id;

private $titulo;

private $autor;

private $tags;}

Page 25: Doctrine2 sf2Vigo

/*** @ORM\Table(name="post")* @ORM\Entity*/class Post{

Page 26: Doctrine2 sf2Vigo

/** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @ORM\Column(type="string") */ private $titulo;

Page 27: Doctrine2 sf2Vigo

date

time

datetime

text

object

array

integer

float

smallint

bigint

boolean

decimal

string

Page 28: Doctrine2 sf2Vigo

/** * @ORM\ManyToOne(targetEntity="User",

* @ORM\JoinColumn(name="user_id", referencedColumnName="id") */private $autor;

* inversedBy="posts", cascade={"remove"})

Page 29: Doctrine2 sf2Vigo

/** * @ORM\ManyToMany(targetEntity="Tag", inversedBy="Posts") * @ORM\JoinTable(name="post_tag", * joinColumns={@ORM\JoinColumn(name="tag_id",

* referencedColumnName="id")} * ) */private $tags;

* referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="post_id",

Page 30: Doctrine2 sf2Vigo

php app/console doctrine:generate:entities AcmeStoreBundle

Page 31: Doctrine2 sf2Vigo

$user->setName('Nacho');

$comment = new Comment();

$user->addComment($comment);

$user = new ForumUser();

$name = $user->getName();

Page 32: Doctrine2 sf2Vigo

Entity Manager

Page 33: Doctrine2 sf2Vigo
Page 34: Doctrine2 sf2Vigo

$em = $this->getDoctrine()->getEntityManager();

$dql = "SELECT t FROM Acme\MiBundle\Entity\Task t";$dql .= " WHERE t.proyecto = :proyecto";$dql .= " AND t.posicion > :minpos";$dql .= "ORDER BY t.prioridad"$query = $em->createQuery($dql);

$query->setParameters(array( 'project' => $project, 'minpos' => 10,));

$tareas = $query->getResult();

Page 35: Doctrine2 sf2Vigo

$query = $em->createQuery('SELECT u, a FROM ForumUser u JOIN u.avatar a');$users = $query->getResult(); //Arrayecho $users[0]->getAvatar()->getFilename();

Page 36: Doctrine2 sf2Vigo

$qb = $em->createQueryBuilder() ->where('p.precio > :precio') ->setParameter('precio', '19.99') ->orderBy('p.precio', 'ASC') ->getQuery();

$productos = $query->getResult();

Page 37: Doctrine2 sf2Vigo

BD

Post

Tag2Tag1

Query#getResult()Query#getSingleResult()Query#getOneOrNullResult()Query#getArrayResult()Query#getScalarResult()Query#getSingleScalarResult()

Page 38: Doctrine2 sf2Vigo

Repositorio

Page 39: Doctrine2 sf2Vigo

“ “Proporciona la ilusión de tener una colección en memoria de todos los objetos de un tipo.Permite acceso mediante una interfaz común.

Eric Evans, Domain Driven Design

Page 40: Doctrine2 sf2Vigo

$producto = $repository->find($id);

$producto = $repository->findOneByNombre('Thermomix');

$productos = $repository->findAll();

$productos = $repository->findByPrecio(19.99);

$productos = $repository->createQueryBuilder('p')->...

Page 41: Doctrine2 sf2Vigo

<?php/** * A\BBundle\Entity** @ORM\Table(name="ponencia")* @ORM\Entity(repositoryClass="A\BBundle\Entity\PonenciaRepository")*/class Ponencia{

Page 42: Doctrine2 sf2Vigo

DDD

Page 43: Doctrine2 sf2Vigo

Migraciones

BD

Definición

Page 44: Doctrine2 sf2Vigo

Migraciones

BD

Definición

Comparación

Page 45: Doctrine2 sf2Vigo

Migraciones

BD

Definición

Comparación

Diff

Page 46: Doctrine2 sf2Vigo

Migraciones

BD

Definición

Comparación

Diff

Page 47: Doctrine2 sf2Vigo

Migraciones

BD

Definición

Comparación

Diff

BD'

Page 48: Doctrine2 sf2Vigo

php app/console doctrine:migrations:diff

php app/console doctrine:migrations:migrate

Page 49: Doctrine2 sf2Vigo

La familia Doctrine

Page 50: Doctrine2 sf2Vigo

MongoDB ODM

Page 51: Doctrine2 sf2Vigo

CouchDB ODM

Page 52: Doctrine2 sf2Vigo

PHPCR ODM

Page 53: Doctrine2 sf2Vigo

Doctrine Search

Page 54: Doctrine2 sf2Vigo

Vida más allá

Page 55: Doctrine2 sf2Vigo

Qué hay del rendimiento??

Page 56: Doctrine2 sf2Vigo
Page 57: Doctrine2 sf2Vigo
Page 58: Doctrine2 sf2Vigo
Page 59: Doctrine2 sf2Vigo

Patrón Polish Rider

Page 60: Doctrine2 sf2Vigo
Page 61: Doctrine2 sf2Vigo
Page 62: Doctrine2 sf2Vigo

Patrón Balkan Partisan

Page 63: Doctrine2 sf2Vigo

Preguntas?¿

Page 64: Doctrine2 sf2Vigo

Gracias

[email protected]

limenius.com

@nacmartin