Symfony Parte 2 Rodrigo Miranda [email_address] [email_address] http://www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl Desarrollando una Aplicacion
Rodrigo Miranda Blog: www.rodrigomiranda.cl Desarrollando una Aplicación Requisitos: Plataforma LAMP o WAMP (Linux - Windows, Apache, MySQL y PHP 5.2.4 o superior, excepto la versión 5.2.9). Instalación de Symfony (recomendado mediante Subversion) Ambos desarrollados en la presentación anterior.
Rodrigo Miranda Blog: www.rodrigomiranda.cl El listado de las versiones lo puedes encontrar en la siguiente URL: http://svn.symfony-project.com/tags/ El  release  a descargar para producción, debe considerar siempre la última versión ESTABLE. Desarrollando una Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Desarrollando una Aplicación Si no tienes instalado Subversion, es hora de hacerlo . fedora, CentOS, RedHat: Ubuntu #  yum install subversion  #  apt-get install subversion
Rodrigo Miranda Blog: www.rodrigomiranda.cl Recomendamos crear un directorio que pueda contener más de una versión de Symfony. Este no debe ser accesible desde Internet. Una alternativa de descarga para el curso es la siguiente dirección: http://www.poodu.cl/symfony1_2_9.zip Desarrollando una Aplicación #  mkdir –p /versiones-symfony/symfonyx_x_x/ #  cd /versiones-symfony/symfonyx_x_x # svn co  http://svn.symfony-project.com/tags/RELEASE_x_x_x/  .
Rodrigo Miranda Blog: www.rodrigomiranda.cl Ingresar al directorio bin de la instalación Symfony: Ejecutar script  check_configuration.  El nos detallará  si nuestro sistema cumple con los requerimientos para la instalación de Symfony. Desarrollando una Aplicación #  cd /versiones-symfony/symfonyx_x_x/data/bin #  php check_configuration.php
Rodrigo Miranda Blog: www.rodrigomiranda.cl El comando  symfony   -V , para el caso de la instalación por Subversión, lo podremos ejecutar de la siguiente manera: o resultado: Desarrollando una Aplicación #  php /versiones-symfony/symfonyx_x_x/data/bin/symfony –V #  /versiones-symfony/symfonyx_x_x/data/bin/./symfony –V #  symfony version x.x.x (/versiones-symfony/symfonyx_x_x/lib)
Rodrigo Miranda Blog: www.rodrigomiranda.cl Desarrollando una Aplicación Obtener Comandos de Symfony: O: #  php /versiones-symfony/symfonyx_x_x/data/bin/symfony #  /versiones-symfony/symfonyx_x_x/data/bin/./symfony
Rodrigo Miranda Blog: www.rodrigomiranda.cl Desarrollando una Aplicación Comandos de Symfony:
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyectos, Aplicación y Módulos Proyectos Web en Symfony: Para comenzar a desarrollar en Symfony se debe crear un proyecto Web. Cada proyecto Web se divide en una o más aplicaciones, y cada aplicación contiene uno o más módulos. Comúnmente un proyecto Symfony lo componen dos aplicaciones: parte pública y administrador. Cada Módulo contenido en una aplicación suele corresponderse a una tabla de la base de datos, aunque no es obligatorio que así sea.
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyectos, Aplicación y Módulos Desarrollaremos un microblog: Ocuparemos un ejemplo del tutorial de Symfony, actualizándolo a la última versión estable y con algunas recomendaciones importantes.
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyectos, Aplicación y Módulos Etapas del proyecto: 1.  Definición de Aplicaciones. 2. Definición del Modelo de Datos. 3. Crear Proyecto y  Aplicaciones. 4. Construir el Modelo. 5. Crear Módulos del Sistema.
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyectos, Aplicación y Módulos 1.  Proyecto Microblog: Definición de Aplicaciones
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyectos, Aplicación y Módulos 2.  Definición de Modelo de Datos:
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyectos, Aplicación y Módulos 3.1.  Crear el proyecto Blog: Dependiendo del sistema operativo y de la instalación realizada, puede ser necesario utilizar el prefijo php antes de cada comando Symfony. O: #  php /versiones-symfony/symfonyx_x_x/data/bin/symfony generate:project blog # /versiones-symfony/symfonyx_x_x/data/bin/./symfony generate:project blog # mkdir /directorio/web/blog # cd /directorio/web/blog
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyectos, Aplicación y Módulos 3.2. Crear las aplicaciones publico y administrador del proyecto Blog: #  cd /directorio/web/blog #  ./symfony generate:app publico #  ./symfony generate:app administrador
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyectos, Aplicación y Módulos Estructura del Proyecto y Aplicaciones Creadas:
Rodrigo Miranda Blog: www.rodrigomiranda.cl Configuración del Servidor Web
Rodrigo Miranda Blog: www.rodrigomiranda.cl Configuración del Servidor Web <VirtualHost *:80> ServerName blog.localhost DocumentRoot /directorio/web/blog/web DirectoryIndex index.php Alias /sf /versiones-symfony/symfonyx_x_x/data/web/sf Errorlog /var/log/httpd/blogError.log CustomLog /var/log/httpd/accessBlog.log common <Directory /versiones-symfony/symfonyx_x_x/data/web/sf> AllowOverride All Allow from All </Directory> <Directory /directorio/web/blog/web> Allowoverride All Allow from All </Directory> </VirtualHost>
Rodrigo Miranda Blog: www.rodrigomiranda.cl Configuración archivo hosts: /etc/hosts c:\windows\system32\drivers\etc\hosts 127.0.0.1  blog.localhost Configuración del Servidor Web
Rodrigo Miranda Blog: www.rodrigomiranda.cl Un error Común: Configuración del Servidor Web
Rodrigo Miranda Blog: www.rodrigomiranda.cl Configuración del Servidor Web El anterior en esencia NO es un error, sino que Apache no puede encontrar las imágenes, hojas de estilos y archivos Javascript utilizados para la barra de depuración. Por lo tanto, se debe comprobar que existe la siguiente línea en la configuración del VirtualHost: Alias /sf /versiones-symfony/symfonyx_x_x/data/web/sf
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos Una alternativa para generar el alias podría ser crear un enlace simbólico o copiar directamente los contenidos del directorio: /versiones-symfony/symfonyx_x_x/data/web/sf/ al directorio: /directorio/web/blog/web/sf/
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos 4. Construir el Modelo: 4.1 – Protegiendo la Base de Datos: # mysql –u root -p  mysql> use mysql; mysql> update user set password=PASSWORD(‘cl1v3ade4’) where user=‘root’; mysql> flush privileges; mysql> \q
Rodrigo Miranda Blog: www.rodrigomiranda.cl 4.2 Crear Base de Datos y Usuario: Proyecto, Aplicaciones y Módulos # mysql –u root -p  mysql> create database blog default character set utf8 collate utf8_general_ci; mysql> grant all on blog.* to conicyt@localhost IDENTIFIED BY ‘c00ny’; mysql> flush privileges;
Rodrigo Miranda Blog: www.rodrigomiranda.cl 4. Construir el Modelo: 4.1 – Tabla articulo: CREATE TABLE IF NOT EXISTS `blog_articulo` ( `id` int(11) unsigned NOT NULL auto_increment, `titulo` varchar(255) NOT NULL, `contenido` text NOT NULL, `modificacion` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY  (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Mantenedor de Posts' AUTO_INCREMENT=1 ; Proyecto, Aplicaciones y Módulos
Rodrigo Miranda Blog: www.rodrigomiranda.cl 4.2 – Tabla comentario: CREATE TABLE IF NOT EXISTS `blog_comentario` ( `id` int(11) unsigned NOT NULL auto_increment, `autor` varchar(255) NOT NULL, `contenido` text NOT NULL, `modificacion` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `id_blog_articulo` int(11) unsigned NOT NULL, PRIMARY KEY  (`id`), KEY `id_blog_articulo` (`id_blog_articulo`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Mantenedor de Comentarios' AUTO_INCREMENT=1 ; Proyecto, Aplicaciones y Módulos
Rodrigo Miranda Blog: www.rodrigomiranda.cl Modificamos archivo propel.ini de nuestro proyecto: propel.database.url  = mysql:dbname=blog;host=localhost propel.database.creole.url = ${propel.database.url} propel.database.user  = conicyt propel.database.password = c00ny propel.database.encoding  = utf8 ; mysql options propel.mysql.tableType  = InnoDB Proyecto, Aplicaciones y Módulos # vim  /directorio/web/blog/config/propel.ini
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos Modificamos archivo databases.yml de nuestro proyecto: all: propel: class:  sfPropelDatabase param: classname:  PropelPDO dsn:  mysql:dbname=blog;host=localhost username:  conicyt password:  c00ny encoding:  utf8 persistent: true pooling:  true # vim  /directorio/web/blog/config/databases.yml
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos Construir Modelo a partir de una Base de Datos. Symfony puede utilizar la capa de acceso a base de datos proporcionada por  Propel  para generar un archivo schema.yml a partir de una base de datos existente. Se trata de una opción muy útil cuando se priefere trabajar primero en la base de datos antes de trabajar con el modelo de Objetos. Para construir el Modelo a partir de la Base de Datos, el archivo  databases.yml  del proyecto debe apuntar a la base de datos correcta y debe tener todas las opciones de conexión.
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos A continuación vamos a generar un archivo schema.yml a partir de la estructura de la base de datos. Una vez creado lo encontraremos en el directorio  config/  del proyecto. Ahora se puede construir el modelo a partir del esquema generado. Este comando es bastantes potente, pero el formato YAML no soporta algunas características por lo que es conveniente generar un archivo XML. # cd /directorio/web/blog #./symfony propel:build-schema
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos A continuación añadimos el argumento  xml  a la tarea  build-schema:  para generar un esquema en formato XML. #./symfony propel:build-schema  --xml
Rodrigo Miranda Blog: www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos Construcción del Modelo de Objetos:  Para generar las clases del modelo de objetos tomando como referencia el archivo schema construido en el paso anterior, utilizamos la siguiente sentencia dentro del directorio del proyecto. #./symfony propel:build-model
Rodrigo Miranda Blog: www.rodrigomiranda.cl Después de construir el modelo, es necesario borrar la caché interna de Symfony mediante el comando  symfony cc  para que Symfony sea capaz de encontrar los nuevos modelos. Proyecto, Aplicaciones y Módulos #./symfony cc
Rodrigo Miranda Blog: www.rodrigomiranda.cl Podemos ver que dentro del directorio lib/ (en la raíz del proyecto) se ha creado un nuevo directorio llamado  model/ , el cual contiene las clases que representan las tablas de nuestro modelo de datos. Proyecto, Aplicaciones y Módulos #cd lib/model # ls –l -rw-r--r-- 1 conicyt conicyt  63 oct 27 09:46 BlogArticuloPeer.php -rw-r--r-- 1 conicyt conicyt  55 oct 27 09:46 BlogArticulo.php -rw-r--r-- 1 conicyt conicyt  67 oct 27 09:46 BlogComentarioPeer.php -rw-r--r-- 1 conicyt conicyt  59 oct 27 09:46 BlogComentario.php drwxr-xr-x 2 conicyt conicyt 4096 oct 27 09:46 map drwxr-xr-x 2 conicyt conicyt 4096 oct 27 09:46 om
Rodrigo Miranda Blog: www.rodrigomiranda.cl Dentro del directorio  lib/model/om/  del proyecto se han creado las clases Base del Modelo. Estas clases son extendidas por las clases mostradas anteriormente. Proyecto, Aplicaciones y Módulos #cd lib/model/om # ls –l -rw-r--r-- 1 conicyt conicyt 28212 oct 27 09:46 BaseBlogArticuloPeer.php -rw-r--r-- 1 conicyt conicyt 29357 oct 27 09:46 BaseBlogArticulo.php -rw-r--r-- 1 conicyt conicyt 36094 oct 27 09:46 BaseBlogComentarioPeer.php -rw-r--r-- 1 conicyt conicyt 27190 oct 27 09:46 BaseBlogComentario.php
Rodrigo Miranda Blog: www.rodrigomiranda.cl Clases base y clases personalizadas
Rodrigo Miranda Blog: www.rodrigomiranda.cl Clases bases y clases personalizadas Clases base: Son clases creadas en el directorio  lib/model/om/  del proyecto a las cuales le precede la palabra Base. En ellas NO debemos añadir métodos personalizados ya que cada vez que se genera el modelo, con el comando  symfony propel:build-model,  se borran y se vuelven a crear.
Rodrigo Miranda Blog: www.rodrigomiranda.cl Clases bases y clases personalizadas Clases personalizadas: Son clases creadas en el directorio  lib/model  del proyecto. Estas extienden a clases bases, por lo tanto, son hijas o herederas. Si deseamos añadir métodos particulares o atributos en nuestra aplicaciones, podemos trabajar en ellas sin preocupaciones,  ya que ellas NO se regeneran cada vez que se construye el modelo de objetos.
Rodrigo Miranda Blog: www.rodrigomiranda.cl Clases bases y clases personalizadas Clases objeto: Las clases BlogArticulo y BlogComentario representan a un registro de la base de datos. Permiten acceder a las columnas de UN registro y a los registros relacionados.
Rodrigo Miranda Blog: www.rodrigomiranda.cl Clases bases y clases personalizadas Clases peer: Las clases BlogArticuloPeer y BlogComentarioPeer son clases de tipo peer, es decir, clases que tienen métodos estáticos para trabajar con las tablas de la base de datos. Sus métodos devuelven normalmente un objeto o una colección de objetos de la clase objeto relacionada.
Rodrigo Miranda Blog: www.rodrigomiranda.cl Clases bases y clases personalizadas Diferencia entre Clase Objeto y peer: Mientras la primera REPRESENTA a un objeto y permite obtener objetos RELACIONADOS. La segunda permite OBTENER un objeto o una COLECCIÓN de objetos de acuerdo a clase/tabla que representa.
Rodrigo Miranda Blog: www.rodrigomiranda.cl A esta altura sabemos que Symfony trabaja con el concepto de Proyecto, el cual se subdivide en una  o más aplicaciones, y donde cada aplicación puede tener uno o más módulos.  Proyecto, Aplicaciones y Módulos
Rodrigo Miranda Blog: www.rodrigomiranda.cl Construir Formularios Symfony a partir de la versión 1.1 incorporó un subframework para Formularios. Esto permite controlar uno de los procesos más tediosos en la construcción de aplicaciones. Una vez creado el Modelo, vamos a construir los formularios con el siguiente comando ejecutado en la raíz del proyecto. Proyectos, Aplicación y Módulos #./symfony propel:build-forms
Rodrigo Miranda Blog: www.rodrigomiranda.cl Clases bases y clases personalizadas Construir Filtros El mecanismo de seguridad puede ser entendido como un filtro. Por él pasan las peticiones antes de ejecutar una acción. Según las comprobaciones realizadas en el filtro, se puede modificar el procesamiento de la petición. Más adelante profundizaremos al respecto. #./symfony propel:build-filters
Rodrigo Miranda Blog: www.rodrigomiranda.cl Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Administrador de la Aplicación Crear  Módulo Artículo de administración: Symfony crea la parte de administración de una aplicación en base a su modelo de datos. Los módulos se generan en base a objetos Propel mediante la tarea  propel:generate-admin. #./symfony propel:generate-admin administrador  BlogArticulo
Rodrigo Miranda Blog: www.rodrigomiranda.cl Acceder a la parte de Gestión de Artículos Después de ejecutar los comandos anteriores, ya se puede acceder a la parte de gestión de los artículos en la siguiente dirección: http://blog.localhost/administrador_dev.php/blog_articulo Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Crear  Módulo Comentario de administración: Para crear el administrador de Comentarios nuevamente utilizamos el comando  propel:generate-admin. Administrador de la Aplicación #./symfony propel:generate-admin administrador  BlogComentario
Rodrigo Miranda Blog: www.rodrigomiranda.cl Acceder a la parte de Gestión de Comentarios Después de ejecutar el comando anterior, vamos a acceder a la parte de gestión de los comentarios en la siguiente dirección: http://blog.localhost/administrador_dev.php/blog_comentario Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl A continuación el controlador frontal  administrador_dev.php  nos muestra una página de error Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Si bien la gestión de comentarios es idéntica a la de los artículos, existe una característica que debemos indicar en una clase de nuestro modelo. El formulario  de creación intenta mostrar la relación de la clave externa que hace referencia al artículo. Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Para solventar este problema debemos definir el método mágico __toString en la clase BlogArticulo, que se encuentra en el directorio  lib/model/  de nuestro proyecto. <?php class  BlogArticulo  extends  BaseBlogArticulo { public   function  __toString() { return   $this-> getTitulo(); } } Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Vistazo al Código Generado
Rodrigo Miranda Blog: www.rodrigomiranda.cl Los módulos creados con el comando  propel:generate-admin  contienen algunos archivos, pero carecen de códigos PHP. Podríamos decir que están vacíos. La razón del punto anterior es que Symfony se encarga de generar automáticamente el codigo PHP, para verificar aquello debes acceder a la aplicación, navegando en ella y cotejándolo con los códigos que podemos encontrar en el directorio: cache/administrador/dev/modules . Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Editando el archivo generator.yml, encontramos lo siguiente: Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl
Rodrigo Miranda Blog: www.rodrigomiranda.cl Si bien la configuración básica es suficiente, Symfony permite extender esta configuración especificando directivas bajo la clave config. Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl La configuración anterior se divide en seis secciones. Cuatro de estas secciones representan las vistas (list, filter, new y edit) y las otras dos secciones son virtuales (fields, y form) ya que sólo se utilizan para tareas de configuración. Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Symfony analiza el archivo generator.yml, ubicado en el directorio config de los módulos creados con el comando  propel:generate-admin , ejemplo: apps/administrador/modules/blog_articulo/config/generator.yml Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Modificar algunas directivas del archivo  generator Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Modificando Titulos de las páginas: list: title: Listado de Artículos edit: title: Editando Artículo new: title: Nuevo Artículo Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Modificando Nombre de Acciones de plantilla: list: title: Listado de Artículos actions: _delete: {label: Borrar} _edit: {label: Editar} object_actions: _edit: {label: Editar} _delete: {label: Borrar} Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Modificando Nombre de columnas a nivel general  (inmediatamente bajo la clave config). También podríamos modificar a nivel de plantilla, por ejemplo modificar sólo para el caso list, new o edit. config:  fields: titulo: {label: Nombre} created_at: {label: Fecha Actualizada}  Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Incluir ayuda o descripción a un campo. edit: title: Editando Artículo %%titulo%% fields: titulo: {help: Ingrese Nombre a este artículo} contenido: {help: Ingrese una descripción} Administrador de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Parte Pública de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Parte pública de la Aplicación Crear  Módulo Artículo parte Pública: Dado que la parte pública del sistema necesita siempre algunas cualidades adicionales que la automatización –como es lógico- no siempre cubre, utilizaremos el siguiente comando para crear un módulo que nos permitirá trabajar sobre una base de código sólida. #./symfony propel:generate-module publico articulo  BlogArticulo
Rodrigo Miranda Blog: www.rodrigomiranda.cl Crear  Módulo Comentario parte Pública: A continuación creamos el módulo comentario para la parte pública de la aplicación. Parte pública de la Aplicación #./symfony propel:generate-module publico comentario  BlogComentario
Rodrigo Miranda Blog: www.rodrigomiranda.cl Acceder a la parte pública de Artículos Después de ejecutar los comandos anteriores, ya se puede acceder a la parte PÚBLICA de los artículos en la siguiente dirección: http://blog.localhost/publico_dev.php/articulo Parte pública de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Acceder a la parte pública de Comentarios Después de ejecutar los comandos anteriores, ya se puede acceder a la parte PÚBLICA de los comentarios en la siguiente dirección: http://blog.localhost/publico_dev.php/comentario Parte pública de la Aplicación
Rodrigo Miranda Blog: www.rodrigomiranda.cl Preguntas?

Symfony Parte 2

  • 1.
    Symfony Parte 2Rodrigo Miranda [email_address] [email_address] http://www.rodrigomiranda.cl
  • 2.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Desarrollando una Aplicacion
  • 3.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Desarrollando una Aplicación Requisitos: Plataforma LAMP o WAMP (Linux - Windows, Apache, MySQL y PHP 5.2.4 o superior, excepto la versión 5.2.9). Instalación de Symfony (recomendado mediante Subversion) Ambos desarrollados en la presentación anterior.
  • 4.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl El listado de las versiones lo puedes encontrar en la siguiente URL: http://svn.symfony-project.com/tags/ El release a descargar para producción, debe considerar siempre la última versión ESTABLE. Desarrollando una Aplicación
  • 5.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Desarrollando una Aplicación Si no tienes instalado Subversion, es hora de hacerlo . fedora, CentOS, RedHat: Ubuntu # yum install subversion # apt-get install subversion
  • 6.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Recomendamos crear un directorio que pueda contener más de una versión de Symfony. Este no debe ser accesible desde Internet. Una alternativa de descarga para el curso es la siguiente dirección: http://www.poodu.cl/symfony1_2_9.zip Desarrollando una Aplicación # mkdir –p /versiones-symfony/symfonyx_x_x/ # cd /versiones-symfony/symfonyx_x_x # svn co http://svn.symfony-project.com/tags/RELEASE_x_x_x/ .
  • 7.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Ingresar al directorio bin de la instalación Symfony: Ejecutar script check_configuration. El nos detallará si nuestro sistema cumple con los requerimientos para la instalación de Symfony. Desarrollando una Aplicación # cd /versiones-symfony/symfonyx_x_x/data/bin # php check_configuration.php
  • 8.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl El comando symfony -V , para el caso de la instalación por Subversión, lo podremos ejecutar de la siguiente manera: o resultado: Desarrollando una Aplicación # php /versiones-symfony/symfonyx_x_x/data/bin/symfony –V # /versiones-symfony/symfonyx_x_x/data/bin/./symfony –V # symfony version x.x.x (/versiones-symfony/symfonyx_x_x/lib)
  • 9.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Desarrollando una Aplicación Obtener Comandos de Symfony: O: # php /versiones-symfony/symfonyx_x_x/data/bin/symfony # /versiones-symfony/symfonyx_x_x/data/bin/./symfony
  • 10.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Desarrollando una Aplicación Comandos de Symfony:
  • 11.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos
  • 12.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyectos, Aplicación y Módulos Proyectos Web en Symfony: Para comenzar a desarrollar en Symfony se debe crear un proyecto Web. Cada proyecto Web se divide en una o más aplicaciones, y cada aplicación contiene uno o más módulos. Comúnmente un proyecto Symfony lo componen dos aplicaciones: parte pública y administrador. Cada Módulo contenido en una aplicación suele corresponderse a una tabla de la base de datos, aunque no es obligatorio que así sea.
  • 13.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyectos, Aplicación y Módulos Desarrollaremos un microblog: Ocuparemos un ejemplo del tutorial de Symfony, actualizándolo a la última versión estable y con algunas recomendaciones importantes.
  • 14.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyectos, Aplicación y Módulos Etapas del proyecto: 1. Definición de Aplicaciones. 2. Definición del Modelo de Datos. 3. Crear Proyecto y Aplicaciones. 4. Construir el Modelo. 5. Crear Módulos del Sistema.
  • 15.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyectos, Aplicación y Módulos 1. Proyecto Microblog: Definición de Aplicaciones
  • 16.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyectos, Aplicación y Módulos 2. Definición de Modelo de Datos:
  • 17.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyectos, Aplicación y Módulos 3.1. Crear el proyecto Blog: Dependiendo del sistema operativo y de la instalación realizada, puede ser necesario utilizar el prefijo php antes de cada comando Symfony. O: # php /versiones-symfony/symfonyx_x_x/data/bin/symfony generate:project blog # /versiones-symfony/symfonyx_x_x/data/bin/./symfony generate:project blog # mkdir /directorio/web/blog # cd /directorio/web/blog
  • 18.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyectos, Aplicación y Módulos 3.2. Crear las aplicaciones publico y administrador del proyecto Blog: # cd /directorio/web/blog # ./symfony generate:app publico # ./symfony generate:app administrador
  • 19.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyectos, Aplicación y Módulos Estructura del Proyecto y Aplicaciones Creadas:
  • 20.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Configuración del Servidor Web
  • 21.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Configuración del Servidor Web <VirtualHost *:80> ServerName blog.localhost DocumentRoot /directorio/web/blog/web DirectoryIndex index.php Alias /sf /versiones-symfony/symfonyx_x_x/data/web/sf Errorlog /var/log/httpd/blogError.log CustomLog /var/log/httpd/accessBlog.log common <Directory /versiones-symfony/symfonyx_x_x/data/web/sf> AllowOverride All Allow from All </Directory> <Directory /directorio/web/blog/web> Allowoverride All Allow from All </Directory> </VirtualHost>
  • 22.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Configuración archivo hosts: /etc/hosts c:\windows\system32\drivers\etc\hosts 127.0.0.1 blog.localhost Configuración del Servidor Web
  • 23.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Un error Común: Configuración del Servidor Web
  • 24.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Configuración del Servidor Web El anterior en esencia NO es un error, sino que Apache no puede encontrar las imágenes, hojas de estilos y archivos Javascript utilizados para la barra de depuración. Por lo tanto, se debe comprobar que existe la siguiente línea en la configuración del VirtualHost: Alias /sf /versiones-symfony/symfonyx_x_x/data/web/sf
  • 25.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos Una alternativa para generar el alias podría ser crear un enlace simbólico o copiar directamente los contenidos del directorio: /versiones-symfony/symfonyx_x_x/data/web/sf/ al directorio: /directorio/web/blog/web/sf/
  • 26.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos 4. Construir el Modelo: 4.1 – Protegiendo la Base de Datos: # mysql –u root -p mysql> use mysql; mysql> update user set password=PASSWORD(‘cl1v3ade4’) where user=‘root’; mysql> flush privileges; mysql> \q
  • 27.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl 4.2 Crear Base de Datos y Usuario: Proyecto, Aplicaciones y Módulos # mysql –u root -p mysql> create database blog default character set utf8 collate utf8_general_ci; mysql> grant all on blog.* to conicyt@localhost IDENTIFIED BY ‘c00ny’; mysql> flush privileges;
  • 28.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl 4. Construir el Modelo: 4.1 – Tabla articulo: CREATE TABLE IF NOT EXISTS `blog_articulo` ( `id` int(11) unsigned NOT NULL auto_increment, `titulo` varchar(255) NOT NULL, `contenido` text NOT NULL, `modificacion` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Mantenedor de Posts' AUTO_INCREMENT=1 ; Proyecto, Aplicaciones y Módulos
  • 29.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl 4.2 – Tabla comentario: CREATE TABLE IF NOT EXISTS `blog_comentario` ( `id` int(11) unsigned NOT NULL auto_increment, `autor` varchar(255) NOT NULL, `contenido` text NOT NULL, `modificacion` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `id_blog_articulo` int(11) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `id_blog_articulo` (`id_blog_articulo`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Mantenedor de Comentarios' AUTO_INCREMENT=1 ; Proyecto, Aplicaciones y Módulos
  • 30.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Modificamos archivo propel.ini de nuestro proyecto: propel.database.url = mysql:dbname=blog;host=localhost propel.database.creole.url = ${propel.database.url} propel.database.user = conicyt propel.database.password = c00ny propel.database.encoding = utf8 ; mysql options propel.mysql.tableType = InnoDB Proyecto, Aplicaciones y Módulos # vim /directorio/web/blog/config/propel.ini
  • 31.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos Modificamos archivo databases.yml de nuestro proyecto: all: propel: class: sfPropelDatabase param: classname: PropelPDO dsn: mysql:dbname=blog;host=localhost username: conicyt password: c00ny encoding: utf8 persistent: true pooling: true # vim /directorio/web/blog/config/databases.yml
  • 32.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos Construir Modelo a partir de una Base de Datos. Symfony puede utilizar la capa de acceso a base de datos proporcionada por Propel para generar un archivo schema.yml a partir de una base de datos existente. Se trata de una opción muy útil cuando se priefere trabajar primero en la base de datos antes de trabajar con el modelo de Objetos. Para construir el Modelo a partir de la Base de Datos, el archivo databases.yml del proyecto debe apuntar a la base de datos correcta y debe tener todas las opciones de conexión.
  • 33.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos A continuación vamos a generar un archivo schema.yml a partir de la estructura de la base de datos. Una vez creado lo encontraremos en el directorio config/ del proyecto. Ahora se puede construir el modelo a partir del esquema generado. Este comando es bastantes potente, pero el formato YAML no soporta algunas características por lo que es conveniente generar un archivo XML. # cd /directorio/web/blog #./symfony propel:build-schema
  • 34.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos A continuación añadimos el argumento xml a la tarea build-schema: para generar un esquema en formato XML. #./symfony propel:build-schema --xml
  • 35.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Proyecto, Aplicaciones y Módulos Construcción del Modelo de Objetos: Para generar las clases del modelo de objetos tomando como referencia el archivo schema construido en el paso anterior, utilizamos la siguiente sentencia dentro del directorio del proyecto. #./symfony propel:build-model
  • 36.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Después de construir el modelo, es necesario borrar la caché interna de Symfony mediante el comando symfony cc para que Symfony sea capaz de encontrar los nuevos modelos. Proyecto, Aplicaciones y Módulos #./symfony cc
  • 37.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Podemos ver que dentro del directorio lib/ (en la raíz del proyecto) se ha creado un nuevo directorio llamado model/ , el cual contiene las clases que representan las tablas de nuestro modelo de datos. Proyecto, Aplicaciones y Módulos #cd lib/model # ls –l -rw-r--r-- 1 conicyt conicyt 63 oct 27 09:46 BlogArticuloPeer.php -rw-r--r-- 1 conicyt conicyt 55 oct 27 09:46 BlogArticulo.php -rw-r--r-- 1 conicyt conicyt 67 oct 27 09:46 BlogComentarioPeer.php -rw-r--r-- 1 conicyt conicyt 59 oct 27 09:46 BlogComentario.php drwxr-xr-x 2 conicyt conicyt 4096 oct 27 09:46 map drwxr-xr-x 2 conicyt conicyt 4096 oct 27 09:46 om
  • 38.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Dentro del directorio lib/model/om/ del proyecto se han creado las clases Base del Modelo. Estas clases son extendidas por las clases mostradas anteriormente. Proyecto, Aplicaciones y Módulos #cd lib/model/om # ls –l -rw-r--r-- 1 conicyt conicyt 28212 oct 27 09:46 BaseBlogArticuloPeer.php -rw-r--r-- 1 conicyt conicyt 29357 oct 27 09:46 BaseBlogArticulo.php -rw-r--r-- 1 conicyt conicyt 36094 oct 27 09:46 BaseBlogComentarioPeer.php -rw-r--r-- 1 conicyt conicyt 27190 oct 27 09:46 BaseBlogComentario.php
  • 39.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Clases base y clases personalizadas
  • 40.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Clases bases y clases personalizadas Clases base: Son clases creadas en el directorio lib/model/om/ del proyecto a las cuales le precede la palabra Base. En ellas NO debemos añadir métodos personalizados ya que cada vez que se genera el modelo, con el comando symfony propel:build-model, se borran y se vuelven a crear.
  • 41.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Clases bases y clases personalizadas Clases personalizadas: Son clases creadas en el directorio lib/model del proyecto. Estas extienden a clases bases, por lo tanto, son hijas o herederas. Si deseamos añadir métodos particulares o atributos en nuestra aplicaciones, podemos trabajar en ellas sin preocupaciones, ya que ellas NO se regeneran cada vez que se construye el modelo de objetos.
  • 42.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Clases bases y clases personalizadas Clases objeto: Las clases BlogArticulo y BlogComentario representan a un registro de la base de datos. Permiten acceder a las columnas de UN registro y a los registros relacionados.
  • 43.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Clases bases y clases personalizadas Clases peer: Las clases BlogArticuloPeer y BlogComentarioPeer son clases de tipo peer, es decir, clases que tienen métodos estáticos para trabajar con las tablas de la base de datos. Sus métodos devuelven normalmente un objeto o una colección de objetos de la clase objeto relacionada.
  • 44.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Clases bases y clases personalizadas Diferencia entre Clase Objeto y peer: Mientras la primera REPRESENTA a un objeto y permite obtener objetos RELACIONADOS. La segunda permite OBTENER un objeto o una COLECCIÓN de objetos de acuerdo a clase/tabla que representa.
  • 45.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl A esta altura sabemos que Symfony trabaja con el concepto de Proyecto, el cual se subdivide en una o más aplicaciones, y donde cada aplicación puede tener uno o más módulos. Proyecto, Aplicaciones y Módulos
  • 46.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Construir Formularios Symfony a partir de la versión 1.1 incorporó un subframework para Formularios. Esto permite controlar uno de los procesos más tediosos en la construcción de aplicaciones. Una vez creado el Modelo, vamos a construir los formularios con el siguiente comando ejecutado en la raíz del proyecto. Proyectos, Aplicación y Módulos #./symfony propel:build-forms
  • 47.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Clases bases y clases personalizadas Construir Filtros El mecanismo de seguridad puede ser entendido como un filtro. Por él pasan las peticiones antes de ejecutar una acción. Según las comprobaciones realizadas en el filtro, se puede modificar el procesamiento de la petición. Más adelante profundizaremos al respecto. #./symfony propel:build-filters
  • 48.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Administrador de la Aplicación
  • 49.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Administrador de la Aplicación Crear Módulo Artículo de administración: Symfony crea la parte de administración de una aplicación en base a su modelo de datos. Los módulos se generan en base a objetos Propel mediante la tarea propel:generate-admin. #./symfony propel:generate-admin administrador BlogArticulo
  • 50.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Acceder a la parte de Gestión de Artículos Después de ejecutar los comandos anteriores, ya se puede acceder a la parte de gestión de los artículos en la siguiente dirección: http://blog.localhost/administrador_dev.php/blog_articulo Administrador de la Aplicación
  • 51.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Administrador de la Aplicación
  • 52.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Crear Módulo Comentario de administración: Para crear el administrador de Comentarios nuevamente utilizamos el comando propel:generate-admin. Administrador de la Aplicación #./symfony propel:generate-admin administrador BlogComentario
  • 53.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Acceder a la parte de Gestión de Comentarios Después de ejecutar el comando anterior, vamos a acceder a la parte de gestión de los comentarios en la siguiente dirección: http://blog.localhost/administrador_dev.php/blog_comentario Administrador de la Aplicación
  • 54.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl A continuación el controlador frontal administrador_dev.php nos muestra una página de error Administrador de la Aplicación
  • 55.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Si bien la gestión de comentarios es idéntica a la de los artículos, existe una característica que debemos indicar en una clase de nuestro modelo. El formulario de creación intenta mostrar la relación de la clave externa que hace referencia al artículo. Administrador de la Aplicación
  • 56.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Para solventar este problema debemos definir el método mágico __toString en la clase BlogArticulo, que se encuentra en el directorio lib/model/ de nuestro proyecto. <?php class BlogArticulo extends BaseBlogArticulo { public function __toString() { return $this-> getTitulo(); } } Administrador de la Aplicación
  • 57.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Vistazo al Código Generado
  • 58.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Los módulos creados con el comando propel:generate-admin contienen algunos archivos, pero carecen de códigos PHP. Podríamos decir que están vacíos. La razón del punto anterior es que Symfony se encarga de generar automáticamente el codigo PHP, para verificar aquello debes acceder a la aplicación, navegando en ella y cotejándolo con los códigos que podemos encontrar en el directorio: cache/administrador/dev/modules . Administrador de la Aplicación
  • 59.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Editando el archivo generator.yml, encontramos lo siguiente: Administrador de la Aplicación
  • 60.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl
  • 61.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Si bien la configuración básica es suficiente, Symfony permite extender esta configuración especificando directivas bajo la clave config. Administrador de la Aplicación
  • 62.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl La configuración anterior se divide en seis secciones. Cuatro de estas secciones representan las vistas (list, filter, new y edit) y las otras dos secciones son virtuales (fields, y form) ya que sólo se utilizan para tareas de configuración. Administrador de la Aplicación
  • 63.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Symfony analiza el archivo generator.yml, ubicado en el directorio config de los módulos creados con el comando propel:generate-admin , ejemplo: apps/administrador/modules/blog_articulo/config/generator.yml Administrador de la Aplicación
  • 64.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Modificar algunas directivas del archivo generator Administrador de la Aplicación
  • 65.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Modificando Titulos de las páginas: list: title: Listado de Artículos edit: title: Editando Artículo new: title: Nuevo Artículo Administrador de la Aplicación
  • 66.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Modificando Nombre de Acciones de plantilla: list: title: Listado de Artículos actions: _delete: {label: Borrar} _edit: {label: Editar} object_actions: _edit: {label: Editar} _delete: {label: Borrar} Administrador de la Aplicación
  • 67.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Modificando Nombre de columnas a nivel general (inmediatamente bajo la clave config). También podríamos modificar a nivel de plantilla, por ejemplo modificar sólo para el caso list, new o edit. config: fields: titulo: {label: Nombre} created_at: {label: Fecha Actualizada} Administrador de la Aplicación
  • 68.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Incluir ayuda o descripción a un campo. edit: title: Editando Artículo %%titulo%% fields: titulo: {help: Ingrese Nombre a este artículo} contenido: {help: Ingrese una descripción} Administrador de la Aplicación
  • 69.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Parte Pública de la Aplicación
  • 70.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Parte pública de la Aplicación Crear Módulo Artículo parte Pública: Dado que la parte pública del sistema necesita siempre algunas cualidades adicionales que la automatización –como es lógico- no siempre cubre, utilizaremos el siguiente comando para crear un módulo que nos permitirá trabajar sobre una base de código sólida. #./symfony propel:generate-module publico articulo BlogArticulo
  • 71.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Crear Módulo Comentario parte Pública: A continuación creamos el módulo comentario para la parte pública de la aplicación. Parte pública de la Aplicación #./symfony propel:generate-module publico comentario BlogComentario
  • 72.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Acceder a la parte pública de Artículos Después de ejecutar los comandos anteriores, ya se puede acceder a la parte PÚBLICA de los artículos en la siguiente dirección: http://blog.localhost/publico_dev.php/articulo Parte pública de la Aplicación
  • 73.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Acceder a la parte pública de Comentarios Después de ejecutar los comandos anteriores, ya se puede acceder a la parte PÚBLICA de los comentarios en la siguiente dirección: http://blog.localhost/publico_dev.php/comentario Parte pública de la Aplicación
  • 74.
    Rodrigo Miranda Blog:www.rodrigomiranda.cl Preguntas?