Upload
nacho-martin
View
8.416
Download
2
Embed Size (px)
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?¿