doctrine

60
http://www.doctrine-project.org/ jueves, 26 de septiembre de 13

Upload: ismael-ambrosi

Post on 12-Jun-2015

139 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: Doctrine

http://www.doctrine-project.org/jueves, 26 de septiembre de 13

Page 2: Doctrine

¿Qué es Doctrine?

jueves, 26 de septiembre de 13

Page 3: Doctrine

¿Qué es Doctrine?

• DBAL (Database abstraction layer)

• ORM (Object Relational Mapper)

jueves, 26 de septiembre de 13

Page 4: Doctrine

¿Qué significa DBAL?

jueves, 26 de septiembre de 13

Page 5: Doctrine

Database Abstraction Layer

jueves, 26 de septiembre de 13

Page 6: Doctrine

DBAL

“Powerful database abstraction layer with many features for database schema introspection, schema management and

PDO abstraction”

jueves, 26 de septiembre de 13

Page 7: Doctrine

DBAL

<?php

use Doctrine\DBAL\Configuration;use Doctrine\DBAL\DriverManager;

$config = new Configuration();//..$connectionParams = array(    'dbname' => 'mydb',    'user' => 'user',    'password' => 'secret',    'host' => 'localhost',    'driver' => 'pdo_mysql',);$conn = DriverManager::getConnection($connectionParams, $config);

Crear conexión

jueves, 26 de septiembre de 13

Page 8: Doctrine

DBAL

<?php

// ...

$conn = DriverManager::getConnection($connectionParams, $config);$stmt = $conn->query('SELECT * FROM users');

while ($row = $stmt->fetch()) {    echo $row['name'], PHP_EOL;}

Ejecutar consulta

jueves, 26 de septiembre de 13

Page 9: Doctrine

DBAL

<?php

// ...

$conn = DriverManager::getConnection($connectionParams, $config);$stmt = $conn->prepare('SELECT * FROM users WHERE name = ? AND age = ?');

$stmt->bindValue(1, $name);$stmt->bindValue(2, $age);$stmt->execute();

Ejecutar consulta con parámetros

jueves, 26 de septiembre de 13

Page 10: Doctrine

DBAL

<?php

// ...

$conn = DriverManager::getConnection($connectionParams, $config);$stmt = $conn->prepare('SELECT * FROM users WHERE id = :id');

$stmt->bindValue(':id', $id);$stmt->execute();

Ejecutar consulta con parámetros con nombre

jueves, 26 de septiembre de 13

Page 11: Doctrine

DBAL

<?php

// ...

$conn = DriverManager::getConnection($connectionParams, $config);$stmt = $conn->prepare('SELECT * FROM users WHERE created > :created');

$stmt->bindValue(':created', $created, 'datetime');$stmt->execute();

Ejecutar consulta con parámetros indicando typo de dato

jueves, 26 de septiembre de 13

Page 12: Doctrine

¿Qué es un ORM?

jueves, 26 de septiembre de 13

Page 13: Doctrine

Object-Relational Mapping

jueves, 26 de septiembre de 13

Page 14: Doctrine

"Es una técnica de programación para convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y la utilización de una base de datos relacional, utilizando un motor de

persistencia. En la práctica esto crea una base de datos orientada a objetos virtual, sobre la base de

datos relacional."

http://es.wikipedia.org/wiki/Mapeo_objeto-relacionaljueves, 26 de septiembre de 13

Page 15: Doctrine

ORM

• Transforma datos de la DB a objetos PHP

jueves, 26 de septiembre de 13

Page 16: Doctrine

ORM

• Transforma datos de la DB a objetos PHP

• Y de PHP a la DB

jueves, 26 de septiembre de 13

Page 17: Doctrine

ORM

• Transforma datos de la DB a objetos PHP

• Y de PHP a la DB

• Transforma las relaciones entre dos tablas

jueves, 26 de septiembre de 13

Page 18: Doctrine

ORM

• Transforma datos de la DB a objetos PHP

• Y de PHP a la DB

• Transforma las relaciones entre dos tablas

• Simplifica la transformación entre tipos de datos

jueves, 26 de septiembre de 13

Page 19: Doctrine

ORM

• Transforma datos de la DB a objetos PHP

• Y de PHP a la DB

• Transforma las relaciones entre dos tablas

• Simplifica la transformación entre tipos de datos

• Data Mapper

jueves, 26 de septiembre de 13

Page 20: Doctrine

ORM

¿Qué nos soluciona?

jueves, 26 de septiembre de 13

Page 21: Doctrine

ORM¿Qué nos soluciona?

• Podemos utilizar orientación a objetos

jueves, 26 de septiembre de 13

Page 22: Doctrine

ORM¿Qué nos soluciona?

• Podemos utilizar orientación a objetos

• Evita tener SQL en todos lados

jueves, 26 de septiembre de 13

Page 23: Doctrine

ORM¿Qué nos soluciona?

• Podemos utilizar orientación a objetos

• Evita tener SQL en todos lados

• Simplifica el entendimiento del código

jueves, 26 de septiembre de 13

Page 24: Doctrine

ORM¿Qué nos soluciona?

• Podemos utilizar orientación a objetos

• Evita tener SQL en todos lados

• Simplifica el entendimiento del código

• Facilita el proceso de migración

jueves, 26 de septiembre de 13

Page 25: Doctrine

ORM¿Qué nos soluciona?

• Podemos utilizar orientación a objetos

• Evita tener SQL en todos lados

• Simplifica el entendimiento del código

• Facilita el proceso de migración

• SQL Injection

jueves, 26 de septiembre de 13

Page 26: Doctrine

ORM

¿Problemas?

jueves, 26 de septiembre de 13

Page 27: Doctrine

ORM¿Problemas?

• Agrega overhead

• Puede ejecutar SQL no óptimo(si no se utiliza adecuadamente)

• No siempre es la mejor solución

jueves, 26 de septiembre de 13

Page 28: Doctrine

ORM

EntityManager

jueves, 26 de septiembre de 13

Page 29: Doctrine

ORMEntityManager

• Responsable de gestionar la persistencia y obtención de entidades

jueves, 26 de septiembre de 13

Page 30: Doctrine

ORMEntityManager

• Responsable de gestionar la persistencia y obtención de entidades

• Uno por conexión

jueves, 26 de septiembre de 13

Page 31: Doctrine

ORMEntityManager

• Responsable de gestionar la persistencia y obtención de entidades

• Uno por conexión

• Utiliza el patrón UnitOfWork para optimizar la gestión de muchas entidades

jueves, 26 de septiembre de 13

Page 32: Doctrine

ORMEntityManager

<?php

use Doctrine\ORM\EntityManager;use Doctrine\ORM\Tools\Setup;

$paths = array("/path/to/entity-files");$isDevMode = false;

// Configuracion para entidades que utilizan annotations$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);

// Obtengo el EntityManager$entityManager = EntityManager::create($connection, $config);

jueves, 26 de septiembre de 13

Page 33: Doctrine

ORMEntityManager

<?php

// ...

// Parametros de conexión$connectionParams = array(    'dbname' => 'mydb',    'user' => 'user',    'password' => 'secret',    'host' => 'localhost',    'driver' => 'pdo_mysql',);

// Obtengo el EntityManager$entityManager = EntityManager::create($connectionParams, $config);

jueves, 26 de septiembre de 13

Page 34: Doctrine

ORMEntity Manager

// Indica al EntityManager que se// debe persistir la entidad en la db$entityManager->persist($entity);

persist()

jueves, 26 de septiembre de 13

Page 35: Doctrine

ORMEntity Manager

// Escribe los cambios en la base de datos$entityManager->flush();

flush()

jueves, 26 de septiembre de 13

Page 36: Doctrine

ORM

Entidades

jueves, 26 de septiembre de 13

Page 37: Doctrine

ORMEntidades

• Objetos PHP

jueves, 26 de septiembre de 13

Page 38: Doctrine

ORMEntidades

• Objetos PHP

• Representan a una tabla en la BD

jueves, 26 de septiembre de 13

Page 39: Doctrine

ORMEntidades

• Objetos PHP

• Representan a una tabla en la BD

• Una instancia representa a una fila en la tabla

jueves, 26 de septiembre de 13

Page 40: Doctrine

ORMEntidades

• Objetos PHP

• Representan a una tabla en la BD

• Una instancia representa a una fila en la tabla

• Se pueden heredar

jueves, 26 de septiembre de 13

Page 41: Doctrine

ORMEntidades

<?php

class User{ private $id; private $name;

public function getId() { return $this->id; }

public function getName() { return $this->name; }

public function setName($name) { $this->name = $name; }}

$a = new User();$a->setName("Ismael");

jueves, 26 de septiembre de 13

Page 42: Doctrine

ORMEntidades

<?php

/** @Entity */class User{    /**     * @Id     * @Column(type="integer")     * @GeneratedValue(strategy="AUTO")     */    private $id;

    /**     * @Column(type="string")     */    private $name;}

jueves, 26 de septiembre de 13

Page 43: Doctrine

ORMEntidades

$user = new User();$user->setName("Ismael");

$entityManager->persist($user);$entityManager->flush();

echo $user->getId();

1.Instanciación2.Hidratación3.Persistencia4.Escritura

jueves, 26 de septiembre de 13

Page 44: Doctrine

ORM

Relaciones entre entidades

jueves, 26 de septiembre de 13

Page 45: Doctrine

ORMRelaciones entre entidades

•OneToOne

•OneToMany•ManyToOne

•ManyToMany

jueves, 26 de septiembre de 13

Page 46: Doctrine

ORMRelaciones entre entidades

<?php

/** @Entity */class User{    /**     * @Id     * @Column(type="integer")     * @GeneratedValue(strategy="AUTO")     */    private $id;

    /**     * @Column(type="string")     */    private $name;

    /**     * @OneToMany( * targetEntity="PhoneNumber",  * mappedBy="user", * cascade={“persist”, “remove”} * )     */      private $phoneNumbers;}

<?php

/** @Entity */class PhoneNumber{    /**     * @Id     * @Column(type="integer")     * @GeneratedValue(strategy="AUTO")     */    private $id;

    /**     * @Column(type="string")     */    private $phone;

    /**     * @ManyToOne( * targetEntity="User",  * inversedBy="phoneNumbers" * )     */      private $user;}

jueves, 26 de septiembre de 13

Page 47: Doctrine

ORMRelaciones entre entidades

// Crea una instancia de PhoneNumber$phoneNumber = new PhoneNumber();$phoneNumber->setPhone("555-1234");

$user = new User();$user->setName("Ismael");

// Asocia el phone number al usuario$user->addPhoneNumber($phoneNumber);

// Guarda ambas entidades$entityManager->persist($user);$entityManager->flush();

foreach ($user->getPhoneNumbers() as $phoneNumber) {    echo $phoneNumber->getPhone(), PHP_EOL;}

jueves, 26 de septiembre de 13

Page 48: Doctrine

ORM

Repositorios

jueves, 26 de septiembre de 13

Page 49: Doctrine

ORMRepositorios

• Nos da acceso a los datos

jueves, 26 de septiembre de 13

Page 50: Doctrine

ORMRepositorios

• Nos da acceso a los datos

• Independiente de como se persisten los datos

jueves, 26 de septiembre de 13

Page 51: Doctrine

ORMRepositorios

• Nos da acceso a los datos

• Independiente de como se persisten los datos

• Existe uno por entidad

jueves, 26 de septiembre de 13

Page 52: Doctrine

ORMRepositorios

• Nos da acceso a los datos

• Independiente de como se persisten los datos

• Existe uno por entidad

• Puedo crear mis propios repositorios

jueves, 26 de septiembre de 13

Page 53: Doctrine

ORMRepositorios

<?php

interface ObjectRepository{    public function find($id);

    public function findAll();

    public function findBy(array $criteria, array $orderBy = null,  $limit = null, $offset = null);

    public function findOneBy(array $criteria);}

jueves, 26 de septiembre de 13

Page 54: Doctrine

ORMRepositorios

<?php

// Retorna el repositorio para la entidad Namespace\User$repository = $entityManager->getRepository('Namespace\User');

// Obtengo el objeto con ID = 1$user = $repository->find(1);

echo $user->getName();

find()

jueves, 26 de septiembre de 13

Page 55: Doctrine

ORMRepositorios

<?php

// Retorna el repositorio para la entitdad Namespace\User$repository = $entityManager->getRepository('Namespace\User');

// Obtengo un array de objetos User$user = $repository->findAll();

foreach ($users as $user) {    echo $user->getName();}

findAll()

jueves, 26 de septiembre de 13

Page 56: Doctrine

ORMRepositorios

<?php

// Retorna el repositorio para la entitdad Namespace\User$repository = $entityManager->getRepository('Namespace\User');

// Obtengo un array de objetos User donde status = enabled$user = $repository->findBy(array('status' => 'enabled'));

foreach ($users as $user) {    echo $user->getName();}

findBy()

jueves, 26 de septiembre de 13

Page 57: Doctrine

ORMRepositorios

<?php

// Retorna el repositorio para la entitdad Namespace\User$repository = $entityManager->getRepository('Namespace\User');

// Obtengo el primer objeto User donde status = enabled$user = $repository->findOneBy(array('status' => 'enabled'));

echo $user->getName();

findOneBy()

jueves, 26 de septiembre de 13

Page 58: Doctrine

ResumenDBAL

Capa de abstracción para la interacción con nuestra bases de datos

ORM

Herramienta que nos permite traducir objetos PHP en registros de la base de datos y viceversa

jueves, 26 de septiembre de 13

Page 59: Doctrine

¿Preguntas?

jueves, 26 de septiembre de 13

Page 60: Doctrine

¡Gracias!

jueves, 26 de septiembre de 13