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

Post on 20-Jan-2015

2.431 views 0 download

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 ;

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 ;

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

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 ’ ) ;

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

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/

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/