Doctrine2 sf2Vigo

Preview:

DESCRIPTION

Doctrine2 para usuarios Symfony2. Jornadas Symfony Vigo 2011.

Citation preview

O modelo.Doctrine2Nacho Martín

El modeloen MVC

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>

Vista

Modelo

Controlador

Vista

Modelo

Controlador

“ “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

“ “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.

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

Fabien Potencier

Doctrine

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

DBAL

# app/config/config.yml

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

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

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

ORM

ActiveRecord(Doctrine 1)

Post

idtítuloautortags

save()delete()...

ActiveRecord(Doctrine 1)

Post

idtítuloautortags

save()delete()...

DataMapper(Doctrine 2)

Post

idtítuloautortags

Record

Entidad

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

class Post{

private $id;

private $titulo;

private $autor;

private $tags;}

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

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

date

time

datetime

text

object

array

integer

float

smallint

bigint

boolean

decimal

string

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

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

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

/** * @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",

php app/console doctrine:generate:entities AcmeStoreBundle

$user->setName('Nacho');

$comment = new Comment();

$user->addComment($comment);

$user = new ForumUser();

$name = $user->getName();

Entity Manager

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

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

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

$productos = $query->getResult();

BD

Post

Tag2Tag1

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

Repositorio

“ “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

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

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

$productos = $repository->findAll();

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

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

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

DDD

Migraciones

BD

Definición

Migraciones

BD

Definición

Comparación

Migraciones

BD

Definición

Comparación

Diff

Migraciones

BD

Definición

Comparación

Diff

Migraciones

BD

Definición

Comparación

Diff

BD'

php app/console doctrine:migrations:diff

php app/console doctrine:migrations:migrate

La familia Doctrine

MongoDB ODM

CouchDB ODM

PHPCR ODM

Doctrine Search

Vida más allá

Qué hay del rendimiento??

Patrón Polish Rider

Patrón Balkan Partisan

Preguntas?¿

Gracias

nitram.ohcan@gmail.com

limenius.com

@nacmartin

Recommended