Top Banner
O modelo. Doctrine2 Nacho Martín
64

Doctrine2 sf2Vigo

Nov 01, 2014

Download

Technology

Nacho Martín

Doctrine2 para usuarios Symfony2. Jornadas Symfony Vigo 2011.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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