SlideShare a Scribd company logo
1 of 64
Download to read offline
O modelo.
Doctrine2
Nacho Martín
El modelo
 en 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

Controlador

  Modelo
Vista
 Controlador



Modelo
“
Responsable de representar conceptos sobre
la situación del dominio y sus reglas.
Los detalles de almacenamiento se delegan
en 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 delegan
en la infraestructura.
Esta capa es el corazón del software.
                                          “
       Eric Evans, Domain Driven Design
“
                                  “
Symfony2 va sobre proporcionar herramientas
para el Controlador y la Vista, pero no para
el Modelo.
                      Fabien Potencier
Doctrine
Puente entre el modelo
relacional y los objetos         Doctrine ORM
API de la capa de
abstracción de la BD             Doctrine DBAL
API interfaz para distintos
drivers de BD                           PDO

           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
id
título
autor
tags
save()
delete()
...
ActiveRecord     DataMapper
 (Doctrine 1)    (Doctrine 2)

         Post            Post
id              id
título          título
autor           autor
tags            tags
save()
delete()
...
Record
Entidad
class Post
{
    private   $id;
    private   $titulo;
    private   $autor;
    private   $tags;
}
class Post
{

    private $id;

    private $titulo;

    private $autor;

    private $tags;
}
/**
* @ORMTable(name="post")
* @ORMEntity
*/
class Post
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
 * @ORMColumn(type="string")
 */
private $titulo;
string

integer     date

 float       time

smallint   datetime

 bigint      text

boolean     object

decimal     array
/**
 * @ORMManyToOne(targetEntity="User",
 *    inversedBy="posts", cascade={"remove"})
 * @ORMJoinColumn(name="user_id", referencedColumnName="id")
 */
private $autor;
/**
 * @ORMManyToMany(targetEntity="Tag", inversedBy="Posts")
 * @ORMJoinTable(name="post_tag",
 *      joinColumns={@ORMJoinColumn(name="tag_id",
 *          referencedColumnName="id")},
 *      inverseJoinColumns={@ORMJoinColumn(name="post_id",
 *          referencedColumnName="id")}
 * )
 */
private $tags;
php app/console doctrine:generate:entities AcmeStoreBundle
$user = new ForumUser();
$user->setName('Nacho');
$name = $user->getName();
$comment = new Comment();

$user->addComment($comment);
Entity Manager
$em = $this->getDoctrine()->getEntityManager();

$dql = "SELECT t FROM AcmeMiBundleEntityTask 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(); //Array
echo $users[0]->getAvatar()->getFilename();
$qb = $em->createQueryBuilder()
     ->where('p.precio > :precio')
     ->setParameter('precio', '19.99')
     ->orderBy('p.precio', 'ASC')
     ->getQuery();

$productos = $query->getResult();
Query#getResult()
Query#getSingleResult()          BD
Query#getOneOrNullResult()
Query#getArrayResult()
Query#getScalarResult()
Query#getSingleScalarResult()   Post

                          Tag1         Tag2
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
/**
  * ABBundleEntity
 *
 * @ORMTable(name="ponencia")
 * @ORMEntity(repositoryClass="ABBundleEntityPonenciaRepository")
 */
class Ponencia
{
DDD
Migraciones



    BD




 Definición
Migraciones



    BD



              Comparación



 Definición
Migraciones



    BD



              Comparación



 Definición                 Diff
Migraciones



    BD



              Comparación



 Definición                 Diff
Migraciones



    BD                      BD'



              Comparación



 Definición                 Diff
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
 @nacmartin


      limenius.com

More Related Content

What's hot

Gustavo php
Gustavo phpGustavo php
Gustavo php
Gustavo
 
MADs about Drupal: Programación de entities para D7
MADs about Drupal: Programación de entities para D7MADs about Drupal: Programación de entities para D7
MADs about Drupal: Programación de entities para D7
Pablo López Escobés
 
Funcionesphpmysql
FuncionesphpmysqlFuncionesphpmysql
Funcionesphpmysql
jgalvisr
 
Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.
jubacalo
 

What's hot (20)

Sumaoctal
SumaoctalSumaoctal
Sumaoctal
 
Desarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando SymfonyDesarrollo código mantenible en WordPress utilizando Symfony
Desarrollo código mantenible en WordPress utilizando Symfony
 
Gustavo php
Gustavo phpGustavo php
Gustavo php
 
89 Php. Tablas Inno Db
89 Php. Tablas Inno Db89 Php. Tablas Inno Db
89 Php. Tablas Inno Db
 
Mantenimiento de Usuarios usando MVC ver1
Mantenimiento de Usuarios usando MVC ver1Mantenimiento de Usuarios usando MVC ver1
Mantenimiento de Usuarios usando MVC ver1
 
Informe chabot
Informe chabotInforme chabot
Informe chabot
 
Introduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORMIntroduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORM
 
Cómo domar SonataAdminBundle
Cómo domar SonataAdminBundleCómo domar SonataAdminBundle
Cómo domar SonataAdminBundle
 
Trabajo array
Trabajo arrayTrabajo array
Trabajo array
 
jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009
 
Consultas
ConsultasConsultas
Consultas
 
MADs about Drupal: Programación de entities para D7
MADs about Drupal: Programación de entities para D7MADs about Drupal: Programación de entities para D7
MADs about Drupal: Programación de entities para D7
 
Symfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y MigraciónSymfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y Migración
 
Introducción a JQuery
Introducción a JQueryIntroducción a JQuery
Introducción a JQuery
 
WordCamp Cantabria - Código mantenible con WordPress
WordCamp Cantabria  - Código mantenible con WordPressWordCamp Cantabria  - Código mantenible con WordPress
WordCamp Cantabria - Código mantenible con WordPress
 
Arreglos en C++
Arreglos en C++Arreglos en C++
Arreglos en C++
 
jQuery
jQueryjQuery
jQuery
 
Funcionesphpmysql
FuncionesphpmysqlFuncionesphpmysql
Funcionesphpmysql
 
Php
PhpPhp
Php
 
Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.
 

Viewers also liked

Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worlds
Ignacio Martín
 
Integrating Node.js with PHP
Integrating Node.js with PHPIntegrating Node.js with PHP
Integrating Node.js with PHP
Lee Boynton
 

Viewers also liked (19)

How Symfony Changed My Life
How Symfony Changed My LifeHow Symfony Changed My Life
How Symfony Changed My Life
 
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
 
Keeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackKeeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and Webpack
 
Guard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful SecurityGuard Authentication: Powerful, Beautiful Security
Guard Authentication: Powerful, Beautiful Security
 
Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)
 
Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worlds
 
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux Introduction
 
React JS and why it's awesome
React JS and why it's awesomeReact JS and why it's awesome
React JS and why it's awesome
 
Integrating React.js Into a PHP Application
Integrating React.js Into a PHP ApplicationIntegrating React.js Into a PHP Application
Integrating React.js Into a PHP Application
 
Introduction to Redux
Introduction to ReduxIntroduction to Redux
Introduction to Redux
 
Creando Productos SaaS
Creando Productos SaaSCreando Productos SaaS
Creando Productos SaaS
 
Refactorizando Pccomponentes.com con Symfony
Refactorizando Pccomponentes.com con SymfonyRefactorizando Pccomponentes.com con Symfony
Refactorizando Pccomponentes.com con Symfony
 
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
 
You Got React.js in My PHP
You Got React.js in My PHPYou Got React.js in My PHP
You Got React.js in My PHP
 
High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014
High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014
High Quality Symfony Bundles tutorial - Dutch PHP Conference 2014
 
Adding Realtime to your Projects
Adding Realtime to your ProjectsAdding Realtime to your Projects
Adding Realtime to your Projects
 
PHP + Node.js
PHP + Node.jsPHP + Node.js
PHP + Node.js
 
Integrating Node.js with PHP
Integrating Node.js with PHPIntegrating Node.js with PHP
Integrating Node.js with PHP
 

Similar to Doctrine2 sf2Vigo

Inyecciones sql para todos
Inyecciones sql para todosInyecciones sql para todos
Inyecciones sql para todos
csaralg
 
PowerShell para administradores
PowerShell para administradoresPowerShell para administradores
PowerShell para administradores
Pablo Campos
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM Doctrine
Decharlas
 

Similar to Doctrine2 sf2Vigo (20)

9.laravel
9.laravel9.laravel
9.laravel
 
Inyecciones sql para todos
Inyecciones sql para todosInyecciones sql para todos
Inyecciones sql para todos
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
Presentacion YII
Presentacion YIIPresentacion YII
Presentacion YII
 
Entidades en drupal 8
Entidades en drupal 8Entidades en drupal 8
Entidades en drupal 8
 
PowerShell para administradores
PowerShell para administradoresPowerShell para administradores
PowerShell para administradores
 
Fundamento de poo en php
Fundamento de poo en phpFundamento de poo en php
Fundamento de poo en php
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útiles
 
Seminario mongo db springdata 10-11-2011
Seminario mongo db springdata 10-11-2011Seminario mongo db springdata 10-11-2011
Seminario mongo db springdata 10-11-2011
 
Entidades en drupal 8
Entidades en drupal 8Entidades en drupal 8
Entidades en drupal 8
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM Doctrine
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!
 
Javascript Básico
Javascript BásicoJavascript Básico
Javascript Básico
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datos
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
Introducción a Flask
Introducción a FlaskIntroducción a Flask
Introducción a Flask
 
Introducción a DJango
Introducción a DJangoIntroducción a DJango
Introducción a DJango
 
P2C2 Introducción a JEE5
P2C2 Introducción a JEE5P2C2 Introducción a JEE5
P2C2 Introducción a JEE5
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con Hibernate
 

More from Ignacio Martín

More from Ignacio Martín (13)

Elixir/OTP for PHP developers
Elixir/OTP for PHP developersElixir/OTP for PHP developers
Elixir/OTP for PHP developers
 
Introduction to React Native Workshop
Introduction to React Native WorkshopIntroduction to React Native Workshop
Introduction to React Native Workshop
 
Server side rendering with React and Symfony
Server side rendering with React and SymfonyServer side rendering with React and Symfony
Server side rendering with React and Symfony
 
Symfony 4 Workshop - Limenius
Symfony 4 Workshop - LimeniusSymfony 4 Workshop - Limenius
Symfony 4 Workshop - Limenius
 
Server Side Rendering of JavaScript in PHP
Server Side Rendering of JavaScript in PHPServer Side Rendering of JavaScript in PHP
Server Side Rendering of JavaScript in PHP
 
Extending Redux in the Server Side
Extending Redux in the Server SideExtending Redux in the Server Side
Extending Redux in the Server Side
 
Redux Sagas - React Alicante
Redux Sagas - React AlicanteRedux Sagas - React Alicante
Redux Sagas - React Alicante
 
React Native Workshop - React Alicante
React Native Workshop - React AlicanteReact Native Workshop - React Alicante
React Native Workshop - React Alicante
 
Asegurando APIs en Symfony con JWT
Asegurando APIs en Symfony con JWTAsegurando APIs en Symfony con JWT
Asegurando APIs en Symfony con JWT
 
Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
 
Symfony 2 CMF
Symfony 2 CMFSymfony 2 CMF
Symfony 2 CMF
 
Presentacion git
Presentacion gitPresentacion git
Presentacion git
 

Recently uploaded

editorial de informática de los sueños.docx
editorial de informática de los sueños.docxeditorial de informática de los sueños.docx
editorial de informática de los sueños.docx
ssusere34b451
 

Recently uploaded (20)

lenguaje algebraico.pptx álgebra, trigonometria
lenguaje algebraico.pptx álgebra, trigonometrialenguaje algebraico.pptx álgebra, trigonometria
lenguaje algebraico.pptx álgebra, trigonometria
 
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiCVelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
VelderrainPerez_Paola_M1C1G63-097.pptx. LAS TiC
 
herramientas informaticas mas utilizadas
herramientas informaticas mas utilizadasherramientas informaticas mas utilizadas
herramientas informaticas mas utilizadas
 
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
 
manual-de-oleohidraulica-industrial-vickers.pdf
manual-de-oleohidraulica-industrial-vickers.pdfmanual-de-oleohidraulica-industrial-vickers.pdf
manual-de-oleohidraulica-industrial-vickers.pdf
 
De Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptxDe Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptx
 
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónNavegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
 
proyectos_social_y_socioproductivos _mapas_conceptuales
proyectos_social_y_socioproductivos _mapas_conceptualesproyectos_social_y_socioproductivos _mapas_conceptuales
proyectos_social_y_socioproductivos _mapas_conceptuales
 
Introducción a la robótica con arduino..pptx
Introducción a la robótica con arduino..pptxIntroducción a la robótica con arduino..pptx
Introducción a la robótica con arduino..pptx
 
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUALJORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
JORNADA INTELIGENCIA ARTIFICIAL Y REALIDAD VIRTUAL
 
Pons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdf
Pons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdfPons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdf
Pons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdf
 
BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).
 
NIVEL DE MADUREZ TECNOLÓGICA (TRL).pptx
NIVEL DE  MADUREZ TECNOLÓGICA (TRL).pptxNIVEL DE  MADUREZ TECNOLÓGICA (TRL).pptx
NIVEL DE MADUREZ TECNOLÓGICA (TRL).pptx
 
Licencias para el Uso y el Desarrollo de Software
Licencias para el Uso y el Desarrollo de SoftwareLicencias para el Uso y el Desarrollo de Software
Licencias para el Uso y el Desarrollo de Software
 
Bloque 1 _ Lectura base - Sistemas Distribuidos
Bloque 1 _ Lectura base - Sistemas DistribuidosBloque 1 _ Lectura base - Sistemas Distribuidos
Bloque 1 _ Lectura base - Sistemas Distribuidos
 
Inteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicialInteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicial
 
editorial de informática de los sueños.docx
editorial de informática de los sueños.docxeditorial de informática de los sueños.docx
editorial de informática de los sueños.docx
 
CIBERSEGURIDAD Y SEGURIDAD INFORMATICA .
CIBERSEGURIDAD Y SEGURIDAD INFORMATICA .CIBERSEGURIDAD Y SEGURIDAD INFORMATICA .
CIBERSEGURIDAD Y SEGURIDAD INFORMATICA .
 
Gestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL ServerGestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL Server
 
taller de tablas en word para estudiantes de secundaria
taller de tablas en word para estudiantes de secundariataller de tablas en word para estudiantes de secundaria
taller de tablas en word para estudiantes de secundaria
 

Doctrine2 sf2Vigo