Post on 26-Feb-2018
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
1/16
Ver ndice de contenidos del libro
2.1. El patrn MVC
Symfony est basado en un patrn clsico del diseo web conocido como arquitectura MVC,
que est formado por tres niveles:
El Modelo representa la informacin con la que trabaja la aplicacin, es decir, su lgica de
negocio.
La Vista transforma el modelo en una pgina web que permite al usuario interactuar con
ella.
El Controlador se encarga de procesar las interacciones del usuario y realiza los cambios
apropiados en el modelo o en la vista.
La Figura 2-1 ilustra el funcionamiento del patrn MVC.
La arquitectura MVC separa la lgica de negocio (el modelo) y la presentacin (la vista) por
lo que se consigue un mantenimiento ms sencillo de las aplicaciones. Si por ejemplo una
misma aplicacin debe ejecutarse tanto en un navegador estndar como un un navegador de
un dispositivo mvil, solamente es necesario crear una vista nueva para cada dispositivo
manteniendo el controlador y el modelo original. El controlador se encarga de aislar al
modelo y a la vista de los detalles del protocolo utilizado para las peticiones (HTTP, consola
de comandos, email, etc.). El modelo se encarga de la abstraccin de la lgica relacionada
con los datos, haciendo que la vista y las acciones sean independientes de, por ejemplo, el
tipo de gestor de bases de datos utilizado por la aplicacin.
Figura 2.1El patrn MVC
http://-/?-7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
2/16
2.1.1. Las capas de la arquitectura MVC
Para poder entender las ventajas de utilizar el patrn MVC, se va a transformar una
aplicacin simple realizada con PHP en una aplicacin que sigue la arquitectura MVC. Un
buen ejemplo para ilustrar esta explicacin es el de mostrar una lista con las ltimas entradas
o artculos de un blog.
2.1.1.1. Programacin simple
Utilizando solamente PHP normal y corriente, el script necesario para mostrar los artculos
almacenados en una base de datos se muestra en el siguiente listado:
Listado 2-1 - Un script simple
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
3/16
Listado de Artculos
Listado de Artculos
FechaTitulo
El script anterior es fcil de escribir y rpido de ejecutar, pero muy difcil de mantener y
actualizar. Los principales problemas del cdigo anterior son:
No existe proteccin frente a errores (qu ocurre si falla la conexin con la base dedatos?).
El cdigo HTML y el cdigo PHP estn mezclados en el mismo archivo e incluso en
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
4/16
algunas partes estn entrelazados.
El cdigo solo funciona si la base de datos es MySQL.
2.1.1.2. Separando la presentacin
Las llamadas a echoy printfdel listado 2-1 dificultan la lectura del cdigo. De hecho,
modificar el cdigo HTML del script anterior para mejorar la presentacin es un folln debido
a cmo est programado. As que el cdigo va a ser dividido en dos partes. En primer lugar,
el cdigo PHP puro con toda la lgica de negocio se incluye en el script del controlador,
como se muestra en el listado 2-2.
Listado 2-2 - La parte del controlador, en index.php
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
5/16
Listado de Artculos
Listado de Artculos
FechaTtulo
Una buena regla general para determinar si la parte de la vista est suficientemente limpiade
cdigo es que debera contener una cantidad mnima de cdigo PHP, la suficiente como para
que un diseador HTML sin conocimientos de PHP pueda entenderla. Las instrucciones ms
comunes en la parte de la vista suelen ser echo, if/endif, foreach/endforeachy poco
ms. Adems, no se deben incluir instrucciones PHP que generen etiquetas HTML.
Toda la lgica se ha centralizado en el script del controlador, que solamente contiene cdigo
PHP y ningn tipo de HTML. De hecho, y como puedes imaginar, el mismo controlador se
puede reutilizar para otros tipos de presentaciones completamente diferentes, como por
ejemplo un archivo PDF o una estructura de tipo XML.
2.1.1.3. Separando la manipulacin de los datos
La mayor parte del script del controlador se encarga de la manipulacin de los datos. Pero,
qu ocurre si se necesita la lista de entradas del blog para otro controlador, por ejemplo uno
que se dedica a generar el canal RSS de las entradas del blog? Y si se quieren centralizar
todas las consultas a la base de datos en un nico sitio para evitar duplicidades? Quocurre si cambia el modelo de datos y la tabla articulo pasa a llamarse articulo_blog? Y
si se quiere cambiar a PostgreSQL en vez de MySQL? Para poder hacer todo esto, es
imprescindible eliminar del controlador todo el cdigo que se encarga de la manipulacin de
los datos y ponerlo en otro script, llamado el modelo, tal y como se muestra en el listado 2-4.
Listado 2-4 - La parte del modelo, en modelo.php
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
6/16
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
7/16
El script del modelo solamente se encarga del acceso a los datos y puede ser reorganizado a
tal efecto. Todos los parmetros que no dependen de la capa de datos (como por ejemplo los
parmetros de la peticin del usuario) se deben obtener a travs del controlador y por tanto,
no se puede acceder a ellos directamente desde el modelo. Las funciones del modelo se
pueden reutilizar fcilmente en otros controladores.
2.1.2. Separacin en capas ms all del MVC
El principio ms importante de la arquitectura MVC es la separacin del cdigo del programa
en tres capas, dependiendo de su naturaleza. La lgica relacionada con los datos se incluye
en el modelo, el cdigo de la presentacin en la vista y la lgica de la aplicacin en el
controlador.
La programacin se puede simplificar si se utilizan otros patrones de diseo. De esta forma,
las capas del modelo, la vista y el controlador se pueden subidividir en ms capas.
2.1.2.1. Abstraccin de la base de datos
La capa del modelo se puede dividir en la capa de acceso a los datos y en la capa de
abstraccin de la base de datos. De esta forma, las funciones que acceden a los datos no
utilizan sentencias ni consultas que dependen de una base de datos, sino que utilizan otras
funciones para realizar las consultas. As, si se cambia de sistema gestor de bases de datos,
solamente es necesario actualizar la capa de abstraccin de la base de datos.
El listado 2-6 muestra un ejemplo de capa de abstraccin de la base de datos y el listado 2-7
muestra una capa de acceso a datos especfica para MySQL.
Listado 2-6 - La parte del modelo correspondiente a la abstraccin de la base de datos
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
8/16
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
9/16
Como se puede comprobar, la capa de acceso a datos no contiene funciones dependientes
de ningn sistema gestor de bases de datos, por lo que es independiente de la base de
datos utilizada. Adems, las funciones creadas en la capa de abstraccin de la base de
datos se pueden reutilizar en otras funciones del modelo que necesiten acceder a la base de
datos.
NOTA Los ejemplos de los listados 2-6 y 2-7 no son completos, y todava hace falta aadiralgo de cdigo para tener una completa abstraccin de la base de datos (abstraer el
cdigo SQL mediante un constructor de consultas independiente de la base de datos,
aadir todas las funciones a una clase, etc.) El propsito de este libro no es mostrar cmo
se puede escribir todo ese cdigo, ya que en el captulo 8 se muestra cmo Symfony
realiza de forma automtica toda la abstraccin.
2.1.2.2. Los elementos de la vista
La capa de la vista tambin puede aprovechar la separacin de cdigo. Las pginas web
suelen contener elementos que se muestran de forma idntica a lo largo de toda la
aplicacin: cabeceras de la pgina, el layoutgenrico, el pie de pgina y la navegacin
global. Normalmente slo cambia el interior de la pgina. Por este motivo, la vista se separa
en un layout y en una plantilla. Normalmente, el layout es global en toda la aplicacin o al
menos en un grupo de pginas. La plantilla slo se encarga de visualizar las variables
definidas en el controlador. Para que estos componentes interaccionen entre s
correctamente, es necesario aadir cierto cdigo. Siguiendo estos principios, la parte de la
vista del listado 2-3 se puede separar en tres partes, como se muestra en los listados 2-8, 2-
9 y 2-10.
Listado 2-8 - La parte de la plantilla de la vista, en miplantilla.php
Listado de Artculos
FechaTtulo
Listado 2-9 - La parte de la lgica de la vista
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
10/16
Listado 2-10 - La parte del layout de la vista
2.1.2.3. Acciones y controlador frontal
En el ejemplo anterior, el controlador no se encargaba de realizar muchas tareas, pero en las
aplicaciones web reales el controlador suele tener mucho trabajo. Una parte importante de su
trabajo es comn a todos los controladores de la aplicacin. Entre las tareas comunes se
encuentran el manejo de las peticiones del usuario, el manejo de la seguridad, cargar la
configuracin de la aplicacin y otras tareas similares. Por este motivo, el controlador
normalmente se divide en un controlador frontal, que es nico para cada aplicacin, y las
acciones, que incluyen el cdigo especfico del controlador de cada pgina.
Una de las principales ventajas de utilizar un controlador frontal es que ofrece un punto de
entrada nico para toda la aplicacin. As, en caso de que sea necesario impedir el acceso a
la aplicacin, solamente es necesario editar el script correspondiente al controlador frontal. Si
la aplicacin no dispone de controlador frontal, se debera modificar cada uno de los
controladores.
2.1.2.4. Orientacin a objetos
Los ejemplos anteriores utilizan la programacin procedimental. Las posibilidades que
ofrecen los lenguajes de programacin modernos para trabajar con objetos permiten
simplificar la programacin, ya que los objetos pueden encapsular la lgica, pueden heredar
mtodos y atributos entre diferentes objetos y proporcionan una serie de convenciones claras
sobre la forma de nombrar a los objetos.
La implementacin de una arquitectura MVC en un lenguaje de programacin que no est
orientado a objetos puede encontrarse con problemas de namespacesy cdigo duplicado,
dificultando la lectura del cdigo de la aplicacin.
La orientacin a objetos permite a los desarrolladores trabajar con objetos de la vista, objetos
del controlador y clases del modelo, transformando las funciones de los ejemplos anteriores
en mtodos. Se trata de un requisito obligatorio para las arquitecturas de tipo MVC.
NOTA Si quieres profundizar en el tema de los patrones de diseo para las aplicaciones
web en el contexto de la orientacin a objetos, puedes leer "Patterns of Enterprise
Application Architecture"de Martin Fowler (Addison-Wesley, ISBN: 0-32112-742-0). El
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
11/16
cdigo de ejemplo del libro de Fowler est escrito en Java y en C#, pero es bastante fcil
de leer para los programadores de PHP.
2.1.3. La implementacin del MVC que realiza Symfony
Piensa por un momento cuntos componentes se necesitaran para realizar una pgina
sencilla que muestre un listado de las entradas o artculos de un blog. Como se muestra en
la figura 2-2, son necesarios los siguientes componentes:
La capa del Modelo
Abstraccin de la base de datos
Acceso a los datos
La capa de la Vista
Vista
Plantilla
Layout
La capa del Controlador
Controlador frontal
Accin
En total son siete scripts, lo que parecen muchos archivos para abrir y modificar cada vez
que se crea una pgina. Afortunadamente, Symfony simplifica este proceso. Symfony toma
lo mejor de la arquitectura MVC y la implementa de forma que el desarrollo de aplicaciones
sea rpido y sencillo.
En primer lugar, el controlador frontal y el layout son comunes para todas las acciones de la
aplicacin. Se pueden tener varios controladores y varios layouts, pero solamente es
obligatorio tener uno de cada. El controlador frontal es un componente que slo tiene cdigo
relativo al MVC, por lo que no es necesario crear uno, ya que Symfony lo genera de forma
automtica.
La otra buena noticia es que las clases de la capa del modelo tambin se generan
automticamente, en funcin de la estructura de datos de la aplicacin. El ORM se encarga
de crear el esqueletoo estructura bsica de las clases y genera automticamente todo el
cdigo necesario. Cuando el ORM encuentra restricciones de claves forneas (o externas) o
cuando encuentra datos de tipo fecha, crea mtodos especiales para acceder y modificaresos datos, por lo que la manipulacin de datos se convierte en un juego de nios. La
abstraccin de la base de datos es completamente transparente para el programador, ya que
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
12/16
se realiza de forma nativa mediante PDO PHP Data Objects). As, si se cambia el sistema
gestor de bases de datos en cualquier momento, no se debe reescribir ni una lnea de
cdigo, ya que tan slo es necesario modificar un parmetro en un archivo de configuracin.
Por ltimo, la lgica de la vista se puede transformar en un archivo de configuracin sencillo,
sin necesidad de programarla.
Figura 2.2El flujo de trabajo de Symfony
Considerando todo lo anterior, el ejemplo de la pgina que muestra un listado con todas las
entradas del blog solamente requiere de tres archivos en Symfony, que se muestran en los
listados 2-11, 2-12 y 2-13.
Listado 2-11 - Accin listado, en
miproyecto/apps/miaplicacion/modules/weblog/actions/actions.class.php
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
13/16
Listado 2-12 - Plantilla listado, en
miproyecto/apps/miaplicacion/modules/weblog/templates/listadoSuccess.php
Listado de Artculos
FechaTtulo
Adems es necesario crear un layout como el del listado 2-13. Afortunadamente, el mismolayout se puede reutilizar muchas veces.
Listado 2-13 - Layout, en miproyecto/apps/miaplicacion/templates/layout.php
Estos scripts son todo lo que necesita la aplicacin del ejemplo. El cdigo mostrado es el
necesario para crear la misma pgina que generaba el script simple del listado 2-1. Symfony
se encarga del resto de tareas, como hacer que los componentes interactuen entre s. Si se
considera el nmero de lneas de cdigo, el listado de entradas de blog creado segn la
arquitectura MVC no requiere ms lneas ni ms tiempo de programacin que un scriptsimple. Sin embargo, la arquitectura MVC proporciona grandes ventajas, como la
organizacin del cdigo, la reutilizacin, la flexibilidad y una programacin mucho ms
entretenida. Por si fuera poco, crear la aplicacin con Symfony permite crear pginas XHTML
vlidas, depurar fcilmente las aplicaciones, crear una configuracin sencilla, abstraccin de
la base de datos utilizada, enrutamiento con URL limpias, varios entornos de desarrollo y
muchas otras utilidades para el desarrollo de aplicaciones.
2.1.4. Las clases que forman el ncleo de Symfony
La implementacin que realiza Symfony de la arquitectura MVC incluye varias clases que se
mencionan una y otra vez a lo largo del libro:
7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
14/16
sfControlleres la clase del controlador. Se encarga de decodificar la peticin y
transferirla a la accin correspondiente.
sfRequestalmacena todos los elementos que forman la peticin (parmetros, cookies,
cabeceras, etc.)
sfResponsecontiene las cabeceras de la respuesta y los contenidos. El contenido de este
objeto se transforma en la respuesta HTML que se enva al usuario.
El contexto (que se obtiene mediante sfContext::getInstance()) almacena una
referencia a todos los objetos que forman el ncleo de Symfony y puede ser accedido
desde cualquier punto de la aplicacin.
El captulo 6 explica en detalle todos estos objetos.
Como se ha visto, todas las clases de Symfony utilizan el prefijo sf, como tambin hacen
todas las variables principales de Symfony en las plantillas. De esta forma, se evitan las
colisiones en los nombres de clases y variables de Symfony y los nombres de tus propias
clases y variables, adems de que las clases del framework son ms fciles de reconocer.
NOTA Entre las normas seguidas por el cdigo de Symfony, se encuentra el estndar
"UpperCamelCase" para el nombre de las clases y variables. Solamente existen dos
excepciones: las clases del ncleo de Symfony empiezan por sf(por tanto en minsculas)
y las variables utilizadas en las plantillas que utilizan la sintaxis de separar las palabras
con guiones bajos.
Nota del traductorLa notacin "CamelCase"consiste en escribir frases o palabras
compuestas eliminando los espacios intermedios y poniendo en mayscula la primera letra
de cada palabra. La variante "UpperCamelCase"tambin pone en mayscula la primera
letra de todas.
Anterior
Captulo 2. Explorando el interior de Symfony
(../capitulo_2.html)
Siguiente
2.2. Organizacin del cdigo
(../capitulo_2/organizacion_del_codigo.htm
http://librosweb.es/libro/symfony_1_4/capitulo_2/organizacion_del_codigo.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_2.html7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
15/16
COMPARTIR
Twitter (https://twitter.com/share?text={{ item_social_title }}&lang=es)
Facebook (http://www.facebook.com/sharer.php?
u=http%3A%2F%2Flibrosweb.es%2Flibro%2Fsymfony_1_4%2Fcapitulo_2%2Fel_patron_mvc.html&t={{
item_social_title }})
Google+ (https://plus.google.com/share?
url=http%3A%2F%2Flibrosweb.es%2Flibro%2Fsymfony_1_4%2Fcapitulo_2%2Fel_patron_mvc.html&hl=es)
INDICE DE CONTENIDOS
1. Introduccin a Symfony (../capitulo_1.html)
Captulo 2.Explorando el interior de Symfony (../capitulo_2.html)
2.1.El patrn MVC (../capitulo_2/el_patron_mvc.html)
2.2. Organizacin del cdigo (../capitulo_2/organizacion_del_codigo.html)
2.3.Herramientas comunes (../capitulo_2/herramientas_comunes.html)
2.4.Resumen (../capitulo_2/resumen_2.html)
3.Ejecutar aplicaciones Symfony (../capitulo_3.html)
4. Introduccin a la creacin de pginas (../capitulo_4.html)
5.Configurar Symfony (../capitulo_5.html)
6.El Controlador (../capitulo_6.html)
7.La Vista (../capitulo_7.html)
8.El modelo (Doctrine) (../capitulo_8.html)
9.Enlaces y sistema de enrutamiento (../capitulo_9.html)
10. Formularios (../capitulo_10.html)
11.Emails (../capitulo_11.html)12.Uso de la cache (../capitulo_12.html)
13. Internacionalizacin y localizacin (../capitulo_13.html)
14.Generador de la parte de administracin (../capitulo_14.html)
15.Pruebas unitarias y funcionales (../capitulo_15.html)
16.Herramientas para la administracin de aplicaciones (../capitulo_16.html)
17.Personalizar Symfony (../capitulo_17.html)
18.Rendimiento (../capitulo_18.html)
19.Configuracin avanzada (../capitulo_19.html)
http://librosweb.es/libro/symfony_1_4/capitulo_19.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_18.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_17.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_16.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_15.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_14.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_13.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_12.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_11.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_10.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_9.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_8.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_7.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_6.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_5.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_4.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_3.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_2/resumen_2.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_2/herramientas_comunes.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_2/organizacion_del_codigo.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_2/el_patron_mvc.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_2.htmlhttp://librosweb.es/libro/symfony_1_4/capitulo_1.htmlhttps://plus.google.com/share?url=http%3A%2F%2Flibrosweb.es%2Flibro%2Fsymfony_1_4%2Fcapitulo_2%2Fel_patron_mvc.html&hl=eshttp://www.facebook.com/sharer.php?u=http%3A%2F%2Flibrosweb.es%2Flibro%2Fsymfony_1_4%2Fcapitulo_2%2Fel_patron_mvc.html&t={{%20item_social_title%20}}https://twitter.com/share?text={{%20item_social_title%20}}&lang=es7/25/2019 2.1. El patrn MVC (Symfony 1.pdf
16/16
2015 LibrosWeb.es
3.263 das online