Desarrollo fácil con Symfony2 Aprende a desarrollar con Symfony2 y otras herramientas que te apoyarán y facilitarán en gran medida tu trabajo como desarrollador web Jon Torrado Este libro está a la venta en http://leanpub.com/aprendesymfony2 Esta versión se publicó en 2015-09-09 This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have the right book and build traction once you do. ©2014 - 2015 Jon Torrado ¡Twitea sobre el libro! Por favor ayuda a Jon Torrado hablando sobre el libro en Twitter! El hashtag sugerido para este libro es #aprendesymfony2. Descubre lo que otra gente está diciendo sobre el libro haciendo click en este enlace para buscar el hashtag en Twitter: https://twitter.com/search?q=#aprendesymfony2 A todos aquellos que han aportado algo de conocimiento en mi vida, a todas esas personas que cambiaron el rumbo de mi carrera profesional y que han hecho que ahora sea la persona que soy, tanto en lo personal como en lo profesional. En este libro escribo un cachito de cada uno de vosotros. Gracias. Índice general Introducción . . . . . . . . . Por qué escribo este libro Qué vas a aprender . . . A quién está dirigido . . Cómo se divide el libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 3 Capítulo 1: instalación y configuración El instalador de Symfony . . . . . . Composer . . . . . . . . . . . . . . Base de datos MySQL . . . . . . . . Los permisos de escritura . . . . . . El servidor web . . . . . . . . . . . Entorno de desarrollo . . . . . . . . Truco 1 . . . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 6 6 7 7 8 8 Capítulo 2: los bundles de terceros Buscando nuestro bundle . . . . Instalando un nuevo bundle . . . Truco 2 . . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 10 11 Capítulo 3: Admin Bundle . . . . Instalando el Admin Bundle . . Creando nuestra Admin Class . Truco 3 . . . . . . . . . . . . . Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 15 18 19 . . . . . . . . . . Introducción Desde que comencé mi carrera profesional, prácticamente todo lo que he hecho ha estado relacionado con el mundo de la web. Al terminar la universidad, mis conocimientos sobre el desarrollo en este campo eran muy limitados. Tan solo conocía un puñado de elementos HTML y algo un poco más sofisticado llamado Struts, un framework MVC en Java. Tuve que aprender en un tiempo récord para estar a la altura del entorno en el que me estaba introduciendo, y esto fue posible gracias a la amplia documentación y ayuda que se puede encontrar por Internet. Comencé utilizando una serie de CMS para diferentes empresas, como Moodle o Drupal, para posteriormente embarcarme en el desarrollo a medida. ¡Y tan a medida! Tuve que mantener una web que estaba realizada de 0, sin ayuda de ningún framework ni nada por el estilo. ¡Y menos mal que tuve que hacerlo! Este fue el proyecto que cambió mi rumbo profesional ya que pude sumergirme en las entrañas de todo tipo de librerías y códigos espaguetti pertenecientes a gente realmente interesante. Tras una serie de giros algo inesperados, comencé mi viaje en el mundo de Symfony 2. Gracias a su excelente documentación, la cual aconsejo leer encarecidamente más de una vez al año, y de bundles de terceros que mantiene una comunidad realmente activa, pronto estaba desarrollando webs increíblemente potentes con un esfuerzo ridículo comparado a lo que había estado desarrollando hasta ese momento. Tras varios años desarrollando webs bajo Symfony, considero éste un momento oportuno para escribir el libro que te encuentras leyendo. Aquí voy a recopilar lo que considero más importante para comenzar a desarrollar un proyecto en Symfony y procuraré que seas capaz de utilizar tecnologías que facilitarán tu trabajo en una medida que jamás habías imaginado (o por lo menos yo no lo había hecho). Tampoco te creas que voy a escribir el libro definitivo y que dominará el mundo, ya que día a día sigo aprendiendo en un sector en el que ocurre de todo a diario y en el que es completamente imposible seguir el frenético ritmo cambiante en el que se encuentra. Pero… intentaré estar a la altura, ya que soy de Bilbao¹. Tan solo quiero pedirte una cosa antes de leerte este libro: lee la documentación de Symfony. La documentación está genial e incluso traducida al castellano, así que no voy a repetir ninguna parte que ya se encuentra perfectamente explicada en otro sitio. Tampoco hace falta que seas un profesional de la temática, pero al menos que sepas qué son y como funcionan las rutas, los controladores y las plantillas, además de saber qué es la consola de Symfony (en resumen, los 8 primeros capítulos del libro de la documentación). ¿Estás deseando empezar? Yo también, así que “vamos al lío”. Por qué escribo este libro Una de las partes más importantes de mi vida es la que dedico a la enseñanza. Poder expandir tu conocimiento a otras personas y hacer crecer este sector entre todos es algo que considero vital para ¹http://www.frikipedia.es/friki/Bilbao Introducción 2 cualquier temática, no solo esta. Creo que en la sociedad actual necesitamos de profesores excelentes que traten de mejorarse cada día ya que, dando lo mejor de ellos, conseguirán que sus alumnos den lo mejor de sí mismos. Esto que te acabo de contar lo conecto con dos conceptos japoneses muy interesantes. El primero de ellos (aunque es una leyenda urbana, permíteme ser feliz contándotelo) es que, en su cultura, los profesores son los únicos que no tienen que hacer una reverencia ante el emperador, porque éste considera que sin ellos no existiría un emperador. Por otro lado está uno de los conceptos que desde que lo leí han aplicado una mejora sustancial en mi vida: Kaizen. Este concepto japonés viene a resumirse como el proceso de mejora que debemos aplicarnos cada uno de nosotros a diario. Todo lo que voy a escribir en este libro lo he aprendido gratuitamente durante muchas semanas, incluso años, y decido compartirlo contigo para que no tengas que gastar tanto tiempo en aprenderlo tú. Además considero que ponerle un precio a algo que he conseguido gratis y que actualmente me da de comer es bastante absurdo. Es por esto que este libro es completamente gratuito, pero si al finalizarlo te gusta y quieres agradecerme el trabajo que he realizado, puedes comprarlo por el precio que consideres sabiendo que estás ayudando a una buena causa, ya que donaré el 50% de lo que pagues por el libro a la plataforma de crowdfunding watchi² que proporciona todo tipo de ayuda médica a gente de todo el mundo que lo necesita. Aprendes, disfrutas y ayudas a una buena causa. Qué vas a aprender Durante el libro realizaremos una serie de instalaciones y configuraciones de forma práctica para disponer de un proyecto base que te servirá de cara al futuro para cualquiera de tus proyectos. Algunas cosas puede que no sean necesarias en algunos de ellos; otras puede que haya añadir y que tengas que descubrir por tu cuenta. Intentaré cubrir la mayoría de elementos que se utilizan a día de hoy tanto de Symfony como del desarrollo web en general y que podamos incorporar a este proyecto base. No vas a aprender a utilizar Symfony desde 0. Considero que la documentación oficial de Symfony es estupenda para este cometido. Pero tras leer esta parte básica compuesta por los 8 primeros capítulos de su documentación, mi objetivo es que sepas utilizar Symfony de una manera más profesional y orientada al producto final. ¿Hay algo que me he dejado fuera del tintero? No pasa nada, tienes mi Twitter para hacerme llegar lo que creas conveniente e iré recopilando cada una de las cosas que me digáis. Procuraré mantener el libro actualizado para que sirva como documentación extra de tus proyectos. A quién está dirigido El libro está dirigido a cualquier persona que esté interesada en aprender a desarrollar con Symfony 2, sepa previamente utilizar este framework o no. Incluso a las personas que no han programado en ²https://leanpub.com/causes/watsi Introducción 3 PHP o ni siquiera han programado. Lógicamente, depende del punto en el que te encuentres, puede que te cueste más o menos captar algunas de las cuestiones que plantearé durante el libro, pero esto no significa que estás fuera del target ni mucho menos. En cuanto al nivel del lector, me arriesgaré a decir que es un libro para principiante - intermedio. Si ya llevas mucho tiempo con Symfony y en el desarrollo web, es posible que no aprendas nada. Aún así, también cabe la posibilidad de que alguno de los capítulos dedicados a tecnologías externas sean del interés de profesionales del sector, pero desde luego no está pensado para ese nivel de desarrollador. Ganas y fuerza de voluntad, es lo único que necesitas para adentrarte en este mundo, ¡ánimo! Cómo se divide el libro Cada capítulo contendrá una temática concreta explicada de la forma en la que yo trabajo. Además, en cada uno de ellos, dedicaré una sección para revelarte un truco que o bien te ayudará a ser más eficiente en el trabajo, o te permitirá hacer las cosas mejor mediante atajos y triquiñuelas que circulan por la red. Empezaremos la casa por el tejado y, tras instalar el framework lo llenaremos de un montón de bundles de terceros antes de tocar ni una sola línea de código. Estos bundles nos permitirán tener una base prefabricada para nuestros proyectos. Es posible que algunos de ellos no los necesites, pero aunque éste sea el caso, es muy interesante que dediques algo de tiempo a saber cómo están hechos por dentro. Ésto es algo que dejo en tus manos, ya que como desarrollador has de ser inquieto y mirar más allá del “funciona y ya está”. Es hora de empezar a trabajar. Comenzamos con la instalación y sus buenas prácticas. Capítulo 1: instalación y configuración Sé que esta parte está muy bien cubierta en la documentación oficial³ de Symfony, pero existen ciertos conceptos que están separados en varios capítulos. Algunos de ellos se pueden incluso realizar de varias formas distintas. Y la pregunta es, ¿cuál es la mejor? La verdad es que muchas veces durante este libro te responderé que “no hay una forma mejor o peor, sino que debes escoger la forma con la que te sientas más cómodo”. Existen unas buenas prácticas que normalmente los desarrolladores intentamos seguir, y junto a esas buenas prácticas me gustaría añadir las buenas prácticas de Jon (ya te dije que soy de Bilbao) que compartiré contigo en este libro. Antes de poner los pasos que normalmente sigo yo, debes saber que utilizo prácticamente siempre Linux y/o OSX, por lo que si usas Windows tendrás que adaptar lo que escribo durante los diferentes capítulos para que funcione en tu sistema operativo. Pero no te asustes, todo lo relacionado con Windows está disponible en la documentación oficial. El objetivo de este capítulo es aprender a instalar un proyecto Symfony, y a su vez dejar preparado nuestro sistema operativo para que las futuras instalaciones del framework sean increíblemente más sencillas. ¡Empecemos! El instalador de Symfony Desde hace ya un tiempo, Symfony cuenta con su propio instalador en un archivo .phar⁴. Antes de disponer de este instalador, tenías que descargarte un archivo comprimido desde la web oficial de Symfony y descomprimirlo en la carpeta sobre la que ibas a desarrollar; posteriormente añadieron el proyecto en Packagist⁵ y el gestor de dependencias Composer⁶ hizo de instalador. Actualmente, lo mejor que puedes hacer es mantener el instalador de Symfony como binario de tu sistema operativo para que puedas ejecutarlo como cualquier otro comando. Para ello, utiliza los siguientes comandos o los correspondientes a tu sistema operativo: 1 2 sudo curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony sudo chmod a+x /usr/local/bin/symfony Una vez realizado, podrás ejecutar el comando symfony desde la ruta que quieras. Como consejo me gustaría decirte que procures mantener el instalador de Symfony actualizado ejecutando el siguiente comando: ³http://symfony.com/doc/current/book/installation.html ⁴http://php.net/manual/es/phar.using.intro.php ⁵https://packagist.org/ ⁶https://getcomposer.org/ Capítulo 1: instalación y configuración 1 5 sudo symfony self-update ¡Genial! Ahora que ya dispones del instalador de forma global, ya puedes crear tu primer proyecto Symfony. Para ello, ejecuta el siguiente comando: 1 symfony new aupa_bilbao El comando anterior creará la carpeta aupa_bilbao con todo lo necesario para comenzar a trabajar sin perder un solo minuto, todo ello automágicamente. Si has leído la documentación de Symfony o has utilizado Composer con anterioridad, deberías saber que la carpeta vendor, situada en la raíz, contiene todas las dependencias necesarias de tu proyecto. Estas dependencias se definen en el archivo también situado en la raíz composer.json, archivo que utilizaremos en varias ocasiones durante todo el libro. Sin embargo, el otro archivo situado a la par cuyo nombre es composer.lock muestra las versiones bloqueadas, versiones exactas que se descargarán al ejecutar composer install. En este punto, ya hemos hablado varias veces sobre Composer, pero, ¿qué es Composer? Composer Composer es la herramienta por excelencia para la gestión de dependencias de PHP que nos ayuda a introducir “paquetes” o librerías de terceros en nuestro proyecto y así poder utilizarlos de una forma sencilla. Si has utilizado “npm” de Node o “bundler” de Ruby, esto es muy similar; si no es el caso y nunca los has usado, no te preocupes puesto que en este libro tendrás la oportunidad de hacerlo. Al igual que el instalador de Symfony, lo mejor es disponer de Composer como comando del sistema operativo y, de esta forma, poder ejecutarlo desde cualquier ruta. Para esto, ejecuta los siguientes comandos: 1 2 curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer En cuanto al proyecto Symfony, gracias a su propio instalador, ya tenemos los “paquetes base” descargados en la carpeta vendor y los archivos composer.json y composer.lock bien definidos. Pero si el proyecto sobre el que estás trabajando es un proyecto descargado o estás desplegando el proyecto en un servidor, lo correcto es que ejecutes el comando composer install en la raíz del mismo. Este comando instalará las versiones concretas especificadas en el archivo composer.lock y que, a su vez, deberían ser las versiones que están probadas y carecen de fallos o incompatibilidades. Sin embargo, si lanzas el comando composer update, el proceso ignorará el archivo de bloqueo y actualizará a la última versión posible que hayas definido en el archivo composer.json, actualizando el archivo de bloqueo cuando termine el proceso de descarga. ¡Oye! No te olvides de actualizar tus dependencias, cada semana se corrigen bugs de seguridad o se añaden nuevas funcionalidades que seguro que aportan valor a tu proyecto. Y, por supuesto, mantén también tu Composer actualizado con el siguiente comando: Capítulo 1: instalación y configuración 1 6 sudo composer self-update Base de datos MySQL Todavía hay días en los que me encuentro proyectos en codificación latin1. Te aconsejo que evites esta codificación y utilices UTF-8 para cada uno de tus proyectos. En Symfony, la consola se encargará de crear la base de datos por ti, pero para que automáticamente haga uso de esta codificación por defecto, deberás modificar el archivo my.cnf en el que se encuentran los parámetros de configuración de tu base de datos MySQL, añadiendo las dos líneas que te dejo a continuación en la sección de [mysqld]: 1 2 3 [mysqld] collation-server = utf8_general_ci character-set-server = utf8 Hecho esto, solo te queda decirle a Symfony cuáles son tus datos de conexión a la base de datos. Dirígete al archivo app/config/parameters.yml que automáticamente te ha creado el instalador, y edita los parámetros que se encuentran en él introduciendo los datos que corresponden a tu máquina. Una vez modificados, lanza el siguiente comando para crear la base de datos: 1 php app/console doctrine:database:create ¡Buen trabajo! Ya tienes tu base de datos creada para empezar a trabajar. Solo te queda saber una cosilla más: Symfony hace uso de una serie de directorios a los que hay que darles permiso de escritura. Dichos directorios los usará tanto tu servidor web como la consola del framework, por lo que ambos usuarios del sistema operativo deben tener permiso para escribir en ellos. Los permisos de escritura Este es un error que me encuentro en muchos despliegues en local, y es que mucha gente se olvida de darle permiso de escritura a las carpetas de cache y logs. Más adelante veremos que sacaremos una tercera carpeta muy interesante junto a las dos mencionadas. Todos estos directorios se encuentran dentro de la carpeta app. En este enlace⁷ puedes ver cómo debes darle permiso a dichas carpetas, y si usas un sistema Linux basado en Ubuntu, los siguientes comandos son los que te sirven: ⁷http://symfony.com/doc/current/book/installation.html#book-installation-permissions Capítulo 1: instalación y configuración 1 2 3 4 7 HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep \ -v root | head -1 | cut -d\ -f1` sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs La primera línea almacena en HTTPDUSER el usuario que está ejecutando nuestro servidor web, ya que dependiendo del sistema operativo y del servidor, este usuario varía. Las otras dos líneas se encargarán de darle a ese usuario y al usuario de la consola (es decir, el usuario con el que ejecutarás los comandos en la terminal) permisos para escribir en dichas carpetas. Otorgados los permisos pertinentes, ya estás a punto de terminar con la instalación. El servidor web Tienes la posibilidad de trabajar con Apache de forma nativa creando un VirtualHost en tu ordenador. No entra dentro del alcance de este libro el mostrar cómo se hace ya que existe una forma mucho más sencilla que, aunque es menos potente, didácticamente nos vale. Si quieres saber cómo llegar a buen puerto con esta primera opción, visita este enlace⁸. En este momento, y suponiendo que tienes PHP instalado en tu ordenador, te vale con ejecutar el siguiente comando en la raíz del proyecto: 1 php app/console server:run Tal y como te muestra la terminal, ya puedes acceder a tu proyecto Symfony navegando a la URL http://127.0.0.1:8000/. Lamentablemente, todavía no hay nada que ver, pero lo solucionaremos muy pronto. Entorno de desarrollo Si vas a desarrollar Symfony, te aconsejo que dispongas de un entorno de desarrollo. A día de hoy, el IDE que mejor trabaja con Symfony es PhpStorm⁹. Existen muchos otros como NetBeans o Aptana, e incluso editores como Sublime o Brackets que funcionan a la perfección. Pruébalos y escoge el que mejor se adapte a tu forma de trabajar, aunque personalmente te aconsejo PhpStorm por algún que otro truco que saldrá en futuros capítulos. ⁸http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html ⁹https://www.jetbrains.com/phpstorm/ Capítulo 1: instalación y configuración 8 Truco 1 En cada capítulo te daré un consejo que sin duda te ayudará bastante. Depende de ti el utilizar estos consejos o no (¡úsalos insensat@!). A partir de ahora, utilizaremos muy a menudo la consola de Symfony. Como has podido ver, para ejecutar los diferentes comandos has de introducir php app/console cada vez que vayas a ejecutar cualquiera de ellos, y si además quieres que el entorno de ejecución sea prod en vez de dev, que es el entorno por defecto para los comandos, deberás añadir --env=prod al final de cada uno de los comandos. Con el siguiente truco darás un respiro a tu teclado y, por descontado, a tus manos: 1 2 alias dev = php app/console --env=dev alias prod = php app/console --env=prod Estos alias no se mantienen tras reiniciar la máquina, por lo que busca en Internet cómo guardar dichos alias para que permanezcan en el tiempo (no te lo iba a dar todo hecho, ¿no?). Además del alias, tampoco hace falta introducir el comando completo: con tal de que sea completamente discriminatorio vale. ¿Qué quiere decir esto? Como “un ejemplo vale más que mil palabras”, a continuación te aclaro las ideas: 1 dev s:r El comando anterior ejecutará php app/console --env=dev server:run. ¿Por qué? Porque los comandos que empiezan por “s” son server y swiftmailer, pero dentro de éstos solo hay uno que empiece por “r” que es server:run. ¡Enhorabuena! Ya eres más eficiente que muchos de los desarrolladores Symfony, los cuales desconocen este pequeño truco :) Resumen En este capítulo hemos aprendido la forma correcta de desplegar un proyecto Symfony nuevo para comenzar a trabajar con él. Gracias a la instalación global de su instalador y el gestor de dependencias Composer, las posteriores nuevas instalaciones se harán en cuestión de minutos, ¡incluso segundos! Capítulo 2: los bundles de terceros Una de las grandes maravillas que tiene Symfony y que comparte con otras muchas aplicaciones de código abierto es que la comunidad aporta elementos que enriquecen el framework. En Symfony existen varias formas de colaborar, pero la creación y mantenimiento de bundles que dotan de funcionalidades extra a las que ya trae por defecto es sin duda una de las piezas clave para que su utilización esté tan extendida. Durante este capítulo, aprenderemos las bases para instalar bundles de terceros, aunque luego cada uno suele disponer de algunas secciones de configuración que difieren entre ellos. ¡Empecemos! Buscando nuestro bundle Antes de comenzar a desarrollar una nueva funcionalidad en tu proyecto, debes conocer este concepto: DRY. Estas siglas significan Don’t Repeat Yourself, es decir, no te repitas o, como decimos, “no reinventes la rueda”. Muchos de los desarrollos que vas a codificar para tu nueva web seguramente ya están realizados por otras personas: gestión de usuarios, manejo de imágenes, conexión y uso de bases de datos NoSQL… ¿por qué rehacer lo que otros ya han hecho y mantienen por ti? Es por esta razón que, si sabes que lo que deseas incorporar en tu código es lo suficientemente genérico para que otros lo hayan hecho antes, te recomiendo que visites knpbundles.com¹⁰ y busques en este sitio web lo que necesitas. Por supuesto que puedes buscar en Google o en Packagist “lo-quenecesito symfony bundle”, pero aquí podrás navegar entre los diferentes bundles que utilizan el resto de personas, filtrarlos según varios criterios y, gracias a esto, quizás puedas nutrirte de algo que no tenías previsto pero que es realmente interesante y te encaja perfectamente, ¿no crees? Parece que ya te voy convenciendo y me voy ganando un pequeño pedazo de tu corazón de desarrollador, así que vamos a ver cómo tienes que hacer para instalar cualquier bundle en tu proyecto. Instalando un nuevo bundle Ya has encontrado lo que necesitas y es hora de empezar a usarlo en tu proyecto. Durante este libro, instalaremos varios bundles de terceros para terminar con un proyecto base sólido y potente, pero antes de instalar nada creo conveniente escribir sobre estos pasos genéricos para que los tengas en cuenta a la hora de introducir cualquier bundle que consideres oportuno y de utilidad. ¹⁰http://knpbundles.com/ Capítulo 2: los bundles de terceros 10 Lo primero que debes hacer es actualizar el archivo de descripción de dependencias composer.json para que al lanzar comando de actualización sea capaz de descargar las nuevas dependencias en la carpeta vendor. Bien en la documentación del bundle o en Packagist encontrarás todo lo que tienes que introducir en este archivo. Ten cuidado con las versiones tanto de las dependencias como del propio Symfony, ya que no todos los bundles soportan todas las versiones de Symfony y viceversa. Es posible que alguna vez te toque indagar un poco en la documentación para seleccionar la versión correcta del bundle según tus necesidades. Actualizado el archivo, debes lanzar el comando de actualización de Composer para que instale las nuevas dependencias: 1 composer update El siguiente paso es configurar el bundle. Al igual que con la versión de Composer, la mayoría de los bundles disponen una configuración específica que deberás añadir en el archivo app/config/config.yml. La configuración concreta debe proporcionártela el creador del bundle y te permitirá parametrizar tu nueva dependencia para que se adapte a tu proyecto y funcione como tú quieres que lo haga. Cuidado: también hay bundles que requieren que modifiques otros archivos de configuración del framework como el sistema de rutas, los servicios o la configuración relativa a la seguridad. Al final, todos son archivos de configuración en los que deberás pegar una serie de líneas que previamente habrás copiado de un archivo README o de documentación. Hecho esto, el último paso es activar el bundle. Parece una chorrada pero cuando trabajas a diario con esto, es una acción tan repetitiva que en algunas ocasiones te olvidas de realizarlo. Para activar las nuevas dependencias, debes editar el archivo app/AppKernel.php y añadir las líneas de instanciación necesarias que también se te habrán proporcionado en la documentación correspondiente. Si por alguna razón no las encuentras en la documentación, puedes dirigirte a la carpeta vendor y buscar el archivo principal del bundle para encontrar el nombre específico de la clase a instanciar. ¡Todo listo! “Tatúate” estos pasos en el código fuente de tu cerebro, aunque de momento puedes echar de vez en cuando una ojeada a este capítulo. Son muy sencillos y te abrirán muchas posibilidades en el mundo de Symfony, ¿todavía no te lo crees? No te preocupes, en los próximos capítulos, sin tocar ni una sola línea de código, verás como tienes un Symfony con todo lo que siempre has deseado. Truco 2 No se si llamar a esto un truco o un consejo, pero sin duda es algo que debes tener en cuenta en tu día a día como desarrollador o desarrolladora. Como hemos visto a lo largo de este capítulo, la web de knpbundles.com es un buen punto de referencia para bundles de terceros de Symfony. No te limites a buscar aquí únicamente lo que necesitas y cuando lo necesitas, sino que debes visitar esta web con asiduidad para saber lo que se está moviendo y lo que otros están utilizando. Sé curioso/a y mantente a la última conociendo gran parte del trabajo de la comunidad. Claramente ganarás una ventaja competitiva sobre todos los que están aislados de esta comunidad o se mantienen en su zona Capítulo 2: los bundles de terceros 11 de confort reutilizando lo que llevan haciendo durante años. En el mundo en el que has decidido embarcarte, un año significan tantos cambios y modificaciones que, o te subes al carro, o te quedas atrás y no te dicen ni “hasta luego”. Resumen En este capítulo hemos aprendido las bases para instalar casi cualquier bundle realizado por la comunidad. Hemos establecido una serie de pasos genéricos que te servirán en la instalación y configuración de la mayoría de los desarrollos de la comunidad. En el siguiente capítulo comenzaremos instalando uno de los bundles más potentes y más utilizados en el mundo Symfony: el Admin Bundle del proyecto Sonata. Capítulo 3: Admin Bundle Como hemos visto en capítulos anteriores, existe una comunidad activa que aporta innumerables elementos interesantes a la atmósfera de Symfony. Algunos lo hacen con más ahínco que otros, y el proyecto Sonata es sin duda uno de los grandes a tener en cuenta. Dentro de su stack de bundles¹¹ podrás encontrar un gran abanico de soluciones geniales. En el enlace anterior puedes leer información acerca de los bundles en los que trabajan activamente para que vayas llenando tus neuronas de información. Además, durante este libro probaremos algunos de estos bundles para que veas cómo se instalan, cómo se configuran y, por supuesto, cómo se usan. El resto de ellos quedan en tu tejado. ¡Vamos allá! Instalando el Admin Bundle Instalar el Admin Bundle es bastante sencillo a día de hoy ya que Sonata ha generado un desarrollo padre llamado core bundle que facilita en gran medida la instalación de los diferentes bundles que pertenecen a su stack de proyectos. Para este ejemplo didáctico, vamos a suponer que usamos Doctrine ORM con una base de datos MySQL, pero tienes que saber que puedes utilizarlo con una base de datos MongoDB que tan de moda se encuentra actualmente. Lo primero que vamos a hacer es actualizar nuestras dependencias editando el archivo composer.json. Para ello, podemos hacerlo manualmente o podemos ejecutar el siguiente comando desde la ruta raíz de nuestro proyecto: 1 composer require sonata-project/admin-bundle dev-master Como consejo te diré que estés atento cada vez que instales un nuevo bundle, porque muchas veces verás líneas como: 1 name1/bundle1 suggests installing name2/bundle2 Es recomendable que al menos te dirijas a la documentación de ese bundle recomendado porque puede que sea muy interesante para tu proyecto ya que se encuentra estrechamente relacionado con algo que acabas de instalar. Hecho esto, el siguiente bundle a instalar es la conexión de nuestro admin con nuestra base de datos MySQL: ¹¹https://sonata-project.org/bundles/ Capítulo 3: Admin Bundle 1 13 composer require sonata-project/doctrine-orm-admin-bundle dev-master Lo siguiente que tenemos que hacer es activar el bundle y sus dependencias. En el capítulo anterior dejábamos esto para el último paso. ¿Por qué? Porque si activas el bundle sin terminar de configurarlo, te dará error (siempre y cuando lleve una configuración asociada, por supuesto), por lo que si te quedas a medias en alguno de los pasos que vamos a realizar a continuación y quieres seguir trabajando con lo que estabas, tendrás que volver a desactivarlo y terminar la instalación más adelante. Como vamos a hacerlo todo seguido, realmente el orden no importa, pero que sepas que puedes dejar este paso para más adelante. Para activar todo lo necesario, edita el archivo app/AppKernel.php, añadiendo las siguientes líneas justo antes del AppBundle: 1 2 3 4 5 new new new new new Sonata\CoreBundle\SonataCoreBundle(), Sonata\BlockBundle\SonataBlockBundle(), Knp\Bundle\MenuBundle\KnpMenuBundle(), Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(), Sonata\AdminBundle\SonataAdminBundle(), Para el siguiente paso tenemos que configurar los diferentes bundles que hemos activado. Todo lo necesario está en la documentación oficial, y como decía uno de mis profesores: “un buen programador sabe copiar y pegar con gusto”. Edita el archivo app/config/config.yml y añade la siguiente configuración: 1 2 3 4 5 sonata_block: default_contexts: [cms] blocks: sonata.admin.block.admin_list: contexts: [admin] Además de esto, tenemos que activar el translator. Para ello, en el mismo config.yml, debes eliminar la “#” que precede a translator en la parte superior del archivo. ¿Lo has encontrado? Entonces seguimos. En este momento, realizamos la primera “prueba de fuego”: copiamos los assets a la carpeta pública y limpiamos la caché. Si alguno de los siguientes comandos te da un error tengo que anunciarte que te has equivocado en alguno de los pasos previos que hemos hecho: 1 2 php app/console assets:install web --symlink php app/console cache:clear Para entender las líneas anteriores deberías leerte la documentación de Symfony (¡¿todavía no te la has leído?!). Para los más rezagados: la primera línea del código anterior copia los assets (recursos como archivos JavaScript, CSS, imágenes…) desde carpetas no públicas (src/...) a la carpeta pública Capítulo 3: Admin Bundle 14 web, en este caso creando un enlace simbólico (la mejor opción para cuando estamos en proceso de desarrollo, en producción no deberías escribir este último parámetro); la segunda línea simplemente limpia la cache para regenerar elementos necesarios para un renderizado correcto. ¡Estupendo! Ya tenemos el admin instalado pero… todavía no es funcional. La siguiente parte de la configuración nos permitirá acceder a él a través de nuestro navegador. Por eso, necesitamos editar el archivo app/config/routing.yml y añadir las rutas que vienen en el vendor y harán accesible el desarrollo. Añade la siguiente configuración en la parte superior del archivo: 1 2 3 4 5 6 7 8 admin: resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml' prefix: /admin _sonata_admin: resource: . type: sonata_admin prefix: /admin ¿Sabes qué ya dispones un admin que funciona? Si tienes el servidor web levantado, tan solo dirígete a http://127.0.0.1:8000/admin y podrás ver su solitario y despoblado panel de administración. Supongo que aquí ya te han surgido varias dudas: • ¿Cómo introduzco elementos en este panel de administración? • Ni siquiera tengo usuario y he podido entrar, ¿dónde está la seguridad? • ¡Es muy feo! ¿Cómo modifico los estilos? Tranquilo joven padawan, cada cosa llegará a su tiempo y de momento, este solo es el de responder al primer punto que te planteo, ya que en el siguiente capítulo instalaremos un bundle que hace uso de este administrador. Con él, automágicamente dispondremos de: • • • • Gestión de usuarios: creación, email de activación, recuperación de contraseña, login, … Administración de usuarios: desde el panel de administración, edición de roles, … Seguridad en el admin: respondiendo a uno de los puntos anteriores. Etc. Lo mejor de todo esto es que la instalación del bundle de usuarios son tan solo 10 minutos, y la potencia que te otorga es impresionante. Nunca más te preocuparás de hacer la gestión de usuarios para ninguna de tus webs. Capítulo 3: Admin Bundle 15 Creando nuestra Admin Class De nada sirve tener un admin si no podemos introducir nuestros propios elementos. El ejemplo que vamos a realizar a continuación te permitirá realizar el CRUD (Create, Read, Update, Delete) de una entidad ejemplo añadiendo un sistema de filtrado y ordenación. Para comenzar, debes crear la clase Product.php tal y como se indica en el capítulo de Doctrine de la documentación¹² oficial de Symfony: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <?php // src/AppBundle/Entity/Product.php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="product") */ class Product { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $name; /** * @ORM\Column(type="decimal", scale=2) */ protected $price; /** * @ORM\Column(type="text") ¹²http://symfony.com/doc/current/book/doctrine.html#add-mapping-information Capítulo 3: Admin Bundle 33 34 35 16 */ protected $description; } Recuerda generar los getters y setters y actualizar tu base de datos tras crear o modificar alguna de tus entidades: 1 2 php app/console doctrine:generate:entities AppBundle php app/console doctrine:schema:update --force Lo siguiente que tienes que hacer es declarar la clase del admin que realizará el CRUD para esta entidad. Si vienes de versiones anteriores de Symfony, sabrás que la inyección de dependencias de cada bundle cargaba un archivo services.yml. Personalmente, me gusta modificar dicho archivo para cargar un archivo admin.yml que también carga servicios, pero nos permite tener el código bien “ordenadito”: cada cosa en su sitio. En el truco de este capítulo comparto contigo cómo lograr este objetivo, pero para este ejemplo, deberás modificar el archivo app/config/services.yml para cargar desde ahí nuestra admin class: 1 2 3 4 5 6 7 8 9 10 11 12 services: sonata.admin.product: class: AppBundle\Admin\ProductAdmin tags: - { name: sonata.admin, manager_type: orm, group: "Content", label: \ "Product" } arguments: - ~ - AppBundle\Entity\Product - ~ calls: - [ setTranslationDomain, [AppBundle]] Excelente. Como puedes deducir del código anterior, nos hace falta crear una clase ProductAdmin que es un “copy&paste” de la clase que puedes leer en la documentación, modificando únicamente los campos de la entidad: Capítulo 3: Admin Bundle 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?php // src/AppBundle/Admin/ProductAdmin.php namespace AppBundle\Admin; use use use use Sonata\AdminBundle\Admin\Admin; Sonata\AdminBundle\Datagrid\ListMapper; Sonata\AdminBundle\Datagrid\DatagridMapper; Sonata\AdminBundle\Form\FormMapper; class ProductAdmin extends Admin { // Fields to be shown on create/edit forms protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add('name') ->add('price') ->add('description') ; } // Fields to be shown on filter forms protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper ->add('name') ->add('price') ; } // Fields to be shown on lists protected function configureListFields(ListMapper $listMapper) { $listMapper ->addIdentifier('id') ->add('name') ->add('price') ->add('description') ->add('_action', 'actions', array( 'actions' => array( 'edit' => array() 17 Capítulo 3: Admin Bundle 43 44 45 46 18 ))) ; } } ¡Lo tenemos! Si vuelves a visitar http://127.0.0.1:8000/admin podrás ver la parte correspondiente a los productos. Prueba a crear, editar, filtrar y todo el resto de acciones que te permite el admin por defecto. A partir de aquí, aumentar tu panel de administración es “pan comido”: creas tu clase admin y la activas en el archivo services.yml, sabiendo que tanto la clase PHP como la declaración del servicio es prácticamente un “copy&paste” exacto de cualquier otro admin que ya hayas creado previamente. En este ejemplo te he añadido algunas modificaciones con respecto a la documentación oficial, como el botón de editar en el listado. Con este admin podrás incluso hacer tus propios botones asociados a tus controladores, por lo que usa el admin para lo que se adapte a ti, y adapta el admin para el resto de acciones que te falten. ¿Cómo hacer esto? Documentación y a probar, ¡ánimo! Por de pronto, aquí te dejo la configuración base¹³ de Sonata Admin Bundle, para que cambies el título, el logo u otros elementos que necesites. Truco 3 Es posible que te guste tener la parte del admin completamente centralizada en tu bundle y no quieras depender del archivo de servicios que está en la carpeta app. Esto se consigue con la inyección de dependencias de una forma muy simple. Si creas un nuevo bundle, esta clase ya te viene creada por defecto. Puedes probarlo con este comando: 1 php app/console generate:bundle Pero sin duda, la mejor forma de aprender es “trasteando” (y rompiendo). Para ello, te dejo la documentación necesaria en este¹⁴ enlace. Recuerda modificar la parte de XML por YAML: 1 2 3 4 $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Res\ ources/config')); $loader->load('services.yml'); $loader->load('admin.yml'); Nota: el enlace anterior podría modificar su contenido debido a que la documentación del bundle se encuentra en reestructuración. ¹³https://sonata-project.org/bundles/admin/master/doc/reference/configuration.html ¹⁴http://symfony.com/doc/current/cookbook/bundles/extension.html Capítulo 3: Admin Bundle 19 Resumen En este capítulo hemos aprendido a instalar el Admin Bundle del proyecto Sonata y a crear nuestra primera clase aplicada al administrador. Durante el siguiente capítulo instalaremos la gestión de usuarios basada en este administrador que nos dará control completo sobre ellos además de securizar el recién instalado admin.
© Copyright 2024