Desarrollo rápido con PHP y Symfony (IV): El Modelo

43
Symfony David J. Brenes Martínez ORMs Esquema y generación de clases Base de Datos Fichero de esquema Generación de código Carga de Datos Acceso a Base de Datos Referencias, Créditos y Licencia Desarrollo rápido con PHP y Symfony (IV) El Modelo David J. Brenes Martínez Curso de Extensión Universitaria Desarrollo web avanzado Universidad de Oviedo 2010/03/22

description

Explicación de la capa de persistencia y el modelo dentro de Symfony implementado sobre Doctrine.

Transcript of Desarrollo rápido con PHP y Symfony (IV): El Modelo

Page 1: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Desarrollo rápido con PHP y Symfony(IV) El Modelo

David J. Brenes Martínez

Curso de Extensión UniversitariaDesarrollo web avanzado

Universidad de Oviedo

2010/03/22

Page 2: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Encajando objetos y Base de Datos

PHP es un lenguaje orientado a ObjetosLas Bases de datos más comunes son RelacionalesNormalmente la traducción es sencillaAlgunos escenarios son más complicados

Page 3: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Enlaces entre objetos

Práctica comun en Orientacion a ObjetosEn Base de Datos se traduce como un campo nuevoen una tablaRecurrimos a Joins para enlazar los datos relacionados

Page 4: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Herencia

Práctica comun en Orientacion a ObjetosEn Base de Datos la solución no es inmediata

Page 5: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

ORMs

Herramientas que tratan de acercar la Orientación aObjetos y las Bases de DatosNos esconden la ‘complejidad’ de ciertos problemasAutomatizan trabajoDejamos de trabajar con tablas y Bases de Datos paratrabajar con objetosO casi. . .

Page 6: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

ORMs

.NET: LinQ, nHibernateJava: Hibernate, Spring, JPARuby: ActiveRecordPHP: Propel, Doctrine

Page 7: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

ORMs en Symfony

2 alternativas: Propel, DoctrineHasta Symfony 1.2 Propel era el recomendadoÚltimas versiones recomiendan DoctrineNúcleo del modelo

Page 8: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

databases.yml

Fichero de configuracion de Base de DatosPresente en directorio config del proyectoConfiguras una base de datos por entornoEscoges que tipo de Base de Datos usar

Page 9: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Cambio de Base de Datos

Solo sería necesario cambiar databases.ymlPodrías cambiar de host de Base de Datos e incluso deSGBD (MySQL, PostgreSQL, Oracle, etc. . . )

Page 10: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

schema.yml

Es el fichero de configuración del modelo de datos.En este fichero se define las tablas que va a haber enla Base de Datos y sus columnasSe definen también características de los objetos

Page 11: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Ejemplo

Coche :actAs : { Timestampable : ~ }columns :

i d :ma t r i cu la : { type : s t r i n g (255) }conductor_ id : { type : i n t e g e r }

r e l a t i o n s :author :

onDelete : CASCADEl o c a l : conductor_ idf o r e i g n : i df o r e i g n A l i a s : Usuario

Page 12: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Atributos

NombreTipo de datosOpciones adicionales (notnull, unique. . . )

Page 13: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Atributos

boo lean_ f i e l d : { type : boolean , defaul t : 1 }

s t r i n g _ f i e l d : s t r i n g (255)

d e t a i l e d _ f i e l d :type : s t r i n g (255)n o t n u l l : true

Page 14: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Relaciones

Indica cómo un objeto se relaciona con los demásSe definirán claves externas y triggersEn el modelo las relaciones serán transparentes

Page 15: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Relaciones

Car :r e l a t i o n s :

d r i v e r :onDelete : CASCADEl o c a l : d r i v e r _ i df o r e i g n : i dc lass : User

Page 16: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Tipos de relaciones

Los atributos type y foreign-type controlan lacardinalidadSus valores son one y many

Page 17: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Relaciones many-to-many

En Base de datos se requiere una tabla extraEn Schema.yml podemos definir la tabla intermedia

Page 18: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Relaciones many-to-many

Car :Re la t ions :

InsurancedDr iver :c lass : Userf o r e i g n A l i a s : InsuranceDr iversl o c a l : ca r_ idf o r e i g n : d r i v e r _ i dre fC lass : Insurance

Page 19: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Relaciones many-to-many

Insurance :columns :

d r i v e r _ i d : { type : i n t e g e r }ca r_ id : { type : i n t e g e r }p r i ce : { type : f l o a t }

r e l a t i o n s :Dr i ve r :

l o c a l : d r i v e r _ i df o r e i g n : i d

Car :l o c a l : ca r_ idf o r e i g n : i d

Page 20: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Comportamientos

Definen un conjunto de atributos y un comportamientoante ciertos eventosEs una manera de reutilizar aspectos comunes demodelosTimestampable, Geographical, I18N, SoftDelete,Sluggable. . .

Page 21: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Comportamientos

Podemos definir nuestros propios cmportamientosLos coportamientos pueden recibir parámetrosLos comportamientos pueden anidarse

Page 22: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Herencia

Es posible simular la herencia de la programaciónorientada a objetosSe aplican distintos esquemas para cada tipo deherencia deseadoTipos: Concrete, Simple y Column Agregation

Page 23: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Herencia Concrete

Se crea una tabla para la clase padre y una tabla paracada clase hijaLas tablas hijas tienen las mismas columnas que lapadre, más las columnas agregadas

Page 24: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Herencia Simple

Se crea solo una tabla para la clase padreLas tablas padre tiene las columnas de la clase padremás las agregadas por las clases hijasNo se diferencia de qué tipo concreto es cada fila de laBase de Datos

Page 25: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Herencia Column Agregation

Se crea solo una tabla para la clase padreLas tablas padre tiene las columnas de la clase padremás las agregadas por las clases hijasHay una columna adicional, que indica el tipo concretode cada fila

Page 26: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

El modelo

doctrine:build_model genera las clases a partir delfichero de esquemaLas clases quedan en lib/model

Page 27: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Clases generadas

Clase del modelo: Clase vacía que hereda de unaclase baseClase base: Clase con toda la informacion del modeloClase Table: Realiza las operaciones con la Base deDatos

Page 28: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Clases generadas

Nunca debe hacerse referencia a la clase base nimodificarlaLa clase base se reescribe cada vez que construimosel modeloPodemos perder modificaciones

Page 29: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

El SQL

Tarea doctrine:build-sql : genera el SQL del modeloEl SQL ha sido optimizado para la Base de Datosindicada en datbases.ymlTambién sufre las limitaciones de esa Base de Datos

Page 30: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

El SQL

Tarea doctrine:insert-sql : ejecuta el SQL sobre la basede datosTarea doctrine:build-db: Crea la Base de Datos para elmodelo

Page 31: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Zona de Administración

Tarea doctrine:generate-admin: Genera un módulo deadministración para una clase del modeloTarea doctrine:generate-module: Genera un móduloCRUD para una clase del modelo

Page 32: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Fixtures

Mecanismo de carga de datosPermite tener unos datos básicos para desarrollo otesting

Page 33: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Datos simples

User :user1 :

name : Loremuser2 :

name : Ipsumuser3 :

name : Doloruser4 :

name : s i t

Page 34: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Relaciones

Car :car1 :

ma t r i cu la : 0000AAADr i ve r : user_1

car2 :ma t r i cu la : 0000AAADr i ve r : user_3

Page 35: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Tareas de las fixtures

Tarea doctrine:data-load : Carga datos a la Base deDatosTarea doctrine:data-dump: Descarga datos de la Basede Datos

Page 36: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Queries

Ejecutamos consultas a la Base de Datos a través dela clase Table.Le pedimos a Doctrine que nos devuelva un objetoTable y construimos la consulta en ese objeto

Page 37: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Queries

$query = Doct r ine : : getTable ( ’ User ’ )−>createQuery ( ’ u ’ ) ;

$ r e s u l t s = $query−>execute ;

Page 38: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Queries

$query = Doct r ine : : getTable ( ’ User ’ )−>createQuery ( ’ u ’ )−>where ( ’ u . name = ? ’ , ’ brenes ’ ) ;

$ r e s u l t s = $query−>execute ;

Page 39: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Finders

Métodos que obtienen datos a través de valores deatributosNos ahorran el tener que crear queries

Page 40: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Finders

$ r e s u l t = Doct r ine : : getTable ( ’ User ’ )−>findOneByName ( ’ brenes ’ ) ;

$ r e s u l t s = Doct r ine : : getTable ( ’ User ’ )−>findByName ( ’ brenes ’ ) ;

Page 41: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Modificando datos

Los objetos tienen atributos que corresponden a lascolumnasModificamos los atributosEjecutamos el método save() para grabar

Page 42: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Referencias

Symfony Project: www.symfony-project.orgThe Symfony Reference Book: http://www.symfony-project.org/reference/1_4/en/

Practical Symfony:http://www.symfony-project.org/jobeet/1_4/Doctrine/en/

The Definitive Guide to Symfony:http://www.symfony-project.org/book/1_2/

Page 43: Desarrollo rápido con PHP y Symfony (IV): El Modelo

Symfony

David J.Brenes

Martínez

ORMs

Esquema ygeneración declasesBase de Datos

Fichero de esquema

Generación decódigo

Carga deDatos

Acceso aBase deDatos

Referencias,Créditos yLicencia

Licencia

Estas transparencias se publican bajo licencia CreativeCommons y se pueden redistribuir o modificar bajo lassiguientes condiciones:

Se dé reconocimiento al autor de estas transparencias.No se use con propósitos comerciales.Se distribuya con la misma licencia.

Texto de la licencia: http://creativecommons.org/licenses/by-nc-sa/3.0/