CursoSymfony2

262
Desarrollo de aplicaciones web con Symfony2 version 1.0 Juan David Rodríguez García 16 de Julio de 2012

Transcript of CursoSymfony2

  • Desarrollo de aplicaciones web conSymfony2version 1.0

    Juan David Rodrguez Garca

    16 de Julio de 2012

  • ContenidoCurso: Desarrollo de Aplicaciones Web con Symfony2 1

    Licencia 2Unidad 1. Inmersin 3

    Aplicaciones web 3Desarrollo rpido y de calidad de aplicaciones web 4Presentacin del curso 5

    A quin va dirigido 5Objetivos del curso 6Plan del curso 7

    Sobre Symfony2 8La documentacin de Symfony2 8Comentarios 9

    Unidad 2: Desarrollo de una aplicacin web siguiendo el patrn MVC 10El patrn MVC en el desarrollo de aplicaciones web 10Descripcin de la aplicacin 11Diseo de la aplicacin (I). Organizacin de los archivos 12Diseo de la aplicacin (II). El controlador frontal 12Construccin de la aplicacin. Vamos al lo. 13Creacin de la estructura de directorios 13El controlador frontal y el mapeo de rutas 14Las acciones del Controlador. La clase Controller. 16La implementacin de la Vista. 19

    Las plantillas PHP 19El layout y el proceso de decoracin de plantillas 20

    El Modelo. Accediendo a la base de datos 24La configuracin de la aplicacin 26Incorporar las CSS's 27La base de datos 27Comentarios 28

    Unidad 3: Symfony2 a vista de pjaro 29Qu es Symfony2? 29Instalacin y configuracin de Symfony2 30

    El directorio web 32El directorio app 33El directorio vendor 34El directorio src 35

  • El directorio bin 35Los Bundles: Plugins de primera clase 35La aplicacin gestin de alimentos en Symfony2 36

    Generacin de un Bundle 36Anatoma de un Bundle 38Flujo bsico de creacin de pginas en Symfony2 40Definicin de las rutas del bundle 41Creacin de la accin en el controlador 43Creacin de la plantilla 45Decoracin de la plantilla con un layout 46Instalacin de los assets de un bundle 50Implementamos el resto de la aplicacin 51

    La unidad en chuletas 61Generar un bundle 61Registrar un bundle 61Enlazar el routing de un bundle con el routing general de laaplicacin

    62

    Pasos para acoplar un bundle al framework 62Flujo para la creacin de pginas en Symfony2 62Nombres lgicos de acciones 62Sintaxis bsica de twig 62Herencia en plantilla twig 62Funcin path de twig 63Iterar una coleccin (array) de datoso en twig 63Cdigo condicional en twig 63Inclusin de plantillas en twig 63Estructura bsica de una ruta 63

    Comentarios 63Unidad 4: Inyeccin de Dependencias 64

    Primer paso: inyeccin de dependencias 64Segundo paso: el contenedor de dependencias 65Integracin de la clase Model como un servicio de Symfony2 67El Contenedor de Servicios de Symfony2 68Y qu hemos ganado con todo esto? 71Servicios al poder! 74Ms servicios an 77La unidad en chuletas 78Comentarios 79

  • Unidad 5: Desarrollo de la aplicacin MentorNotas (I). Anlisis 80Descripcin de la aplicacin 80Descripcin general 81Catlogo de requisitos 81

    Requisitos del frontend 81Requisitos del backend 82

    Gestin de usuarios 82Gestin de publicidad 82Gestin de planes de pagos 82

    Modelo de datos 83Descripcin de los procesos 83

    Registro de nuevos usuarios 83Creacin de una nota 83Contratacin de una cuenta premium 84Presentacin de la publicidad 84

    Interfaz de usuario 84Pantalla de login 84Pantalla de registro 84Pantalla principal (inicio) 85Pantalla de creacin de notas 85Pantalla de modificacin de notas 85Pantalla de planes de pago 86Men de la aplicacin de administracin 86Gestin de entidades 86

    Listado de usuarios 86Creacin de usuarios 87Edicin de usuarios 87

    Recursos para la construccin de la aplicacin 87Conclusin 88Comentarios 88

    Unidad 6: Desarrollo de la aplicacin MentorNotas (II). Rutas yControladores

    89

    Lo primero: el bundle 89Definimos las rutas y sus acciones asociadas 91

    Diseo de la lgica de control para las acciones del controladorNotasController

    93

    Diseo de la lgica de control para las acciones del controladorLoginController

    94

  • Diseo de la lgica de control para las acciones del controladorContratosController

    94

    Implemetacin de la lgica de control del controladorNotasController

    94

    La accin indexAction() 100La accin nuevaAction 100La accin editarAction 101La accin borrarAction() 102Las acciones miEspacioAction() y rssAction 102

    Implemetacin de las plantillas del controlador NotasController 102La unidad en chuletas 105

    Requerimientos en el Routing 105Generando rutas 106Servicio Request 106Servicio Session 106Ampliando el cdigo de un bloque heredado en una plantilla twig 107Generando redirecciones desde un controlador 107Haciendo forwarding a otra accin 107

    Comentarios 107Unidad 7: Desarrollo de la aplicacin MentorNotas (III). El modelo y lapersistencia de datos.

    108

    El Object Relational Mapping (ORM) 108Las entidades 109Construccin de las entidades. El generador de entidades deSymfony2

    111

    Creacin de la base de datos 118El servicio de persistencia Doctrine2 119Refinamos el modelo. Las asociaciones entre objetos 125

    La relacin One to Many 126La relacin Many to One 127La relacin Many to Many 127

    Ms all de los mtodos findBy. El lenguaje DQL 132Organizamos las consultas en repositorios 135Incorporamos el modelo a la aplicacin 138La unidad en chuletas 139

    Construir entidades 139Configuracin de la base de datos 139Crear la base de datos y las tablas 139Persistir un objeto en la base de datos 140

  • Recuperar objetos con mtodos find 140Borrar un objeto 140Especificacin de las relaciones entre entidades (forma simple yprctica)

    141

    Implementacin de un mtodo de repositorio 142Comentarios 142

    Unidad 8: Desarrollo de la aplicacin MentorNotas (IV). Validacin yFormularios

    143

    El servicio de validacin 143El servicio de formularios 149

    Formularios definidos en la accin 150Definicin de tipos para crear formularios 154Validacin de formularios 156

    La unidad en chuletas 160El servicio de validacin 160El servicio de formularios 161Mtodo para la validacin de formularios. 163

    Comentarios 164Unidad 9: Desarrollo de la aplicacin MentorNotas (V). Seguridad -Autentificacin y Autorizacin

    165

    Componentes y funcionamiento del servicio de seguridad deSymfony2.

    165

    Los proveedores de usuarios (user providers) 166Los cortafuegos (firewalls) 166El control de acceso (access control) y la jerarqua de roles (rolehierarchy)

    167

    Los codificadores (encoders) 168La seguridad en accin 168El proveedor de usuarios in memory 169Autentificacin 170

    Autentificar con HTTP Basic 171Autentificar con un formulario de Login tradicional 173Saliendo de la sesin (logout) 176

    Autorizacin 177Protegiendo los recursos de la aplicacin 177Protegiendo los controladores y plantillas de la aplicacin 178Exigiendo canal seguro 179

    La base de datos como proveedor de usuarios 179El servicio de codificacin. Los encoders 184

  • Recuperando el objeto Usuario 185La unidad en chuletas 186

    Users providers 186Cortafuegos 187Autorizacin 188Encoders 188

    Comentarios 189Unidad 10: Desarrollo de la aplicacin MentorNotas (VI). Esamblando todoel frontend

    190

    La eclosin de la crislida 190Primero los activos (assets) 191Despus las plantillas 191Adaptacin de las pantallas del panel de notas 193El layout del panel de notas 193

    Las acciones del panel de notas 196El proceso de registro 207El resto de la aplicacin. 214

    Unidad 11: Desarrollo de la aplicacin MentorNotas (VII). Desarrollo delbackend

    215

    Estrategias de desarrollo para la parte de administracin 215El generador de mdulos CRUD de Symfony2 216El generador de mdulos CRUD SonataAdminBundle 217

    Instalacin del SonataAdminBundle 217Inyeccin de los mdulos de administracin 221Entidad Contrato 223Entidad Grupo 225Entidad Publicidad 226Entidad Usuario 230

    Ejercicios del Curso: Desarrollo de Aplicaciones Web con Symfony2 235Ejercicios de la unidad 2 235

    Ejercicio 1 235Ejercicio 2 235Ejercicio 3 235Ejercicio 4 235Ejercicio 5 235Ejercicio 6 235

    Ejercicios de la unidad 3 235Ejercicio 1 236

  • Ejercicio 2 236Ejercicio 3 236Ejercicio 4 237Ejercicio 5 237

    Ejercicios de la unidad 4 237Ejercicio 1 237Ejercicio 2 237

    Ejercicios de la unidad 5 238Ejercicio 1 238Ejercicio 2 238Ejercicio 3 238Ejercicio 4 238

    Ejercicios de la unidad 6 239Ejercicio 1 239Ejercicio 2 239Ejercicio 3 241

    Ejercicios de la unidad 7 242Ejercicio 1. Fixtures 242

    Instalacin del bundle DoctrineFixturesBundle 242Creacin de los fixtures 244Instalacin manual del bundle (sin utilizar bin/vendor) 248

    Ejercicio 2 248Ejercicio 3 248

    Ejercicios de la unidad 9 248Ejercicio 1 249Ejercicio 2 249Ejercicio 3 249Ejercicio 4 249

    Ejercicios de la unidad 10 249Ejercicio 1 250Ejercicio 2 250Ejercicio 3 250

    Indices y tablas 251Indices y tablas 252

  • Curso: Desarrollo de Aplicaciones Web conSymfony2Contenidos:

    Curso: Desarrollo de Aplicaciones Web con Symfony2

    1

  • Licencia

    Este trabajo:Desarrollo de Aplicaciones web con Symfony2

    ha sido elaborado por Juan David Rodrguez Garca ([email protected])y se encuentra bajo una Licencia:Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported.Autor del cdigo: Juan David Rodrguez Garca

    Licencia

    2

  • Unidad 1. InmersinAplicaciones webLa World Wide Web es un sistema de documentos de hipertexto o hipermedios enlazados ydistribuidos a travs de Internet. En sus comienzos, la interaccin entre los usuarios de laWWW y sus servidores era muy reducida: a travs de un software cliente denominadonavegador web, el usuario se limitaba a solicitar documentos a los servidores y estosrespondan a aquellos con el envo del documento solicitado. A estos documentos quecirculaban por el espacio web se les denomin pginas web. Cada recurso, conocido comopgina web, se localiza en este espacio mediante una direccin nica que describe tanto alservidor como al recurso: la URL. Cada pgina web puede incorporar las URL's de otraspginas como parte de su contenido. De esta manera se enlazan unas con otras.Han pasado casi 20 aos desde la aparicin de la Word Wide Web y, aunque en esencia sufuncionamiento, basado en el protocolo HTTP, sigue siendo el mismo, la capacidad deinteraccin entre usuarios y servidores se ha enriquecido sustancialmente. De la pgina webhemos pasado a la aplicacin web; un tipo de aplicacin informtica que adopta, de maneranatural, la arquitectura cliente-servidor de la web. De manera que en las peticiones alservidor, el usuario no slo solicita un recurso, si no que adems puede enviar datos. Elservidor los procesa y elabora la respuesta que corresponda en funcin de ellos. Es decir, elservidor construye dinmicamente la pgina web que le enva al cliente.Todo el peso de la aplicacin reside en el servidor, mientras que el cliente, esto es, elnavegador web, se limita a presentar el contenido que recibe mostrndolo al usuario.Esta evolucin comenz con la aparicin de los CGI's, que son aplicaciones escritas encualquier lenguaje de programacin y que pueden ser accedidas por el servidor web apeticin del cliente, y ha madurado gracias a la aparicin de los lenguajes de programacindel lado del servidor, como PHP, Java o Python, gracias a los cuales los servidores web(apache como ejemplo ms conocido y usado) han ampliado su funcionalidades; ya no sloson capaces de buscar, encontrar y enviar documentos a peticin del cliente, si no quetambin pueden procesar peticiones (acceder a base de datos, realizar peticiones a otrosservidores, ejecutar algoritmos, ) y construir los documentos que finalmente sernenviados al cliente en funcin de los datos que este les ha proporcionado.Tambin es relevante en esta evolucin de la web la incorporacin de procesamiento en losnavegadores web mediante lenguajes de scripting como javascript, que permiten laejecucin de ciertos procesos (casi todos relacionados con la manipulacin de la interfazgrfica) en el lado del cliente. De hecho, en la actualidad existen aplicaciones que delegangran parte de sus procesos al lado del cliente, aunque de todas formas, todo el cdigo esproporcionado desde la parte servidora la primera vez que se solicita el recurso.Todo esto ha sido bautizado con el omnipresente y manido trmino de Web 2.0, que enrealidad es una manera de referirse a este aumento de la capacidad de interaccin con elusuario, y que ha permitido el desarrollo y explosin de las redes sociales y la blogosferaentre otros muchos fenmenos de la reducida pero incesante historia de la World Wide Web.El panorama actual se resume en un inters creciente por las aplicaciones web, hasta elpunto de que, en muchos casos, han desplazado a la madura aplicacin de escritorio. Sonvarias las razones que justifican este hecho y, aunque se trata de un tema que por suamplitud no abordaremos en detalle, si que sealaremos algunas:

    Se mejora la mantenibilidad de las aplicaciones gracias a su centralizacin. Al residir laaplicacin en el servidor, desaparece el problema de la distribucin de las mismas. Porejemplo, los cambios en la interfaz de usuario son realizado una sola vez en el servidory tienen efecto inmediatamente en todos los clientes.

    Unidad 1. Inmersin

    3

  • Se aumenta la capacidad de interaccin y comunicacin entre los usuarios de la misma,as como de su gestin.

    Al ser HTTP un protocolo de comunicacin ligero y sin conexin (conectionless) seevita mantener conexiones abiertas con todos y cada uno de sus clientes, mejorando laeficiencia de los servidores.

    Para utilizar la aplicacin, los usuarios tan solo necesitan tener instalado un softwaredenominado navegador web (browser). Esto reduce drsticamente los problemas deportabilidad y distribucin. Tambin permite que terminales ligeras, con poca capacidadde proceso, puedan utilizar grandes aplicaciones ya que su funcin se limita a mostrarmediante el navegador los datos que le han sido enviado.

    El desarrollo de dispositivos mviles con conectividad a redes expande el dominio deuso de las aplicaciones web y abre nuevos mercados.

    Se puede acceder a la aplicacin desde cualquier punto con acceso a la red dondepreste servicio la aplicacin. Si se trata de Internet, desde cualquier parte del mundo, sise trata de una intranet desde cualquier parte del mundo con acceso a la misma. Todoello sin necesidad de instalar nada ms que el navegador en la computadora cliente(punto anterior).

    Los lenguajes utilizados para construir las aplicaciones web son relativamente fciles deaprender. Adems algunos de los ms utilizados ,como PHP y Python, se distribuyen conlicencias libres y existe una gran cantidad de documentacin de calidad disponible en lapropia red Internet.

    Recientemente han aparecido en escena varias plataformas y frameworks de desarrollo(por ejemplo Zend Framework, CakePHP, symfony, Symfony2) que facilitan laconstruccin de las aplicaciones web, reduciendo el tiempo de desarrollo y mejorando lacalidad.

    Obviamente no todo son ventajas; incluso algunas de las ventajas que hemos sealadopueden convertirse en desventajas desde otros puntos de vista. Por ejemplo:

    el hecho de que los cambios realizados en una aplicacin web sean efectivosinmediatamente en todos los clientes que la usan, puede dejar sin servicio a un grannmero de usuarios si este cambio provoca un fallo (intencionado si se trata de unataque, o no intencionado si se trata de una modificacin que no ha sido debidamenteprobada). Esto repercute en la necesidad de aumentar las precauciones y la seguridadpor parte de los responsables tcnicos que mantienen la aplicacin.

    La disponibilidad de la aplicacin es completamente dependiente de la disponibilidad dela red. As la aplicacin web ser til en entornos donde se garantice la estabilidad de lared. Los programadores necesitan dominar las distintas tecnologas y conceptos que, enestrecha colaboracin, conforman la aplicacin (HTTP, HTML, XML, CSS, javascript,lenguajes de scripting del lado del servidor como PHP, Java o Python, )

    La triste realidad de las incompatibilidades entre navegadores.No obstante, la realidad demuestra que el inters por las aplicaciones web es un hechoconsumado, lo cual seduce a los programadores de todo el mundo a formarse en lastecnologas y estrategias que permiten desarrollarlas. Este curso tiene como objetivopresentar una de las ms exitosas: el desarrollo de aplicaciones web mediante el uso delframework Symfony2.

    Desarrollo rpido y de calidad de aplicaciones webLa experiencia adquirida tras muchos aos de construccin de aplicaciones informticas de escritorio, dio lugar a la aparicin de entornos y frameworks de desarrollo que no solo hacan posible construir rpidamente las aplicaciones, si no que adems cuidaban la calidad de las

    Desarrollo rpido y de calidad de aplicaciones web

    4

  • mismas. Es lo que tcnicamente se conoce como Desarrollo Rpido de Aplicaciones.Sin embargo, el desarrollo de aplicaciones web es muy reciente, por lo que estasherramientas de desarrollo rpido y de calidad no han aparecido en el mundo de la webhasta hace bien poco. De hecho la construccin de una aplicacin web de calidad no haestado exenta de dificultades debido a esta carencia. Afortunadamente contamos desdehace unos pocos aos con frameworks de desarrollo de aplicaciones web que facilitan eldesarrollo de las mismas y estn haciendo que el concepto de Desarrollo Rpido deAplicaciones en este campo sea una realidad. Symfony2 representa una de las herramientasde ms xito para la construccin de aplicaciones web de calidad con PHP.Desarrollar con Symfony2 hace ms sencillo la construccin de aplicaciones web quesatisfagan las siguientes caractersticas, deseables en cualquier tipo de aplicacininformtica profesional al margen de sus requisitos especficos.

    Fiabilidad. La aplicacin debe responder de forma que sus resultados sean correctos ypodamos fiarnos de ellos. Tambin implica que los datos que introducimos comoentrada sean debidamente validados para asegurar un comportamiento correcto.

    Seguridad. La aplicacin debe garantizar la confidencialidad y el acceso a la misma ausuarios debidamente autentificados y autorizados. En el caso de las aplicaciones webesto es especialmente importante puesto que residen en computadores que, alpertenecer a una red, son accesibles a una gran cantidad de personas. Lo que significaque inevitablemente estn expuestas a ser atacadas con fines maliciosos. Por ellodeben incorporar mecanismos de proteccin ante conocidas tcnicas de ataque webcomo puede ser el Cross Site Scripting (XSS).

    Disponibilidad. La aplicacin debe prestar servicio cuando se le solicite. Es importante,por tanto, que los cambios requeridos por operaciones relacionadas con elmantenimiento (actualizaciones, migraciones de datos, migraciones de la aplicacin aotros servidores, etctera) sean sencillos de controlar. De esa manera se evitarn largastemporadas de inactividad. La disponibilidad es una de las caractersticas ms valoradasen las aplicaciones web, ya que el funcionamiento de la misma no depende, por logeneral, de sus usuarios si no de los responsables tcnicos del sistema donde seencuentre alojada. Hay que pensar en ellos y ponrselo fcil cuando necesiten realizareste tipo de tarea. Tambin es importante que los errores de funcionamiento debidos aerrores de programacin (bugs) sean rpidamente diagnosticados y resueltos paramejorar tanto la disponibilidad como la fiabilidad de la aplicacin.

    Mantenibilidad. A medida que se usa una aplicacin, aparecen nuevos requisitos yfuncionalidades que se desean ofrecer. Un sistema mantenible permite ser extendidosin que ello suponga un coste muy alto, minimizando la probabilidad de introducirerrores en los aspectos que ya estaban funcionando antes de emprender laimplementacin de nuevas caracterstcas.

    Escalabilidad, es decir, que la aplicacin pueda ampliarse sin perder calidad en losservicios ofrecidos, lo cual se consigue disendola de manera que sea flexible ymodular.

    Presentacin del curso

    A quin va dirigidoEste curso va dirigido a personas que ya cuenten con cierta experiencia en la programacinde aplicaciones web. A pesar de que Symfony2 est construido sobre PHP, no es tanimportante conocer dicho lenguaje como estar familiarizado con las tecnologas de la web ycon el paradigma de la programacin orientada a objetos.

    Presentacin del curso

    5

  • En la confeccin del curso hemos supuesto que el estudiante comprende los fundamentos delas tecnologas que componen las aplicaciones web y las relaciones que existen entre ellas:

    El protocolo HTTP y los servidores web, Los lenguajes de marcado HTML y XML, Las hojas de estilo CSS's, Javascript como lenguaje de script del lado del cliente, Los lenguajes de script del lado del servidor (PHP fundamentalmente), Los fundamentos de la programacin orientada a objetos (mejor con PHP), Los fundamentos de las bases de datos relacionales y los sistemas gestores de base de

    datos.Obviamente, para seguir el curso, no hay que ser un experto en cada uno de estastecnologas, pero s es importante conocerlas hasta el punto de saber cual es el papel quedesempea cada una y como se relacionan entre s. Cualquier persona que hayadesarrollado alguna aplicacin web mediante el archiconocido entorno LAMP o WAMP(Linux/Windows Apache MySQL PHP), debera tener los conocimientos necesarios paraseguir con provecho este curso.

    Objetivos del cursoCuando finalices el curso habrs adquirido suficiente conocimiento para desarrollaraplicaciones web mediante el empleo del framework de desarrollo en PHP Symfony2. Ellosignifica a grandes rasgos que sers capaz de construir aplicaciones web que:

    Son altamente modulares, extensibles y escalables. Separan claramente la lgica de negocio de la presentacin, permitiendo que el trabajo

    de programacin y de diseo puedan realizarse independientemente. Incorporaran un sistema sencillo, flexible y robusto garantizar la seguridad a los niveles

    de autentificacin y autorizacin. Acceden a las bases de datos a travs de una capa de abstraccin que permite cambiar

    de sistema gestor de base de datos sin ms que cambiar un parmetro deconfiguracin. No es necesario tocar ni una sola lnea de cdigo para ello.

    Cuentan con un flexible sistema de configuracin mediante el que se puede cambiargran parte del comportamiento de la aplicacin sin tocar nada de cdigo. Esto permite,entre otras cosas, que se puedan ejecutar en distintos entornos: de produccin, dedesarrollo y de pruebas, segn la fase en la que se encuentre la aplicacin.

    Pueden ofrecer el resultado final en varios formatos distintos (HTML, XML, JSON, RSS,txt, ) gracias al avanzado sistema de generacin de vistas,

    Cuentan con un potente sistema de gestin de errores y excepciones, especialmentetil en el entorno de desarrollo.

    Implementan un sistema de cach que disminuye los tiempos de ejecucin de losscripts.

    Incorpora por defecto mecanismos de seguridad contra ataques XSS y CSRF. Pueden ser internacionalizadas con facilidad, aunque la aplicacin no se haya

    desarrollado con la internacionalizacin como requisito. Incorporan un sistema de enrutamiento que proporciona URL's limpias, compuestas

    exclusivamente por rutas que ocultan detalles sobre la estructura de la aplicacin.

    Objetivos del curso

    6

  • Cuentan con un avanzado sistema de autentificacin y autorizacin.El curso cubre una porcin suficientemente completa sobre las mltiples posibilidades queofrece Symfony2 para desarrollar aplicaciones web, incidiendo en sus caractersticas yherramientas ms fundamentales. El objetivo es que, al final del curso, te sientas cmodousando Symfony2 y te resulte sencillo y estimulante continuar profundizando en elframework a medida que tu trabajo lo sugiera.Cuando emprendas el estudio de este curso, debes tener en cuenta que el aprendizaje decualquier framework de desarrollo de aplicaciones, y Symfony2 no es una excepcin, esbastante duro en los inicios. Sin embargo merece la pena, pues a medida que se vanasimilando los conceptos y procedimientos propios del framework, la productividad aumentamuchsimo.

    Plan del cursoPara conseguir los objetivos que nos hemos propuesto hemos optado por un planteamientocompletamente prctico en el que se est picando cdigo funcional desde el principio delcurso.En la unidad 2, sin utilizar Symfony2 para nada, desarrollamos una sencilla aplicacin weben PHP. El objetivo de esta unidad es mostrar como se puede organizar el cdigo para quesiga los planteamientos del patrn de diseo Modelo Vista Controlador (MVC), gracias alcual separamos completamente la lgica de negocio de la presentacin de la informacin. Esimportante comprender los fundamentos de esta organizacin ya que las aplicacionesdesarrolladas con Symfony2 suelen seguir este patrn. Adems en esta unidad se introducenlos conceptos de controlador frontal, accin, plantilla y layout, ampliamente usados en elresto del curso.En la unidad 3 hacemos una presentacin panormica de Symfony2, exponiendo losconceptos fundamentales. En esta unidad volveremos a escribir, esta vez utilizandoSymfony2, la aplicacin de la unidad 2. Dicho ejercicio nos ayudar a realizar la presentacindel framework a la vez que servir como referencia para los conceptos bsicos. Avisamos:esta unidad es bastante densa.La unidad 4 la hemos dedicado completamente al estudio de un importante patrn dediseo en torno al cual se ha construido Symfony2: La inyeccin de dependencias. Es muyimportante comprender este concepto para sentirse cmodo con Symfony2 y para poderextender el framework con soltura.En la unidad 5 planteamos el anlisis de una aplicacin, que an siendo concebida concriterios pedaggicos, es suficientemente amplia como para ser considerada una aplicacinprofesional. Se trata de de una aplicacin para la gestin de notas (al estilo de los post-it)inspirada en EverNote una herramienta que ltimamente est teniendo mucho xito entrelos usuarios de plataformas mviles (smartphones y tabletas). Su desarrollo nos servircomo vehculo para penetrar al interior de Symfony2 durante el resto del curso.En las siguientes unidades se construyen progresivamente las distintas funcionalidades de laaplicacin analizada en la unidad 5. Cada unidad incide sobre algn aspecto fundamental deSymfony2.En la unidad 6 profundizamos en el concepto de routing y los controladores, conceptosfundamentales sobre los que descansa la lgica de las aplicaciones construidas conSymfony2.En la unidad 7 se realiza un estudio bastante detallado del ORM Doctrine2 para eltratamiento de los datos persistentes, es decir, para el acceso a bases de datos.Adelantamos aqu que, a pesar de cubrir los aspectos fundamentales para el desarrollo casicualquier tipo de aplicacin, Doctrine2 va mucho ms all. Un tratamiento completo de estemagnifico ORM requiere un curso dedicado al mismo.

    Plan del curso

    7

  • La unidad 8 est dedicada a los servicios de validacin de datos y de creacin deformularios HTML, herramienta fundamental en cualquier aplicacin web.En la unidad 9 estudiamos el novedoso sistema de seguridad de Symfony2, mediante elcual podemos proteger nuestras aplicaciones web en los niveles de autentificacin yautorizacin sin necesidad de picar demasiado cdigo.La unidad 10 integra todos los conocimientos acumulados a lo largo del curso para darforma definitiva a la aplicacin de gestin de notas. Aqu incorporamos las plantillas, estilosenriquecidos con javascript (jQuery) y perfilamos los flecos que se nos han ido quedando enlas unidades anteriores.Por ltimo en la unidad 11 explicaremos las distintas estrategias que podemos seguir paradesarrollar el backend, o parte de administracin, de las aplicaciones web. Utilizaremos unconocido y potente bundle (los plugins de Symfony2) con el que se pueden construirelegantes y prcticas aplicaciones de backend sin necesidad de picar mucho cdigo.

    Sobre Symfony2La primera versin estable de Symfony2 ha sido desarrollada en un tiempo record de 448das. El primer commit tiene fecha de 3/6/2010, mientras que el ltimo, correspondiente a laversin 2.0.1, es del 25/08/2011. Al extraordinario talento del equipo liderado por FabienPotencier, lider del proyecto, se une los ms de 6 aos de experiencia acumulada durante eldesarrollo de la primera versin de este producto. El resultado ha sido doble; por una partehan construido un conjunto de componentes que actan como piezas de un Lego para lasolucin de problemas relacionados con la web y, por otro, han elaborado un framework parael desarrollo de aplicaciones web utilizando como pilares tales componentes. Por eso cuandose habla de Symfony2 debemos interpretar, en funcin del contexto como con toda palabrapolismica, si se hace referencia a los componentes o al framework. Este curso va de losegundo.Symfony 1, el antecesor de Symfony2, ha sido y sigue siendo un framework lder en elmundo PHP. Prueba de ello es la amplia y activa comunidad que lo desarrolla y que lo utiliza.El nmero de aplicaciones registradas en el trac5 del proyecto tambin da una idea de laconfianza que muchos desarrolladores han depositado en symfony 1. Pues bien, un anlisisde la situacin actual parece indicar que Symfony2 va camino de destronar a su antecesor(si no lo ha hecho ya). La actividad del proyecto, que puede seguirse pblicamente en surepositorio de github (https://github.com/symfony/symfony) y la proliferacin de sitios sobreSymfony2 soportan esta observacin. Otro indicativo del xito que est teniendo esta nuevaversin, es el hecho de que los desarrolladores de Drupal, han decidido utilizar varios de loscomponentes de Symfony2 para el desarrollo de la versin 8 de su producto.

    La documentacin de Symfony2Posiblemente una de las caractersticas ms apreciadas de symfony 1 fue la cantidad y lacalidad de documentacin oficial que existe. Ello proporciona la tranquilidad de saber queprcticamente cualquier problema que se le presente al programador estar resuelto, o almenos estar resuelto algo parecido, en alguno de los muchos documentos que sobresymfony 1 se han escrito.Tambin en Symfony2, no poda ser de otra forma, se ha prestado mucha atencin a lacalidad de la documentacin, aunque por el momento nicamente se encuentra en ingls eitaliano. El documento imprescindible es el libro oficial(http://symfony.com/doc/current/book/index.html), que est complementado por el libro derecetas (http://symfony.com/doc/current/cookbook/index.html), una gua de referencia conlas principales opciones de configuracin(http://symfony.com/doc/current/reference/index.html), algunos videos demostrativos, y ladocumentacin de la API (http://api.symfony.com/2.0/).

    Sobre Symfony2

    8

  • Todo ello lo encontrars en el sitio oficial de Symfony2 (http://symfony.com/). Si finalmenteterminas atrapado en las redes de Symfony2 no te quepa duda de que se convertir en unade tus herramientas imprescindibles. Esperamos que este curso tambin se encuentre entreellas.Como ya hicimos con el curso "Desarrollo de aplicaciones web con symfony", hemosdesarrollado el texto desde una perspectiva ms pedaggica que tcnica, ya que es en aquelaspecto donde la documentacin oficial de Symfony2 es ms endeble. Este curso supone unapoyo pedaggico para aprender a desarrollar aplicaciones web con Symfony2, y nopretende ni sustituir ni desdear la documentacin oficial. Muy al contrario creemos, comoya hemos sealado, que dicha documentacin es muy valiosa y debe formar parte delequipo de recursos necesarios para desarrollar con Symfony2.

    ComentariosAqu puedes enviar comentarios, dudas y sugerencias. Utiliza la barra de scroll interna pararecorrer todos los mensajes. El formulario de envo se encuentra al final.Autor del cdigo: Juan David Rodrguez Garca

    Comentarios

    9

  • Unidad 2: Desarrollo de una aplicacin web siguiendoel patrn MVCEl patrn MVC en el desarrollo de aplicaciones webMuchos de los problemas que aparecen en la ingeniera del software son similares en suestructura. Y, por tanto, se resuelven de manera parecida. A lo largo de la historia de estadisciplina se han elaborado un buen nmero de esquemas resolutivos que son conocidos conel nombre des patrones de diseo 1 y cuyo conocimiento y aplicacin son de una inestimbleayuda a la hora de disear y construir una aplicacin informtica.Posiblemente uno de los ms conocidos y utilizados sea el patrn "Modelo, Vista,Controlador" (MVC), que propone organizar una aplicacin en tres partes bien diferenciadasy dbilmente acopladas entre s, de manera que los cambios que se produzcan en una noafecten demasiado a las otras (idealmente nada). El nombre del patrn enumera cada unade las partes:

    El Controlador. En este artefacto se incluye todo lo referente a la lgica de control dela aplicacin, que no tiene nada que ver con las caractersticas propias del negocio parael que se est construyendo la aplicacin. En el caso de una aplicacin web, un ejemplosera la manipulacin de la request HTTP.

    El Modelo. Donde se implementa todo lo relativo a la lgica de negocio, es decir, losaspectos particulares del problema que la aplicacin resuelve. Si, por ejemplo estamosdesarrollando un blog, un ejemplo sera una librera de funciones para la gestin de loscomentarios.

    La Vista. Aqu se ubica el cdigo encargado de "pintar" el resultado de los procesos dela aplicacin. En una aplicacin web la vista se encarga de producir documentos HTML,XML, JSON, etctera, con los datos que se hayan calculado previamente en la aplicacin.

    Para que el conjunto funcione, las partes deben interaccionar entre s. Y en este puntoencontramos en la literatura distintas soluciones. La que proponemos en este curso es lamostrada en la siguiente figura:

    Diagrama del modelo MVC

    Unidad 2: Desarrollo de una aplicacin web siguiendo el patrn MVC

    10

  • El controlador recibe la orden de entrada y se encarga de procesarla utilizando, si es preciso,los servicios del modelo para ello. Una vez que ha realizado el clculo entrega los datos"crudos" a la vista y esta se encarga de decorarlos adecuadamente. La caracterstica msimportante de esta solucin es que la vista nunca interacciona con el modelo.Las aplicaciones web ms tpicas pueden plantearse segn este patrn: el controlador recibeuna peticin HTTP y la procesa, haciendo uso del modelo calcula los datos de salida y losentrega a la vista, la cual se encarga de construir una respuesta HTTP con las cabecerasadecuadas y un payload o cuerpo de la respuesta que suele ser un contenido HTML, XML oJSON.Aunque no todas las aplicaciones web se pueden ajustar a este modelo, si es cierto que laidea de separar responsabilidades o las distintas areas de un problema en sistemasdbilmente acoplados, es una estrategia comn en las metodologa que utilizan elparadigma de programacin orientado a objetos. Es lo que se conoce en la terminologaanglosajona como Separation Of Concerns 2.En esta unidad vamos a plantear y desarrollar una sencilla aplicacin web utilizando comogua de diseo este patrn. De esta manera ilustraremos sus ventajas y nos servir comomaterial introductorio a la arquitectura de Symfony2. Llegados a este punto hemos deindicar que Fabien Potencier, lider del proyecto, declara que Symfony2, o mejor dicho, laedicin standard del framework construido con los componentes de Symfony2, no es unframework MVC, ya que no trata para nada del modelo y deja al programador absolutalibertad para incoporar las libreras que ms le convenga. En nuestra humilde opinin,creemos que esta apreciacin es el resultado de "hilar muy fino", y que, en trminosprcticos, Symfony2 se ajusta al patrn MVC. De hecho, en su edicin standard, incorporaDoctrine como ORM. Y aunque es cierto que Doctrine es un proyecto autnomo y externo aSymfony2, no deja de ser un servicio prestado por el framework para la construccin delModelo. Realmente este tipo de discusiones son interesante y nos ayudan a ejercitar nuestramente, pero no creemos que sean vitales para aprender a utilizar el framework.

    Nota

    En http://fabien.potencier.org/article/49/what-is-symfony2, puedes leer un interesanteartculo de Fabien Potencier en el que describe lo que es Symfony2 y trata su punto devista acerca de estos detalles.

    Descripcin de la aplicacinVamos a construir una aplicacin web para elaborar y consultar un repositorio de alimentoscon datos acerca de sus propiedades dietticas. Utilizaremos una base de datos paraalmacenar dichos datos que consistir en una sola tabla con la siguiente informacin sobrealimentos:

    El nombre del alimento, la energa en kilocaloras , la cantidad de protenas, la cantidad hidratos de carbono en gramos la cantidad de fibra en gramos y la cantidad de grasa en gramos,

    todo ello por cada 100 gramos de alimento.

    Descripcin de la aplicacin

    11

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

  • Aunque se trata de una aplicacin muy sencilla, cuenta con los elementos suficientes paratrabajar el aspecto que realmente pretendemos estudiar en esta unidad: la organizacin delcdigo siguiendo las directrices del patrn MVC. Comprobaremos como esta estrategia nosayuda a mejorar las posibilidades de crecimiento (escalabilidad) y el mantenimiento de lasaplicaciones que desarrollamos.

    Diseo de la aplicacin (I). Organizacin de los archivosLa "anatoma" de una aplicacin web tpica consiste en:

    1. El cdigo que ser procesado en el servidor (PHP, Java, Python, etctera) para construirdinmicamente la respuesta.

    2. Los Assets, que podemos traducir como "activos" de la aplicacin, y que lo constituyentodos aquellos archivos que se sirven directamente sin ningn tipo de proceso. Suelenser imgenes, CSS's y cdigo Javascript.

    El servidor web nicamente puede acceder a una parte del sistema de ficheros que sedenomina Document Root. Es ah donde se buscan los recursos cuando se realiza unapeticin a la raz del servidor a travs de la URL http://el.servidor.que.sea/. Sinembargo, el cdigo ejecutado para construir dinmicamente la respuesta puede "vivir" encualquier otra parte, fuera del Document root 3.Tode esto sugiere una manera de organizar el cdigo de la aplicacin para que no se puedaacceder desde el navegador ms que al cdigo estrictamente imprescindible para que estafuncione. Se trata, simplemente, de colocar en el Document root slo los activos y losscripts PHP de entrada a la aplicacin. El resto de archivos, fundamentalmente librerasPHP's y ficheros de configuracin (XML, YAML, JSON, etctera), se ubicarn fuera delDocument Root y sern incluidos por los scripts de inicio segn lo requieran.Siguiendo estas conclusiones, nuestra aplicacin presentar la siguiente estructura dedirectorio:

    . app web css images js

    Configuraremos nuestro servidor web para que el directorio web sea su Document root, y enapp colocaremos el cdigo PHP y la configuracin de la aplicacin.

    Diseo de la aplicacin (II). El controlador frontalLa manera ms directa y naf de construir una aplicacin en PHP consiste en escribir unscript PHP para cada pgina de la aplicacin. Sin embargo esta prctica presenta algunosproblemas, especialmente cuando la aplicacin que desarrollamos adquiere cierto tamao ypretendemos que siga creciendo. Veamos algunos de los problemas ms significativos deeste planteamiento.Por lo general, todos los scripts de una aplicacin realizan una serie de tareas que son comunes. Por ejemplo: interpretar y manipular la request, comprobar las credenciales de seguridad y cargar la configuracin. Esto significa que una buena parte del cdigo puede ser compartido entre los scripts. Para ello podemos utilizar el mecanismo de inclusin de ficheros de PHP y fin de la historia. Pero, qu ocurre si en un momento dado, cuando ya tengamos escrito mucho cdigo, queremos aadir a todas las pginas de la aplicacin una nueva caracterstica que requiere, por ejemplo, el uso de una nueva librera?. Tenemos,

    Diseo de la aplicacin (I). Organizacin de los archivos

    12

  • entonces, que aadir dicha modificacin a todos los scripts PHP de la aplicacin. Lo cualsupone una degradacin en el mantenimiento y un motivo que aumenta la probabilidad defallos una vez que el cambio se haya realizado.Otro problema que ocurre con esta estrategia es que si se solicita una pgina que no tieneningn script PHP asociado, el servidor arrojar un error (404 Not Found) cuyo aspecto nopodemos controlar dentro de la propia aplicacin (es decir, sin tocar la configuracin delservidor web).Como se suele decir, a grandes males grandes remedios!; si el problema lo genera el hechode tener muchos scripts, que adems comparten bastante cdigo, utilicemos uno solo quese encargue de procesar todas las peticiones. A este nico script de entrada se le conocecomo controlador frontal.Entonces, cmo puedo crear muchas pginas distintas con un solo script?. La clave est enutilizar la query string de la URL como parte de la ruta que define la pgina que se solicita. Elcontrolador frontal, en funcin de los parmetro que lleguen en la query string determinarque acciones debe realizar para construir la pgina solicidada.

    Nota

    La query string es la parte de la URL que contiene los datos que se pasarn a laaplicacin web. Por ejemlo, en: http://tu.servidor/index.php?accion=hola, laquery string es: ?accion=hola.

    Construccin de la aplicacin. Vamos al lo.Pues eso, vamos al lo aplicando todo lo que llevamos dicho hasta el momento:

    El patrn de diseo MVC, La estructura de directorios que expone nicamente los ficheros indispensables para el

    servidor web y, La idea de que todas la peticiones pasen por un solo script, el controlador frontal

    Creacin de la estructura de directoriosComenzamos creando la estructura de directorios propuesta anteriormente. Por lo pronto, ennuestro entorno de desarrollo y por cuestiones de comodidad, crearemos la estructura enalguna ubicacin dentro del Document root.

    Nota

    Si ests utilizando como sistema operativo Ubuntu, el Document root se encuentraen /var/www, es ah donde debes crear un directorio denominado alimentos quealojar la estructura propuesta. Si ests utilizando XAMP en Windows, se encuentra enC:/xampp/htdocs.Es importante resaltar que esto no debera hacerse en un entorno de produccin, ya que dejamos al servidor web acceder directamente al directorio app, y es algo que deseamos evitar. Sin embargo, de esta manera podemos aadir todos los proyectos que queramos sin tener que tocar la configuracin del servidor web. Lo cual es algo muy agradecido cuando se est desarrollando. En un entorno de produccin debemos

    Construccin de la aplicacin. Vamos al lo.

    13

  • asegurarnos de que el directorio web es el Document root del servidor (o delVirtualHost de nuestra aplicacin, si es que estamos alojando varias webs en unmismo servidor).

    Nuestra implementacin del patrn MVC ser muy sencilla; crearemos una clase para laparte del controlador que denominaremos Controller, otra para el modelo quedenominaremos Model, y para los parmetros de configuracin de la aplicacin utilizaremosuna clase que llamaremos Config. Los archivos donde se definen estas clases losubicaremos en el directorio app. Por otro lado las Vistas sern implementadas comoplantillas PHP en el directorio app/templates.Los archivos CSS, Javascript , las imgenes y el controlador frontal los colocaremos en eldirectorio web.Cuando terminemos de codificar, la estructura de ficheros de la aplicacin presentar elsiguiente aspecto:

    /var/www/alimentos app | templates | Controller.php | Model.php | Config.php | web css images js index.php

    El controlador frontal y el mapeo de rutasEn cualquier aplicacin web se deben definir las URL's asociadas a cada una de sus pginas.Para la nuestra definiremos las siguientes:

    URL Accinhttp://tu.servidor/alimentos/index.php?ctl=inicio mostrar pantalla iniciohttp://tu.servidor/alimentos/index.php?ctl=listar listar alimentoshttp://tu.servidor/alimentos/index.php?ctl=insertar insertar un alimentohttp://tu.servidor/alimentos/index.php?ctl=buscar buscar alimentoshttp://tu.servidor/alimentos/index.php?ctl=ver&id=x ver el alimento x

    A cada una de estas URL's les vamos a asociar un mtodo pblico de la clase Controller.Estos mtodos se suelen denominar acciones. Cada accin se encarga de calculardinmicamente los datos requeridos para construir su pgina. Podr utilizar, si le hace falta,lo servicios de la clase Model. Una vez calculados los datos, se los pasar a una plantilladonde se realizar, finalmente, la construccin del documento HTML que ser devuelto alcliente.Todos estos elementos sern "orquestados" por el controlador frontal, el cual lo implementaremos en un script llamado index.php ubicado en el directorio web. En concreto,

    El controlador frontal y el mapeo de rutas

    14

  • la responsabilidad del controlador frontal ser:

    cargar la configuracin del proyecto y las libreras donde implementaremos la parte delModelo, del Controlador y de la Vista.

    Analizar los parmetros de la peticin HTTP (request) comprobando si la pginasolicitada en ella tiene asignada alguna accin del Controlador. Si es as la ejecutar, sino dar un error 404 (page not found).

    Llegados a este punto es importante aclara que, el controlador frontal y la claseController, son distintas cosas y tienen distintas responsabilidades. El hecho de que ambosse llamen controladores puede dar lugar a confusiones.El controlador frontal tiene el siguiente aspecto. Crea el archivo web/index.php y copia elsiguiente cdigo.

    1

  • 44 $controlador['action'] .45 ' no existe';46 }

    En las lneas 5-7 se realiza la carga de la configuracin del modelo y de loscontroladores.

    En las lneas 10-16 se declara un array asociativo cuya funcin es definir una tabla paramapear (asociar), rutas en acciones de un controlador. Esta tabla ser utilizada acontinuacin para saber qu accin se debe disparar.

    En las lneas 19-31 se lleva a cabo el parseo de la URL y la carga de la accin, si la rutaest definida en la tabla de rutas. En caso contrario se devuelve una pgina de error.Observa que hemos utilizado la funcin header() de PHP para indicar en la cabeceraHTTP el cdigo de error correcto. Adems enviamos un pequeo documento HTML queinforma del error. Tambin definimos a inicio como una ruta por defecto, ya que si laquery string llega vaca, se opta por cargar esta accin.

    Nota

    En honor a la verdad tenemos que decir que lo que estamos llamando parseo de laURL, no es tal. Simplemente estamos extrayendo el valor de la variable ctl que se hapasado a travs de la peticin HTTP. Sin embargo, hemos utilizado este terminoporque lo ideal sera que, en lugar de utilizar parmetros de la peticin HTTP pararesolver la ruta, pudisemos utilizar rutas limpias (es decir, sin caracteres ? ni & ) deltipo:

    http://tu.servidor/index.php/iniciohttp://tu.servidor/index.php/buscarhttp://tu.servidor/index.php/ver/5

    En este caso s es necesario proceder a un parseo de la URL para buscar en la tabla derutas la accin que le corresponde. Esto, obviamente, es ms complejo. Pero es lo quehace (y muchas cosas ms) el componente Routing de Symfony2. En la siguienteunidad realizaremos un primer acercamiento a dicho componente que te dar unaidea de la potencia del mismo.

    Las acciones del Controlador. La clase Controller.Ahora vamos a implementar las acciones asociadas a las URL's en la clase Controller. Creael archivo app/Controller.php y copia el siguiente cdigo:

    1

  • 9 'mensaje' => 'Bienvenido al curso de Symfony2', 10 'fecha' => date('d-m-yyy'), 11 ); 12 require __DIR__ . '/templates/inicio.php'; 13 } 14 15 public function listar() 16 { 17 $m = new Model(Config::$mvc_bd_nombre, Config::$mvc_bd_usuario, 18 Config::$mvc_bd_clave, Config::$mvc_bd_hostname); 19 20 $params = array( 21 'alimentos' => $m->dameAlimentos(), 22 ); 23 24 require __DIR__ . '/templates/mostrarAlimentos.php'; 25 } 26 27 public function insertar() 28 { 29 $params = array( 30 'nombre' => '', 31 'energia' => '', 32 'proteina' => '', 33 'hc' => '', 34 'fibra' => '', 35 'grasa' => '', 36 ); 37 38 $m = new Model(Config::$mvc_bd_nombre, Config::$mvc_bd_usuario, 39 Config::$mvc_bd_clave, Config::$mvc_bd_hostname); 40 41 if ($_SERVER['REQUEST_METHOD'] == 'POST') { 42 43 // comprobar campos formulario 44 if ($m->validarDatos($_POST['nombre'], $_POST['energia'], 45 $_POST['proteina'], $_POST['hc'], $_POST['fibra'], 46 $_POST['grasa'])) { 47 $m->insertarAlimento($_POST['nombre'], $_POST['energia'], 48 $_POST['proteina'], $_POST['hc'], $_POST['fibra'], 49 $_POST['grasa']); 50 header('Location: index.php?ctl=listar'); 51 52 } else { 53 $params = array( 54 'nombre' => $_POST['nombre'], 55 'energia' => $_POST['energia'], 56 'proteina' => $_POST['proteina'], 57 'hc' => $_POST['hc'], 58 'fibra' => $_POST['fibra'], 59 'grasa' => $_POST['grasa'], 60 ); 61 $params['mensaje'] = 'No se ha podido insertar el alimento. Revisa el formulario'; 62 }

    63 } 64 65 require __DIR__ . '/templates/formInsertar.php'; 66 } 67 68 public function buscarPorNombre() 69 { 70 $params = array( 71 'nombre' => '', 72 'resultado' => array(), 73 ); 74

    Las acciones del Controlador. La clase Controller.

    17

  • 75 $m = new Model(Config::$mvc_bd_nombre, Config::$mvc_bd_usuario, 76 Config::$mvc_bd_clave, Config::$mvc_bd_hostname); 77 78 if ($_SERVER['REQUEST_METHOD'] == 'POST') { 79 $params['nombre'] = $_POST['nombre']; 80 $params['resultado'] = $m->buscarAlimentosPorNombre($_POST['nombre']); 81 } 82 83 require __DIR__ . '/templates/buscarPorNombre.php'; 84 } 85 86 public function ver() 87 { 88 if (!isset($_GET['id'])) { 89 throw new Exception('Pgina no encontrada'); 90 } 91 92 $id = $_GET['id']; 93 94 $m = new Model(Config::$mvc_bd_nombre, Config::$mvc_bd_usuario, 95 Config::$mvc_bd_clave, Config::$mvc_bd_hostname); 96 97 $alimento = $m->dameAlimento($id); 98 99 $params = $alimento;100 101 require __DIR__ . '/templates/verAlimento.php';102 }103 104 }

    Esta clase implementa una serie de mtodos pblicos, que hemos denominado accionespara indicar que son mtodos asociados a URL's. Fjate como en cada una de las acciones sedeclara un array asociativo ( params ) con los datos que sern pintados en la plantilla. Peroen ningn caso hay informacin acerca de como se pintarn dichos datos. Por otro lado, casitodas las acciones utilizan un objeto de la clase Models para realizar operaciones relativas ala lgica de negocio, en nuestro caso a todo lo relativo con la gestin de los alimentos.Para comprender el funcionamiento de las acciones, comencemos por Analizar la funcinlistar() . Comienza declarando un objeto del modelo (lnea 17) para pedirleposteriormente el conjunto de alimentos almacenados en la base de datos. Los datosrecopilados son almacenados en el array asociativo params (lneas 20-22). Por ltimoincluye el archivo /templates/mostrarAlimentos.php (lnea 24). Tal archivo, quedenominamos plantilla, ser el encargado de construir el documento HTML con los datosdel array params. Observa que todas las acciones tienen la misma estructura: realizanoperaciones, recojen datos y llaman a una plantilla para construir el documento HTML queser devuelto al cliente.Observa tambin que en las acciones del controlador no hay ninguna operacin que tengaque ver con la lgica de negocio, todo lo que se hace es lgica de control.Analicemos ahora la accin insertar(), cuya lgica de control es algo ms compleja debidoa que tiene una doble funcionalidad:

    1. Enviar al cliente un formulario HTML,2. Validar los datos sobre un alimento que se reciben desde el cliente para insertarlos en la

    base de datos.La funcin comienza por declarar un array asociativo con campos vacos que coinciden con los de la tabla alimento (lneas 29-36). A continuacin comprueba si la peticin se ha

    Las acciones del Controlador. La clase Controller.

    18

  • realizado mediante la operacin POST (lnea 41), si es as significa que se han pasado datosa travs de un formulario, si no es as quiere decir que simplemente se ha solicitado lapgina para ver el formulario de insercin. En este ltimo caso, la accin pasa directamentea incluir la plantilla que pinta el formulario (lnea 65). Como el array de parmetros estvaco, se enviar al cliente un formulario con los campos vacos (cuando veas el cdigo de laplantilla lo vers en directo, por lo pronto basta con saber que es as).Por otro lado, si la peticin a la accin insertar() se ha hecho mediante la operacin POST,significa que se han enviado datos de un formulario desde el cliente (precisamente delformulario vaco que hemos descrito un poco ms arriba). Entonces se extraen los datos dela peticin, se comprueba si son vlidos (lnea 44) y en su caso se realiza la insercin (lnea47) y una redireccin al listado de alimentos (lnea 50). Si los datos no son vlidos, entoncesse rellena el array de parmetros con los datos de la peticin (lneas 53-60) y se vuelve apintar el formulario, esta vez con los campos rellenos con los valores que se enviaron en lapeticin anterior y con un mensaje de error.Todo el proceso que acabamos de contar no tiene nada que ver con la lgica de negocio;esto es, no decide cmo deben validarse los datos, ni cmo deben insertarse en la base dedatos, esas tareas recaen en el modelo (el cual, obviamente debemos utilizar). Loimportante aqu es que debe haber una operacin de validacin para tomar una decisin:insertar los datos o reenviar el formulario relleno con los datos que envi el usuario y con unmensaje de error. Es decir, nicamente hay cdigo que implementa la lgica de control.

    Nota

    El esquema de control que se acaba de presentar resulta muy prctico y ordenadopara implementar acciones que consisten en recopilar datos del usuario y realizaralgn proceso con ellos (almacenarlos en una base de datos, por ejemplo). A lo largodel curso aparecer, con ms o menos variaciones, en varias ocasiones.

    La implementacin de la Vista.

    Las plantillas PHPAhora vamos a pasar a estudiar la parte de la Vista, representada en nuestra solucin por lasplantillas. Aunque en el anlisis que estamos haciendo ya hemos utilizado la palabra"plantilla" en varias ocasiones, an no la hemos definido con precisin. As que comenzamospor ah.Una plantilla es un fichero de texto con la informacin necesaria para generar documentosen cualquier formato de texto (HTML, XML, CSV, LaTeX, JSON, etctera). Cualquier tipo deplantilla consiste en un documento con el formato que se quiere generar, y con variablesexpresadas en el lenguaje propio de la plantilla y que representas a lo valores que soncalculados dinmicamente por la aplicacin.Cuando desarrollamos aplicaciones web con PHP, la forma ms sencilla de implementarplantillas es usando el propio PHP como lenguaje de plantillas. Qu significa esto? Acudimosal refranero popular y decimos aquello de que una imagen vale ms que mil palabras. Contodos vosotros un ejemplo de plantilla HTML que usa PHP como lenguaje de plantillas(dedcale un ratito a observarla y analizarla, qu es lo que te llama la atencin en elaspecto del cdigo PHP que aparece?)

    La implementacin de la Vista.

    19

  • 1 2 3 alimento (por 100g) 4 energa (Kcal) 5 grasa (g) 6 7 8 9 11 12 13 14 15 16 17 18

    Esencialmente no es ms que un trozo de documento HTML donde la informacin dinmicase obtiene procesando cdigo PHP. La caracterstica principal de este cdigo PHP es quedebe ser escueto y corto. De manera que no "contamine" la estructura del HTML. Por ellocada instruccin PHP comienza y termina en la misma lnea. La mayor parte de estasinstrucciones son echo's de variables escalares. Pero tambin son muy usuales lautilizacin de bucles foreach - endforeach para recorrer arrays de datos, as como losbloques condicionales if - endif para pintar bloques segn determinadas condiciones.En el ejemplo de ms arriba se genera el cdigo HTML de una tabla que puede tener unnmero variable de filas. Se recoje en la plantilla el parmetro alimentos , que es un arraycon datos de alimentos, y se genera una fila por cada elemento del array con informacin dela URL de una pgina sobre el alimento (lnea 9), y su nombre, energa y grasa total (lneas10-14).Observa tambin la forma de construir el bucle foreach, se abre en la lnea 7 y se cierra enla 16. Lo particular de la sintaxis de este tipo de bucle para plantillas es que la instruccinforeach que lo abre terminan con el caracter :. Y la necesidad de cerrarlo con un .

    El layout y el proceso de decoracin de plantillasEn una aplicacin web, muchas de las pginas tienen elementos comunes. Por ejemplo, uncaso tpico es la cabecera donde se coloca el mensaje de bienvenida, el men y el pie depgina. Este hecho, y la aplicacin del conocido principio de buenas prcticas deprogramacin DRY (Don't Repeat Yourself, No Te Repitas), lleva a que cualquier sistema deplantillas que se utilice para implementar la vista utilice otro conocido patrn de diseo: ElDecorator, o Decorador 4. Aplicado a la generacin de vistas la solucin que ofrece dichopatrn es la de aadir funcionalidad adicional a las plantillas. Por ejemplo, aadir el men yel pie de pgina a las plantillas que lo requieran, de manera que dichos elementos puedanreutilizarse en distintas plantillas. Literalmente se trata de decorar las plantillas conelementos adicionales reutilizables.Nuestra implementacin del patrn Decorator es muy simple y, por tanto limitada, perosuficiente para asimilar las bases del concepto y ayudarnos a comprender ms adelante lafilosofa del sistema de plantillas de Symfony2, denomindado twig 5.Nuestras plantillas sern ficheros PHP del tipo que acabamos de explicar, y las ubicaremos en el directorio app/templates. Como ya has visto en el cdigo del controlador, las acciones finalizan incluyendo alguno de estos archivos. Comencemos por estudiar la plantilla

    El layout y el proceso de decoracin de plantillas

    20

  • app/templates/mostrarAlimentos.php, que es la que utiliza la accin listar() parapintar los alimentos que obtiene del modelo. Crea el archivoapp/templates/mostrarAlimentos.php con el siguiente cdigo:app/templates/mostrarAlimentos.php

    1 2 3 4 5 alimento (por 100g) 6 energa (Kcal) 7 grasa (g) 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23

    Como ves, las lneas 3-18 son las que se han puesto como ejemplo de plantilla PHP hace unmomento. La novedad son las lneas 1 y 21-23. En ellas est la clave del nuestro proceso dedecoracin. Para comprenderlo del todo es importante echarle un vistazo al ficheroapp/templates/layout.php, incluido al final de la plantilla. Cralo y copia el siguientecdigo:app/templates/layout.php

    1 2 3 4 Informacin Alimentos 5 6

  • 20 buscar por energia |21 bsqueda combinada22 23 24 25 26 27 28 29 30 31 - pie de pgina -32 33 34

    El nombre del fichero es bastante ilustrativo, es un layout HTML, es decir, un diseo de undocumento HTML que incluye como elemento dinmico a la variable $contenido (lnea 26),la cual esta definida al final de la plantilla mostrarAlimentos.php, y cuyo contenido esprecisamente el resultado de interpretar las lneas comprendidas entre el ob_start() y$contenido = ob_get_clean() . En la documentacin de estas funciones(http://php.net/manual/es/function.ob-start.php) puedes ver que el efecto de ob_start() esenviar todos los resultados del script desde la invocacin de la funcin a un buffer interno.Dichos resultados se recojen a travs de la funcin ob_get_clean() . De esa maneraconseguimos decorar la plantilla con el layout. Esta tcnica es utilizada en todas lasplantillas, de manera que todos los elementos comunes a todas las pginas son escritos unasla vez en layout.php y reutilizados con todas las plantillas generadas con los datos decada accin.Observa que el layout que hemos propuesto incluye:

    los estilos CSS (lnea 6), el men de la aplicacin (lneas 14-23) el pie de pgina (lneas 29-32)

    A continuacin mostramos el cdigo del resto de las plantillas:app/templates/inicio.php

    1 2 Inicio3 Fecha: 4 5 6 7 8

    app/templates/formInsertar.php

    1 2 3 4 5 6

    El layout y el proceso de decoracin de plantillas

    22

  • 7 8 9 10 Nombre11 Energa (Kcal)12 Proteina (g)13 H. de carbono (g)14 Fibra (g)15 Grasa total (g)16 17 18

    app/templates/buscarPorNombre.php 1 2 3 4 5 6 7 nombre alimento: 8

  • 7 Energa 8 9 10 11 12 Proteina13 14 15 16 17 Hidratos de Carbono18 19 20 21 22 Fibra23 24 25 26 27 Grasa total28 29 30 31 32 33 34 35 36 37

    Todas las plantillas recurren al uso de las funciones ob_start() y ob_get_clean() y a lainclusin del layout para realizar el proceso de decoracin.

    El Modelo. Accediendo a la base de datosYa slo nos queda presentar al Modelo. En nuestra aplicacin se ha implementado en laclase Model y esta compuesto por una serie de funciones para persistir datos en la base dedatos, recuperarlos y realizar su validacin.Dependiendo de la complejidad del negocio con el que tratemos, el modelo puede ser ms omenos complejo y, adems de tratar con la persistencia de los datos puede incluir funcionespara ofrecer otros servicios relacionados con el negocio en cuestin. Crea el archivoapp/Model.php y copia el siguiente cdigo:app/Model.php

    1

  • 8 { 9 $mvc_bd_conexion = mysql_connect($dbhost, $dbuser, $dbpass); 10 11 if (!$mvc_bd_conexion) { 12 die('No ha sido posible realizar la conexin con la base de datos: ' . mysql_error()); 13 } 14 mysql_select_db($dbname, $mvc_bd_conexion); 15 16 mysql_set_charset('utf8'); 17 18 $this->conexion = $mvc_bd_conexion; 19 } 20 21 22 23 public function bd_conexion() 24 { 25 26 } 27 28 public function dameAlimentos() 29 { 30 $sql = "select * from alimentos order by energia desc"; 31 32 $result = mysql_query($sql, $this->conexion); 33 34 $alimentos = array(); 35 while ($row = mysql_fetch_assoc($result)) 36 { 37 $alimentos[] = $row; 38 } 39 40 return $alimentos; 41 } 42 43 public function buscarAlimentosPorNombre($nombre) 44 { 45 $nombre = htmlspecialchars($nombre); 46 47 $sql = "select * from alimentos where nombre like '" . $nombre . "' order by energia desc"; 48 49 $result = mysql_query($sql, $this->conexion); 50 51 $alimentos = array(); 52 while ($row = mysql_fetch_assoc($result)) 53 { 54 $alimentos[] = $row; 55 } 56 57 return $alimentos; 58 } 59 60 public function dameAlimento($id) 61 {

    62 $id = htmlspecialchars($id); 63 64 $sql = "select * from alimentos where id=".$id; 65 66 $result = mysql_query($sql, $this->conexion); 67 68 $alimentos = array(); 69 $row = mysql_fetch_assoc($result); 70 71 return $row; 72 73 } 74

    El Modelo. Accediendo a la base de datos

    25

  • 75 public function insertarAlimento($n, $e, $p, $hc, $f, $g) 76 { 77 $n = htmlspecialchars($n); 78 $e = htmlspecialchars($e); 79 $p = htmlspecialchars($p); 80 $hc = htmlspecialchars($hc); 81 $f = htmlspecialchars($f); 82 $g = htmlspecialchars($g); 83 84 $sql = "insert into alimentos (nombre, energia, proteina, hidratocarbono, fibra, grasatotal) values ('" . 85 $n . "'," . $e . "," . $p . "," . $hc . "," . $f . "," . $g . ")"; 86 87 $result = mysql_query($sql, $this->conexion); 88 89 return $result; 90 } 91 92 public function validarDatos($n, $e, $p, $hc, $f, $g) 93 { 94 return (is_string($n) & 95 is_numeric($e) & 96 is_numeric($p) & 97 is_numeric($hc) & 98 is_numeric($f) & 99 is_numeric($g));100 }101 102 }

    Cuando el controlador requiere el uso del modelo, creamos un objeto de tipo $m = newModel() . El constructor de esta clase realiza una conexin con la base de datos y la ponedisponible a todos sus mtodos al aadir la conexin creada como atributo del objeto. Cadafuncin utiliza esta conexin para realizar su cometido contra la base de datos.La ltima funcin de la clase, validarDatos(), es algo distinta, ya que no utiliza para nadala conexin con la base de datos. Simplemente valida datos. Si la aplicacin fuera mscompleja sera interesante crear una clase dedicada a la validacin. De manera queatendamos al principio de la Separation of Concerns .

    La configuracin de la aplicacinA lo largo y ancho de todo el cdigo expuesto, aparece cada tanto una referencia a unosatributos estticos de la clase Config . Por ejemplo, en la lnea 17 del archivoapp/Controller.php, aparece Config::$mvc_bd_hostname, Config::$mvc_bd_usuario,etctera. Se trata de parmetros de configuracin que hemos definido en una clasedenominada Config:app/Config.php

    1

  • Incorporar las CSS'sCrea el directorio web/css y en l coloca un archivo llamado estilo.css con el siguientecontenido:web/css/estilo.css

    body { padding-left: 11em; font-family: Georgia, "Times New Roman", Times, serif; color: purple; background-color: #d8da3d }ul.navbar { list-style-type: none; padding: 0; margin: 0; position: absolute; top: 2em; left: 1em; width: 9em }h1 { font-family: Helvetica, Geneva, Arial, SunSans-Regular, sans-serif }ul.navbar li { background: white; margin: 0.5em 0; padding: 0.3em; border-right: 1em solid black }ul.navbar a { text-decoration: none }a:link { color: blue }a:visited { color: purple }address { margin-top: 1em; padding-top: 1em; border-top: thin dotted }#contenido { display: block; margin: auto; width: auto; min-height:400px;}

    Fjate que en el archivo app/templates/layout.php se incluye (lnea 6) este archivo CSSque acabamos de crear. Como dicho layout decora a todas las plantillas, estos estilosafectarn a todas las pginas.

    La base de datosEn el Sistema Gestor de Base de Datos MySQL que vayas a utilizar, utilizando algn clienteMySQL crea una base de datos para almacenar los alimentos. Introduce algunos registrospara probar la aplicacin.

    Incorporar las CSS's

    27

  • CREATE TABLE `alimentos` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(255) NOT NULL, `energia` decimal(10,0) NOT NULL, `proteina` decimal(10,0) NOT NULL, `hidratocarbono` decimal(10,0) NOT NULL, `fibra` decimal(10,0) NOT NULL, `grasatotal` decimal(10,0) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Lo importante para que la conexin funcione, es que los parmetros de conexin que seestablecen en el fichero app/Config.php coincidan con los de tu base de datos.

    Sugerencia

    Lo ms cmodo para desarrollar es tener todo en el mismo computador: tanto elservidor web (apache) como el servidor de base de datos (MySQL). Adems es muyprctico, aunque nada seguro, utilizar en el servidor MySQL el usuario root(superadministrador) como usuario de nuestras aplicaciones. As no hay quepreocuparse por temas de permisos. Repetimos: es lo ms cmodo pero, a la vez, loms inseguro. Esta prctica est justificada NICAMENTE en un entorno de desarrolloen local, donde la seguridad, en principio no es primordial.

    Ya puedes juntar todas las piezas y probar la aplicacin introduciendo en tu navegador laURL correspondiente:

    http://tu.servidor/ruta/a/alimentos/web/index.php

    Suerte!

    ComentariosAqu puedes enviar comentarios, dudas y sugerencias. Utiliza la barra de scroll para recorrertodos los mensajes. El formulario de envo se encuentra al final.

    Autor del cdigo: Juan David Rodrguez Garca

    Comentarios

    28

  • Unidad 3: Symfony2 a vista de pjaroEl objetivo fundamental de este curso es que aprendas a desarrollar aplicaciones web decalidad con Symfony2, un potente framework de desarrollo en PHP. Para conocerlo enprofundidad utilizaremos una estrategia de acercamiento en espiral a nuestro objeto deestudio, es decir, lo rodearemos trazando crculos de radio cada vez ms pequeos, deforma que cada vuelta que demos nos revelar un conocimiento ms profundo de estamagnfica herramienta de desarrollo.Esta estrategia nos proporcionar resultados visibles y prcticos desde el principio, desde laprimera vuelta, aunque ello ser a costa de tratar superficialmente algunos conceptos que,progresivamente, irn definindose con ms precisin a medida que avanza el curso.En esta unidad volveremos a desarrollar la aplicacin que construimos en la unidad 2. Peroahora utilizaremos Symfony2. Ser nuestra primera vuelta, la menos precisa pero la mspanormica, que nos proporcionar una primera imagen del framework an difusa perosuficiente para mostrar sus caractersticas fundamentales.

    Qu es Symfony2?La respuesta rpida, no por ello menos cierta, es que Symfony2 es un framework PHP para eldesarrollo de aplicaciones web. Sin embargo, los creadores de Symfony2 no la daran porbuena. Posiblemente tampoco aprobasen completamente lo que voy a decir a continuacin(son unos programadores, adems de excelentes, muy "quisquillosos"!).El objetivo principal de Symfony2 no es tanto desarrollar otro framework PHP, comodesarrollar un conjunto de componentes estables, independientes, fcilmente acoplables(que no acoplados) para formar sistemas ms complejos, mediante los cuales se puedanresolver problemas relacionados con el desarrollo de aplicaciones web en PHP. Obviamenteno es necesario utilizar todos los componentes de Symfony2; gracias a su absolutaindependencia se pueden utilizar nicamente aquellos que se requieran para resolver elproblema en cuestin. Symfony2 se presenta as como una especie de Lego en el mundo deldesarrollo en PHP.Con estos componentes, uno de los problemas que se puede resolver es el de la creacin deun framework de desarrollo web. De hecho, uno de los primeros productos que se hanconstruido con estos componentes ha sido el framework de desarrollo conocido comoDistribucin Standard de Symfony2, o ms brevemente Symfony2 sin ms. Y esprecisamente del estudio de esta distribucin de lo que trata este curso.Por ello, el trmino Symfony2 puede referirse a:

    1. Los componentes de Symfony22. El framework de Symfony2, o distribucin standard de Symfony2.

    En el momento en que se escribe este texto, lo ms probable es que se trate de lo segundo.Los componentes de Symfony2, se estn utilizando para otros proyectos 6, y su usoaumentar cuando dispongan de una documentacin tan exhaustiva y bien elaborada comola que cuenta en estos momentos el framework Symfony2. Es muy probable (ojal) quecuando este curso vea la luz esta situacin haya cambiado 7. Entonces, a lo mejor serainteresante elaborar otro curso sobre los componentes de Symfony2, pero sera eso: otrocurso. Los componentes son los elementos de bajo nivel del framework Symfony2, y parautilizar dicho framework no es necesario conocerlos.De todas formas vamos a aprovechar este apartado para enumerar los componentes de Symfony2, dando una breve descripcin de su funcionalidad. Pero, repetimos: no es necesario conocerlos para utilizar el framework, que es de lo que trata este curso. Damos esta informacin con el fin de calmar al curioso y de aclarar las posibles confusiones que se

    Unidad 3: Symfony2 a vista de pjaro

    29

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

  • dan al hablar de Symfony2 entre los componentes y el framework. Obviamente, el contextoaclarar de que se habla en cada ocasin.

    Componente DescripcinDependencyInjectionAutomaticacin de la Inyeccin de dependenciasEventDispatcherImplementacin del patrn observerHttpFoundationProporciona una capa orientada a objetos para el tratamiento del HTTPDomCrawler Para navegar el DOM de un documento HTMLClassLoader Autoloader que implementa PSR-0 standard (forma standard de autocargar

    classes con espacios de nombre)CssSelector Para convertir un CSS selector en un XPathHttpKernel Proporciona la parte dinmica de la especificacin HTTPBrowserKit Simula el comportamiento de un BrowserTemplating Proporciona elementos para construir sistemas de plantillasTranslation Soporte para las traduccionesSerializer Para crear arrays a partir de estructuras complejas como grficosValidator Validaciones basadas en JSR-303 Bean Validation specificationSecurity Infraestructura para el tratamiento de la autentificacin y la autorizacinRouting Potente sistema para asociar rutas a accionesConsole Para desarrollar herramientas CLIProcess Para ejecutar procesos del sistemaConfig Herramientas para cargar configuraciones de distintas fuentesFinder Para encontrar archivos en el sistema de archivosLocale Para tratar la localizacin cuando no est disponible la extensin intlYaml Para la manipulacin de archivos de configuracin en formato YAMLForm Herramientas para definir formularios, pintarlos y asociarle datos

    Y estas son las "tripas" del monstruo Symfony2. No hablaremos mucho ms acerca de estoscomponentes a lo largo del cursos. Pero que sepas que existen. Puede que te ayuden aresolver tu prximo proyecto, y muy probablemente sean los ladrillos fundamentales con losque se construyan muchas de las aplicaciones PHP en un futuro no muy lejano.

    Instalacin y configuracin de Symfony2A partir de este momento, y mientras no lo especifiquemos explicitamente, cuandohablemos de Symfony2 nos estamos refiriendo al framework, concretamente a la edicinestndard.En este apartado vamos a instalar y configurar Symfony2, y lo dejaremos listo para construirla aplicacin de gestin de alimentos sobre l.Bjate de http://symfony.com/download la ltima versin de la rama 2.0 de Symfony2. Versque hay una modalidad normal y otra without vendors. Utiliza la primera.

    Instalacin y configuracin de Symfony2

    30

    MarinaResaltado

  • Nota

    La modalidad normal contiene todas las libreras de terceros (vendors) necesariaspara comenzar a trabajar con el framework, mientras que la modalidad withoutvendors, como su nombre indica, viene sin estas libreras, razn por lo que hay queinstalarlas posteriormente mediante una herramienta incluida con Symfony2(bin/vendors) que utiliza el sistema de control de versiones git para bajar lasltimas versiones desde el repositorio de github 8, donde se encuentra todo el cdigode Symfony2.

    Descomprme el archivo descargado en algn directorio accesible al servidor web, esto es,dentro de su Document root. Para que la aplicacin funcione, el servidor web debe poderescribir en los directorios app/cache y app/logs. Si ests utilizando un sistema operativotipo UNIX (Ubuntu, MacOSX, etctera), la forma ms fcil de dar dichos permisos es:

    chmod -R 777 app/cache app/logs

    Nota

    Durante toda la unidad suponemos que has hecho esta operacin directamente en elDocument root del servidor web, de manera que tendr la siguiente estructura dedirectorios:

    /var/www/ (o donde tengas mapeado tu Document root) | Symfony | LICENSE README.md app/ bin/ deps deps.lock src/ vendor/ web/

    Y que tanto el servidor web como el servidor de MySQL estn instalado en la mquinalocal.

    A continuacin comprobamos que nuestro sistema cumple los requisitos mnimos ejecutandopor la interfaz de comandos la siguiente orden:

    php app/check.php

    Instalacin y configuracin de Symfony2

    31

    MarinaResaltado

  • Si el resultado nos seala algn error, debemos resolverlo antes de continuar. Una vez quepasemos al menos los requisitos obligatorios (mandatory requirements), podemos ejecutarla demo que viene incorporada en la distribucin standard de Symfony2. Para ello apuntacon tu navegador a la siguiente URL:

    http://localhost/Symfony/web/app_dev.php

    Y juega un poquito!, Por ejemplo, pica en Run the demo y navega por los distintos enlaces.Fjate en la pinta que tienen las URL's. La demo muestra el cdigo que genera las pginas dela propia demo. Fjate en l detenidamente. Vers que muestra dos partes: el del controladory el de la plantilla (template). Te suena?. Si no es as: GOTO unidad 2.Ya has visto en accin la primera aplicacin construida con Symfony2. Ahora vamos adescribir la manera en que Symfony2 organiza el cdigo.Como en el mini-framework que hemos construido en la unidad 2, Symfony2 tambinorganiza los archivos en dos grupos: los que deben estar directamente accesibles al servidorweb (CSS's, Javascript, imgenes y el controlador frontal) y los que pueden ser incluidosdesde el controlador frontal (libreras PHP y ficheros de configuracin). Los primeros viven enel directorio web, y los segundos, segn su funcionalidad, estn repartidos entre losdirectorios app , src y vendor. Si has asimilado bien todo lo que se ha dicho en la unidad 2,estars pensando que en una instalacin en un entorno de produccin, el Document rootdel servidor web (o del Virtual host dedicado para la aplicacin), debe coincidir con eldirectorio web, y que el resto de directorios deben ubicarse fuera del Document root. Si esas, ests en lo cierto, y si no, te sugerimos que antes de continuar con esta unidad, repasesla anterior.

    Nota

    Para paliar el efecto de posibles despistes o malas prcticas por desconocimiento,pereza y otras fatales causas, los directorios src y app, contienen un fichero.htaccess que indica al servidor web que no debe mostrar su contenido.

    Veamos ahora para que se utiliza cada uno de estos directorios.

    El directorio webPoco hay que decir ya de este directorio, aqu encontraremos el controlador frontal y todoslos assets de la aplicacin: CSS's, Javascipts, imgenes, etctera.Esta es la estructura del directorio:

    web app_dev.php apple-touch-icon.png app.php bundles acmedemo framework sensiodistribution webprofiler config.php favicon.ico

    El directorio web

    32

  • robots.txt

    Podemos ver 3 scripts PHP:

    config.php es un script que asiste en la configuracin del framework. No esimprescindible. De hecho cuando uno se siente confortable con Symfony2, es mssencillo realizar la configuracin directamente sobre el cdigo fuente. Pero paraempezar puede servir de ayuda. Si lo utilizas ten en cuenta los permisos de los ficherosdel directorio app/config, pues este script debe poder escribir all.

    app.php es el controlador frontal de la aplicacin. No vamos a repetir aqu que esteconcepto. Si no sabes de que hablamos, THEN GOTO Unidad 2.

    app_dev.php tambin es el controlador frontal de la aplicacin. Cmo? doscontroladores frontales? eso no encaja con lo que hemos aprendido!. Bueno tranquilos,tiene su explicacin. Se trata de lo que se denomina en Symfony2 el controlador frontalde desarrollo. En principio pinta lo mismo que app.php, pero le aade una barra dedepuracin que ofrece muchsima informacin sobre todo lo relacionado con laejecucin del script. Puedes ver la barra de depuracin en la demo que has ejecutadohace un momento. Se encuentra abajo de la pgina. Explrala un poco, te asombrarsde la cantidad de informacin que te proporciona. Cuando desarrollamos es muyconveniente utilizar este controlador frontal, pero en produccin NUNCA debe utilizarse,pues daramos a los usuario de la web informacin que podra comprometer nuestrosistema.

    Por otro lado los assets se ubicarn en el directorio bundles/nombre_bundle, dondenombre_bundle es el nombre del bundle al que pertenece el asset en cuestin. Vale, y quees un bundle?, pues por lo pronto quedate con que "es la unidad funcional de cdigo queutiliza Symfony2". Algo as como una de las piezas del Lego Symfony2. En la seccin LosBundles: Plugins de primera clase hablaremos de estos "personajes" con ms detalle.

    El directorio appLa finalidad de este directorio es alojar a a los scripts PHP encargados de los procesos decarga del framework (lo que se conoce como bootstraping) y a todo lo que tenga que vercon la configuracin general de la aplicacin. Los archivos de este directorio son losencargados de unir y dar cohesin a los distintos componentes del framework.Son especialmente importantes los ficheros autoload.php y AppKernel.php, ya que hayque tocarlos cada vez que extendemos el framework con nuevas funcionalidades, es decircada vez que incorporamos nuevos bundles (vamos poniendo en circulacin a esta palabrejaque usaremos hasta la saciedad).En autoload.php se mapean los espacios de nombres contra los directorios en los queresidirn las clases pertenecientes a dichos espacios de nombre. De esa manera el procesode autocarga de clases sabr donde tiene que buscar las clases cuando se usen dichosespacios, sin necesidad de incluir explicitamente (esto es, usando include o require ) losarchivos donde se definen las clases.En AppKernel.php, se declaran los bundles que se utilizarn en la aplicacin.En el directorio config se encuentran los archivos de configuracin de la aplicacin:config.yml, routing.yml y security.yml.El sistema de configuracin de Symfony2 permite trabajar con distintos entornos deejecucin. Los ms tpicos son prod, para produccin y dev, para desarrollo. Pero se puedendefinir tantos entornos como deseemos. En el controlador frontal se indica qu entornodeseamos utilizar en la ejecucin del script. Fjate en la lnea 22 de web/app_dev.php, o enla lnea 9 del web/app.php:

    El directorio app

    33

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

    MarinaResaltado

  • ...$kernel = new AppKernel('prod', false);...

    El primer argumento decide el entorno de ejecucin que se utilizar, y el segundo sirve parahabilitar los mensajes de depuracin 9. Y para que sirve esto del entorno de ejecucin?.Symfony2 utiliza este dato para saber qu ficheros de configuracin debe cargar.Supongamos, por ejemplo, que se especifica dev como entorno de ejecucin. Entonces, siexiste el fichero config_dev.yml lo cargar, y si no es as cargar config.yml. Lo mismoocurre con los ficheros routing.yml, security.yml y services.yml. Ms adelanteestudiaremos para que sirven cada uno de ellos. Por lo pronto nos conformaremos con saberla dinmica de funcionamiento.Los entornos proporcionan mucha flexibilidad a la hora de desarrollar una aplicacin. Vamosa ilustrar con un ejemplo esta flexibilidad. Un caso que nos encontramos habitualmente esque la aplicacin que estamos construyendo debe enviar e-mails. Es bastante molesto tenerque disponer de cuentas reales y gestionarlas para que podamos probar la aplicacinmientras desarrollamos. Podemos utilizar este sistema de configuracin para indicar alframework que en el entorno de desarrollo se enven todos los e-mails a una sola cuenta, oincluso que no se enven. Otro ejemplo tpico podra ser el definir unos parmetros deconexin a la base de datos para el entorno de produccin y otro para el de desarrollo.Una estratega muy adecuada para tratar con los ficheros de configuracin cuandoqueremos que haya partes comunes y partes diferentes en cada entorno, es definir todos losparmetros comunes en el fichero fichconfig.yml (donde fichconfig es config,security, routing o services), y los particulares de cada entorno en el ficherofichconfig_env.yml (donde env es dev, prod o cualquier otro nombre de entorno queusemos). Por ltimo importamos los primeros (comunes) desde los ltimos (particulares) dela siguiente manera:Inicio del fichero fichconfig_env.yml

    imports: - { resource: fichconfig.yml } ...

    Puedes comprobar que esta es la estrategia utilizada por la distribucin standard deSymfony2 con los ficheros config.yml, config_dev.yml y config_prod.yml.Para acelerar la ejecucin de los scripts, la configuracin, el enrutamiento y las plantillas detwig son compiladas y almacenadas en el directorio cache. Por otro lado, los errores y otrainformacin de inters acerca de eventos que ocurren cuando se ejecuta el framework, sonregistrados en archivos que se almacenan en el directorio logs. Por eso estos dosdirectorios deben tener permisos de escritura para el servidor web.Por ltimo, en este directorio tan "denso", encontramos la navaja suiza de Symfony2, laaplicacin app/console. Prueba a ejecutarla sin pasarle ningn argumento. Vers una listacon todas las tareas que se pueden lanzar por lnea de comandos.

    php app/console

    El directorio vendorAqu se aloja todo el cdigo funcional que no es tuyo. Es lo que tradicionalmente se conoce como libreras de terceros. Entre otras cosas, el directorio contiene los componentes de

    El directorio vendor

    34

  • Symfony2, el ORM Doctrine2 y el sistema de plantillas twig. Cuando amplies tu aplicacincon nuevos bundles de terceros instalados automticamente con la aplicacin bin/vendors,ser aqu donde se ubique el cdigo.

    El directorio srcEs el directorio donde colocars tu cdigo. Ms concretamente: tus bundles. A base deutilizar este palabro acabars por asimilarlo antes de que te lo expliquemos :-).

    El directorio binEl nombre de este directorio es un clsico en el mundo UNIX. En l se colocan archivosejecutables. La distribucin standard solo trae el ejecutable vendors que se utiliza, encombinacin con el fichero deps (dependencias), para instalar componentes de terceros(vendors).Y con esto acabamos la descripcin de los directorios de Symfony2. Ha llegado el momentode hablar de los bundles, esos grandes desconocidos (por ahora!).

    Los Bundles: Plugins de primera claseSi los creadores de Symfony2 hubieran elegido la palabra plugin en lugar de bundle, esprobable que te hubieses hecho una idea ms concreta de lo que es un bundle. Pues bien,por lo pronto, piensa que un bundle es un plugin, por que no es ni ms ni menos que eso.Cualquier framework que se precie debe ofrecer un mecanismo de extensin que permitaampliar la aplicacin sin compromenter la escalabilidad. Para ello las piezas que se aadenal sistema deben ser bloques prcticamente autnomos y con una interfaz sencilla paraengancharlos (to plug, en ingls) al sistema. A estos bloques se les conoce a lo largo y anchode la galaxia con el nombre de plugin (o complemento, en castellano). Por qu loscreadores de Symfony2 han decidido llamarles bundles en su lugar? Lo mismo hay algunarazn terica que se me escapa. Pero de lo que si estoy seguro es de que hay una raznhistrica:El antecesor de Symfony2, el fantstico symfony 1.x organiza el cdigo en aplicaciones, quea su vez estn formadas por mdulos con la implementacin de las acciones. Adems ofreceun mecanismo de extensin basado en plugins, los cuales tambin organizan el cdigo enmdulos con sus acciones. Pero a pesar de este paralelismo las aplicaciones son "msimportantes" que los plugins. De hecho, las aplicaciones pueden usar mdulos de losplugins, pero lo contrario no tiene sentido tal y como est concebido symfony 1.x. Con eltiempo los desarrolladores se dieron cuenta de que era ms fcil de mantener y organizarlos plugins, ya que son bloques de cdigo autnomos y fcilmente acoplables a la aplicacin.Este hecho llev de forma natural a reorganizar la aplicacin colocando todo el cdigofuncional en los plugins. Las aplicaciones se quedaban prcticamente vacas de cdigo y tansolo contenan ficheros de configuracin.As pues, en Symfony2 decidieron olvidarse del concepto de aplicacin (en el sentido desymfony 1.x), y obligar a que todo el cdigo funcional se organi