2.1. el patrón mvc (symfony 1.pdf

Upload: ivan-berlot

Post on 26-Feb-2018

241 views

Category:

Documents


0 download

TRANSCRIPT

  • 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.html
  • 7/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=es
  • 7/25/2019 2.1. El patrn MVC (Symfony 1.pdf

    16/16

    2015 LibrosWeb.es

    3.263 das online