24

Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo
Page 2: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Desarrollo fácil con SymfonyAprende a desarrollar con Symfony y otras herramientasque te apoyarán y facilitarán en gran medida tu trabajocomo desarrollador web

Jon Torrado

Este libro está a la venta en http://leanpub.com/aprendesymfony2

Esta versión se publicó en 2016-06-20

This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishingprocess. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools andmany iterations to get reader feedback, pivot until you have the right book and build traction onceyou do.

© 2014 - 2016 Jon Torrado

Page 3: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

¡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 elhashtag en Twitter:

https://twitter.com/search?q=#aprendesymfony2

Page 4: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

A todos aquellos que han aportado algo de conocimiento en mi vida, a todas esas personas quecambiaron 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.

Page 5: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Índice general

Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Por qué escribo este libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Qué vas a aprender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2A quién está dirigido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Cómo se divide el libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Nota del autor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Capítulo 1: instalación y configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4El instalador de Symfony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Composer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5Base de datos MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Los permisos de escritura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7El servidor web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Entorno de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Truco 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Capítulo 2: los bundles de terceros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Buscando nuestro bundle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Instalando un nuevo bundle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Truco 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Capítulo 3: Admin Bundle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Instalando el Admin Bundle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Creando nuestra Admin Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Truco 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Page 6: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

IntroducciónDesde que comencémi carrera profesional, prácticamente todo lo que he hecho ha estado relacionadocon el mundo de la web. Al terminar la universidad, mis conocimientos sobre el desarrollo en estecampo eran muy limitados. Tan solo conocía un puñado de elementos HTML y algo un poco mássofisticado llamado Struts, un framework MVC en Java. Tuve que aprender en un tiempo récordpara estar a la altura del entorno en el que me estaba introduciendo, y esto fue posible gracias a laamplia documentación y ayuda que se puede encontrar por Internet.

Comencé utilizando una serie de CMS para diferentes empresas, como Moodle o Drupal, paraposteriormente embarcarme en el desarrollo a medida. ¡Y tan a medida! Tuve que mantener una webque estaba realizada de 0, sin ayuda de ningún framework ni nada por el estilo. ¡Ymenosmal que tuveque hacerlo! Este fue el proyecto que cambió mi rumbo profesional ya que pude sumergirme en lasentrañ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. Gracias a suexcelente documentación, la cual aconsejo leer encarecidamente más de una vez al año, y de bundlesde terceros que mantiene una comunidad realmente activa, pronto estaba desarrollando websincreíblemente potentes con un esfuerzo ridículo comparado a lo que había estado desarrollandohasta ese momento.

Tras varios años desarrollando webs bajo Symfony, considero éste un momento oportuno paraescribir el libro que te encuentras leyendo. Aquí voy a recopilar lo que consideromás importante paracomenzar a desarrollar un proyecto en Symfony y procuraré que seas capaz de utilizar tecnologíasque facilitarán tu trabajo en una medida que jamás habías imaginado (o por lo menos yo no lohabí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 escompletamente 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 comofuncionan 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? Yotambié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 tuconocimiento a otras personas y hacer crecer este sector entre todos es algo que considero vital para

¹http://www.frikipedia.es/friki/Bilbao

1

Page 7: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Introducción 2

cualquier temática, no solo esta. Creo que en la sociedad actual necesitamos de profesores excelentesque traten de mejorarse cada día ya que, dando lo mejor de ellos, conseguirán que sus alumnos denlo mejor de sí mismos.

Esto que te acabo de contar lo conecto con dos conceptos japoneses muy interesantes. El primerode ellos (aunque es una leyenda urbana, permíteme ser feliz contándotelo) es que, en su cultura, losprofesores son los únicos que no tienen que hacer una reverencia ante el emperador, porque ésteconsidera 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 enmi vida: Kaizen. Este concepto japonés viene a resumirse como el proceso de mejora que debemosaplicarnos 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 aprenderlotú. Además considero que ponerle un precio a algo que he conseguido gratis y que actualmente meda de comer es bastante absurdo. Es por esto que este libro es completamente gratuito, pero si alfinalizarlo te gusta y quieres agradecerme el trabajo que he realizado, puedes comprarlo por el precioque consideres sabiendo que estás ayudando a una buena causa, ya que donaré el 50% de lo quepagues por el libro a la plataforma de crowdfunding watchi² que proporciona todo tipo de ayudamé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 paradisponer 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 quetengas que descubrir por tu cuenta. Intentaré cubrir la mayoría de elementos que se utilizan a día dehoy tanto de Symfony como del desarrollo web en general y que podamos incorporar a este proyectobase.

No vas a aprender a utilizar Symfony desde 0. Considero que la documentación oficial de Symfonyes estupenda para este cometido. Pero tras leer esta parte básica compuesta por los 8 primeroscapítulos de su documentación, mi objetivo es que sepas utilizar Symfony de una manera másprofesional y orientada al producto final.

¿Hay algo que me he dejado fuera del tintero? No pasa nada, tienes mi Twitter para hacerme llegarlo que creas conveniente e iré recopilando cada una de las cosas que me digáis. Procuraré mantenerel 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,sepa previamente utilizar este framework o no. Incluso a las personas que no han programado en

²https://leanpub.com/causes/watsi

Page 8: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Introducción 3

PHP o ni siquiera han programado. Lógicamente, depende del punto en el que te encuentres, puedeque te cueste más o menos captar algunas de las cuestiones que plantearé durante el libro, pero estono 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 externassean del interés de profesionales del sector, pero desde luego no está pensado para ese nivel dedesarrollador.

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 sermás eficiente en el trabajo, o te permitirá hacer las cosas mejor mediante atajos y triquiñuelas quecirculan por la red.

Empezaremos la casa por el tejado y, tras instalar el framework lo llenaremos de un montón debundles de terceros antes de tocar ni una sola línea de código. Estos bundles nos permitirán teneruna base prefabricada para nuestros proyectos. Es posible que algunos de ellos no los necesites, peroaunque éste sea el caso, es muy interesante que dediques algo de tiempo a saber cómo están hechospor dentro. Ésto es algo que dejo en tus manos, ya que como desarrollador has de ser inquieto ymirar más allá del “funciona y ya está”.

Es hora de empezar a trabajar. Comenzamos con la instalación y sus buenas prácticas.

Nota del autor

Es posible que este libro tenga elementos desactualizados y por ello te salgan errores. Te invitoa que contactes conmigo para cualquier duda, te responderé con la mayor brevedad. Asimismo,disponemos de un Standard de Symfony que mantenemos desde LIN3S, actualizado y funcionando,y que puedes ver aquí³;

³https://github.com/LIN3S/SymfonyStandard

Page 9: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 1: instalación yconfiguraciónSé que esta parte está muy bien cubierta en la documentación oficial⁴ de Symfony, pero existenciertos conceptos que están separados en varios capítulos. Algunos de ellos se pueden incluso realizarde varias formas distintas. Y la pregunta es, ¿cuál es la mejor? La verdad es quemuchas veces duranteeste libro te responderé que “no hay una forma mejor o peor, sino que debes escoger la forma conla que te sientas más cómodo”.

Existen unas buenas prácticas que normalmente los desarrolladores intentamos seguir, y junto a esasbuenas prácticas me gustaría añadir las buenas prácticas de Jon (ya te dije que soy de Bilbao) quecompartiré contigo en este libro. Antes de poner los pasos que normalmente sigo yo, debes saberque utilizo prácticamente siempre Linux y/o OSX, por lo que si usas Windows tendrás que adaptarlo que escribo durante los diferentes capítulos para que funcione en tu sistema operativo. Pero no teasustes, 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 preparadonuestro sistema operativo para que las futuras instalaciones del framework sean increíblemente mássencillas. ¡Empecemos!

El instalador de Symfony

Desde hace ya un tiempo, Symfony cuenta con su propio instalador en un archivo .phar⁵. Antes dedisponer de este instalador, tenías que descargarte un archivo comprimido desde la web oficial deSymfony y descomprimirlo en la carpeta sobre la que ibas a desarrollar; posteriormente añadieronel proyecto en Packagist⁶ y el gestor de dependencias Composer⁷ hizo de instalador. Actualmente, lomejor que puedes hacer es mantener el instalador de Symfony como binario de tu sistema operativopara que puedas ejecutarlo como cualquier otro comando. Para ello, utiliza los siguientes comandoso los correspondientes a tu sistema operativo:

1 sudo curl -LsS http://symfony.com/installer -o /usr/local/bin/symfony

2 sudo chmod a+x /usr/local/bin/symfony

Una vez realizado, podrás ejecutar el comando symfony desde la ruta que quieras. Como consejomegustaría decirte que procures mantener el instalador de Symfony actualizado ejecutando el siguientecomando:

⁴http://symfony.com/doc/current/book/installation.html⁵http://php.net/manual/es/phar.using.intro.php⁶https://packagist.org/⁷https://getcomposer.org/

4

Page 10: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 1: instalación y configuración 5

1 sudo symfony self-update

¡Genial! Ahora que ya dispones del instalador de forma global, ya puedes crear tu primer proyectoSymfony. Para ello, ejecuta el siguiente comando:

1 symfony new aupa_bilbao 2.8

El comando anterior creará la carpeta aupa_bilbao con todo lo necesario para comenzar a trabajarsin perder un solo minuto, todo ello automágicamente. Si has leído la documentación de Symfonyo 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 elarchivo también situado en la raíz composer.json, archivo que utilizaremos en varias ocasionesdurante todo el libro. Sin embargo, el otro archivo situado a la par cuyo nombre es composer.lockmuestra 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?

NOTA: se establece la versión 2.8 en el comando anterior puesto que bundles que se utilizan en estelibro todavía no funcionan con Symfony 3.

Composer

Composer es la herramienta por excelencia para la gestión de dependencias de PHP que nos ayuda aintroducir “paquetes” o librerías de terceros en nuestro proyecto y así poder utilizarlos de una formasencilla. Si has utilizado “npm” de Node o “bundler” de Ruby, esto es muy similar; si no es el caso ynunca 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 sistemaoperativo y, de esta forma, poder ejecutarlo desde cualquier ruta. Para esto, ejecuta los siguientescomandos:

1 curl -sS https://getcomposer.org/installer | php

2 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 elproyecto en un servidor, lo correcto es que ejecutes el comando composer install en la raíz delmismo. Este comando instalará las versiones concretas especificadas en el archivo composer.lock yque, a su vez, deberían ser las versiones que están probadas y carecen de fallos o incompatibilidades.

Page 11: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 1: instalación y configuración 6

Sin embargo, si lanzas el comando composer update, el proceso ignorará el archivo de bloqueo yactualizará a la última versión posible que hayas definido en el archivo composer.json, actualizandoel 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 seañaden nuevas funcionalidades que seguro que aportan valor a tu proyecto. Y, por supuesto, manténtambién tu Composer actualizado con el siguiente comando:

1 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 queevites esta codificación y utilices UTF-8 para cada uno de tus proyectos. En Symfony, la consolase encargará de crear la base de datos por ti, pero para que automáticamente haga uso de estacodificación por defecto, deberás modificar el archivo my.cnf en el que se encuentran los parámetrosde configuración de tu base de datos MySQL, añadiendo las dos líneas que te dejo a continuaciónen la sección de [mysqld]:

1 [mysqld]

2 collation-server = utf8_general_ci

3 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, yedita los parámetros que se encuentran en él introduciendo los datos que corresponden a tumáquina.Una vez modificados, lanza el siguiente comando para crear la base de datos:

1 php app/console doctrine:database:create

Si usas Windows, tienes que escribir php antes del comando.

¡Buen trabajo! Ya tienes tu base de datos creada para empezar a trabajar. Solo te queda saber unacosilla más: Symfony hace uso de una serie de directorios a los que hay que darles permiso deescritura. Dichos directorios los usará tanto tu servidor web como la consola del framework, por loque ambos usuarios del sistema operativo deben tener permiso para escribir en ellos.

Page 12: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 1: instalación y configuración 7

Los permisos de escritura

Este es un error que me encuentro en muchos despliegues en local, y es que mucha gente se olvidade darle permiso de escritura a las carpetas de cache y logs. Más adelante veremos que sacaremosuna 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ómodebes darle permiso a dichas carpetas, y si usas un sistema Linux basado en Ubuntu, los siguientescomandos son los que te sirven:

1 HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep \

2 -v root | head -1 | cut -d\ -f1`

3 sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs

4 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, yaque dependiendo del sistema operativo y del servidor, este usuario varía. Las otras dos líneas seencargarán de darle a ese usuario y al usuario de la consola (es decir, el usuario con el que ejecutaráslos 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 tuordenador. No entra dentro del alcance de este libro el mostrar cómo se hace ya que existe unaforma mucho más sencilla que, aunque es menos potente, didácticamente nos vale. Si quieres sabercó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 elsiguiente comando en la raíz del proyecto:

1 app/console server:run

Tal y como te muestra la terminal, ya puedes acceder a tu proyecto Symfony navegando a la URLhttp://127.0.0.1:8000/. Lamentablemente, todavía no hay (casi) nada que ver, pero lo solucionaremosmuy pronto.

Entorno de desarrollo

Si vas a desarrollar Symfony, te aconsejo que dispongas de un entorno de desarrollo. A día de hoy, elIDE que mejor trabaja con Symfony es PhpStorm¹⁰. Existen muchos otros como NetBeans o Aptana,

⁸http://symfony.com/doc/2.8/book/installation.html#book-installation-permissions⁹http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html¹⁰https://www.jetbrains.com/phpstorm/

Page 13: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 1: instalación y configuración 8

e incluso editores como Sublime o Brackets que funcionan a la perfección. Pruébalos y escoge el quemejor se adapte a tu forma de trabajar, aunque personalmente te aconsejo PhpStorm por algún queotro truco que saldrá en futuros capítulos.

Truco 1

En cada capítulo te daré un consejo que sin duda te ayudará bastante. Depende de ti el utilizarestos consejos o no (¡úsalos insensat@!). A partir de ahora, utilizaremos muy a menudo la consolade Symfony. Como has podido ver, para ejecutar los diferentes comandos has de introducir phpapp/console cada vez que vayas a ejecutar cualquiera de ellos, y si además quieres que el entornode 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 alias dev = php app/console --env=dev

2 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 guardardichos 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 seacompletamente discriminatorio vale. ¿Qué quiere decir esto? Como “un ejemplo vale más que milpalabras”, 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 loscomandos que empiezan por “s” son server y swiftmailer, pero dentro de éstos solo hay uno queempiece por “r” que es server:run.

¡Enhorabuena! Ya eres más eficiente que muchos de los desarrolladores Symfony, los cualesdesconocen este pequeño truco :)

Resumen

En este capítulo hemos aprendido la forma correcta de desplegar un proyecto Symfony nuevo paracomenzar a trabajar con él. Gracias a la instalación global de su instalador y el gestor de dependenciasComposer, las posteriores nuevas instalaciones se harán en cuestión de minutos, ¡incluso segundos!

Page 14: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 2: los bundles de tercerosUna de las grandes maravillas que tiene Symfony y que comparte con otras muchas aplicacionesde código abierto es que la comunidad aporta elementos que enriquecen el framework. En Symfonyexisten varias formas de colaborar, pero la creación y mantenimiento de bundles que dotan defuncionalidades extra a las que ya trae por defecto es sin duda una de las piezas clave para quesu utilización esté tan extendida. Durante este capítulo, aprenderemos las bases para instalarbundles de terceros, aunque luego cada uno suele disponer de algunas secciones de configuraciónque difieren entre ellos. ¡Empecemos!

Buscando nuestro bundle

Antes de comenzar a desarrollar una nueva funcionalidad en tu proyecto, debes conocer esteconcepto: DRY. Estas siglas significan Don’t Repeat Yourself, es decir, no te repitas o, comodecimos, “no reinventes la rueda”. Muchos de los desarrollos que vas a codificar para tu nuevaweb 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 ymantienenpor ti?

Es por esta razón que, si sabes que lo que deseas incorporar en tu código es lo suficientementegenérico para que otros lo hayan hecho antes, te recomiendo que visites knpbundles.com¹¹ y busquesen este sitio web lo que necesitas. Por supuesto que puedes buscar en Google o en Packagist “lo-que-necesito symfony bundle”, pero aquí podrás navegar entre los diferentes bundles que utilizan el restode personas, filtrarlos según varios criterios y, gracias a esto, quizás puedas nutrirte de algo que notení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 dedesarrollador, así que vamos a ver cómo tienes que hacer para instalar cualquier bundle en tuproyecto.

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, peroantes de instalar nada creo conveniente escribir sobre estos pasos genéricos para que los tengas encuenta a la hora de introducir cualquier bundle que consideres oportuno y de utilidad.

¹¹http://knpbundles.com/

9

Page 15: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 2: los bundles de terceros 10

Lo primero que debes hacer es actualizar el archivo de descripción de dependencias composer.jsonpara que al lanzar comando de actualización sea capaz de descargar las nuevas dependencias en lacarpeta vendor. Bien en la documentación del bundle o en Packagist encontrarás todo lo que tienesque introducir en este archivo. Ten cuidado con las versiones tanto de las dependencias como delpropio 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óncorrecta del bundle según tus necesidades.

Actualizado el archivo, debes lanzar el comando de actualización de Composer para que instale lasnuevas dependencias:

1 composer update

El siguiente paso es configurar el bundle. Al igual que con la versión de Composer, la mayoríade 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 tepermitirá 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 deconfiguración del framework como el sistema de rutas, los servicios o la configuración relativa a laseguridad. Al final, todos son archivos de configuración en los que deberás pegar una serie de líneasque 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 diariocon esto, es una acción tan repetitiva que en algunas ocasiones te olvidas de realizarlo. Para activar lasnuevas dependencias, debes editar el archivo app/AppKernel.php y añadir las líneas de instanciaciónnecesarias que también se te habrán proporcionado en la documentación correspondiente. Si poralguna razón no las encuentras en la documentación, puedes dirigirte a la carpeta vendor y buscarel 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 echarde vez en cuando una ojeada a este capítulo. Son muy sencillos y te abrirán muchas posibilidades enel mundo de Symfony, ¿todavía no te lo crees? No te preocupes, en los próximos capítulos, sin tocarni 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 entu día a día como desarrollador o desarrolladora. Como hemos visto a lo largo de este capítulo, laweb de knpbundles.com es un buen punto de referencia para bundles de terceros de Symfony. No telimites a buscar aquí únicamente lo que necesitas y cuando lo necesitas, sino que debes visitar estaweb con asiduidad para saber lo que se está moviendo y lo que otros están utilizando. Sé curioso/ay mantente a la última conociendo gran parte del trabajo de la comunidad. Claramente ganarás unaventaja competitiva sobre todos los que están aislados de esta comunidad o se mantienen en su zona

Page 16: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

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 decididoembarcarte, un año significan tantos cambios y modificaciones que, o te subes al carro, o te quedasatrás y no te dicen ni “hasta luego”.

Resumen

En este capítulo hemos aprendido las bases para instalar casi cualquier bundle realizado porla comunidad. Hemos establecido una serie de pasos genéricos que te servirán en la instalacióny configuración de la mayoría de los desarrollos de la comunidad. En el siguiente capítulocomenzaremos instalando uno de los bundles más potentes y más utilizados en el mundo Symfony:el Admin Bundle del proyecto Sonata.

Page 17: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 3: Admin BundleComo hemos visto en capítulos anteriores, existe una comunidad activa que aporta innumerableselementos 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 debundles¹² podrás encontrar un gran abanico de soluciones geniales. En el enlace anterior puedesleer información acerca de los bundles en los que trabajan activamente para que vayas llenando tusneuronas de información. Además, durante este libro probaremos algunos de estos bundles para queveas cómo se instalan, cómo se configuran y, por supuesto, cómo se usan. El resto de ellos quedanen 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 desarrollopadre llamado core bundle que facilita en gran medida la instalación de los diferentes bundlesque pertenecen a su stack de proyectos. Para este ejemplo didáctico, vamos a suponer que usamosDoctrine ORM con una base de datos MySQL, pero tienes que saber que puedes utilizarlo con unabase de datos MongoDB que tan de moda se encuentra actualmente.

Lo primero que vamos a hacer es actualizar nuestras dependencias editando el archivo compo-

ser.json. Para ello, podemos hacerlo manualmente o podemos ejecutar el siguiente comando desdela ruta raíz de nuestro proyecto:

1 composer require sonata-project/admin-bundle ^3.3

Ten cuidado con las versiones y comprueba siempre el repositorio de GitHub de Sonata Admin parala versión que necesitas, siempre escogiendo la última rama estable posible. Esta rama es para laversión 2.* de Symfony. Hoy en día, el equipo de Sonata está trabajando en la versión 4.0 que saldrácon las versiones 3 de Symfony.

Como consejo te diré que estés atento cada vez que instales un nuevo bundle, porque muchas vecesverá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 porquepuede que sea muy interesante para tu proyecto ya que se encuentra estrechamente relacionado conalgo que acabas de instalar.

Hecho esto, el siguiente bundle a instalar es la conexión de nuestro admin con nuestra base de datosMySQL:

¹²https://sonata-project.org/bundles/

12

Page 18: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 3: Admin Bundle 13

1 composer require sonata-project/doctrine-orm-admin-bundle ^3.0

Lo siguiente que tenemos que hacer es activar el bundle y sus dependencias. En el capítuloanterior dejábamos esto para el último paso. ¿Por qué? Porque si activas el bundle sin terminarde 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óny quieres seguir trabajando con lo que estabas, tendrás que volver a desactivarlo y terminar lainstalación más adelante. Como vamos a hacerlo todo seguido, realmente el orden no importa, peroque sepas que puedes dejar este paso para más adelante. Para activar todo lo necesario, edita elarchivo app/AppKernel.php, añadiendo las siguientes líneas justo antes del AppBundle:

1 new Sonata\CoreBundle\SonataCoreBundle(),

2 new Sonata\BlockBundle\SonataBlockBundle(),

3 new Knp\Bundle\MenuBundle\KnpMenuBundle(),

4 new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),

5 new Sonata\AdminBundle\SonataAdminBundle(),

Para el siguiente paso tenemos que configurar los diferentes bundles que hemos activado. Todolo necesario está en la documentación oficial, y como decía uno de mis profesores: “un buenprogramador sabe copiar y pegar con gusto”. Edita el archivo app/config/config.yml y añade lasiguiente configuración:

1 sonata_block:

2 default_contexts: [cms]

3 blocks:

4 sonata.admin.block.admin_list:

5 contexts: [admin]

Además de esto, tenemos que activar el translator. Para ello, en el mismo config.yml, debes eliminarla “#” que precede a translator en la parte superior del archivo. ¿Lo has encontrado? Entoncesseguimos.

En este momento, realizamos la primera “prueba de fuego”: copiamos los assets a la carpeta públicay limpiamos la caché. Si alguno de los siguientes comandos te da un error tengo que anunciarte quete has equivocado en alguno de los pasos previos que hemos hecho:

1 php app/console assets:install web --symlink

2 php app/console cache:clear

Para entender las líneas anteriores deberías leerte la documentación de Symfony (¡¿todavía no te lahas leído?!). Para los más rezagados: la primera línea del código anterior copia los assets (recursoscomo archivos JavaScript, CSS, imágenes…) desde carpetas no públicas (src/...) a la carpeta pública

Page 19: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 3: Admin Bundle 14

web, en este caso creando un enlace simbólico (la mejor opción para cuando estamos en proceso dedesarrollo, en producción no deberías escribir este último parámetro); la segunda línea simplementelimpia 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 laconfiguración nos permitirá acceder a él a través de nuestro navegador. Por eso, necesitamos editarel archivo app/config/routing.yml y añadir las rutas que vienen en el vendor y harán accesible eldesarrollo. Añade la siguiente configuración en la parte superior del archivo:

1 admin:

2 resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'

3 prefix: /admin

4

5 _sonata_admin:

6 resource: .

7 type: sonata_admin

8 prefix: /admin

¿Sabes qué ya dispones un admin que funciona? Si tienes el servidor web levantado, tan solodirí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 responderal primer punto que te planteo, ya que en el siguiente capítulo instalaremos un bundle que haceuso 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 lapotencia que te otorga es impresionante. Nunca más te preocuparás de hacer la gestión de usuariospara ninguna de tus webs.

Page 20: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

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 quevamos a realizar a continuación te permitirá realizar el CRUD (Create, Read, Update, Delete) de unaentidad 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 ladocumentación¹³ oficial de Symfony:

1 <?php

2 // src/AppBundle/Entity/Product.php

3

4 namespace AppBundle\Entity;

5

6 use Doctrine\ORM\Mapping as ORM;

7

8 /**

9 * @ORM\Entity

10 * @ORM\Table(name="product")

11 */

12 class Product

13 {

14 /**

15 * @ORM\Column(type="integer")

16 * @ORM\Id

17 * @ORM\GeneratedValue(strategy="AUTO")

18 */

19 protected $id;

20

21 /**

22 * @ORM\Column(type="string", length=100)

23 */

24 protected $name;

25

26 /**

27 * @ORM\Column(type="decimal", scale=2)

28 */

29 protected $price;

30

31 /**

32 * @ORM\Column(type="text")

¹³http://symfony.com/doc/current/book/doctrine.html#add-mapping-information

Page 21: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 3: Admin Bundle 16

33 */

34 protected $description;

35 }

Recuerda generar los getters y setters y actualizar tu base de datos tras crear o modificar alguna detus entidades:

1 app/console doctrine:generate:entities AppBundle

2 app/console doctrine:schema:update --force

Lo siguiente que tienes que hacer es declarar la clase del admin que realizará el CRUD para estaentidad. Si vienes de versiones anteriores de Symfony, sabrás que la inyección de dependenciasde cada bundle cargaba un archivo services.yml. Personalmente, me gusta modificar dicho archivopara cargar un archivo admin.yml que también carga servicios, pero nos permite tener el códigobien “ordenadito”: cada cosa en su sitio. En el truco de este capítulo comparto contigo cómo lograreste objetivo, pero para este ejemplo, deberás modificar el archivo app/config/services.yml paracargar desde ahí nuestra admin class:

1 services:

2 sonata.admin.product:

3 class: AppBundle\Admin\ProductAdmin

4 tags:

5 - { name: sonata.admin, manager_type: orm, group: "Content", label: \

6 "Product" }

7 arguments:

8 - ~

9 - AppBundle\Entity\Product

10 - ~

11 calls:

12 - [ setTranslationDomain, [AppBundle]]

Excelente. Como puedes deducir del código anterior, nos hace falta crear una clase ProductAdminque es un “copy&paste” de la clase que puedes leer en la documentación, modificando únicamentelos campos de la entidad:

Page 22: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 3: Admin Bundle 17

1 <?php

2 // src/AppBundle/Admin/ProductAdmin.php

3

4 namespace AppBundle\Admin;

5

6 use Sonata\AdminBundle\Admin\AbstractAdmin;

7 use Sonata\AdminBundle\Datagrid\ListMapper;

8 use Sonata\AdminBundle\Datagrid\DatagridMapper;

9 use Sonata\AdminBundle\Form\FormMapper;

10

11 class ProductAdmin extends AbstractAdmin

12 {

13 // Fields to be shown on create/edit forms

14 protected function configureFormFields(FormMapper $formMapper)

15 {

16 $formMapper

17 ->add('name')

18 ->add('price')

19 ->add('description')

20 ;

21 }

22

23 // Fields to be shown on filter forms

24 protected function configureDatagridFilters(DatagridMapper $datagridMapper)

25 {

26 $datagridMapper

27 ->add('name')

28 ->add('price')

29 ;

30 }

31

32 // Fields to be shown on lists

33 protected function configureListFields(ListMapper $listMapper)

34 {

35 $listMapper

36 ->addIdentifier('id')

37 ->add('name')

38 ->add('price')

39 ->add('description')

40 ->add('_action', 'actions', array(

41 'actions' => array(

42 'edit' => array()

Page 23: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 3: Admin Bundle 18

43 )))

44 ;

45 }

46 }

¡Lo tenemos! Si vuelves a visitar http://127.0.0.1:8000/admin podrás ver la parte correspondiente alos productos. Prueba a crear, editar, filtrar y todo el resto de acciones que te permite el admin pordefecto.

A partir de aquí, aumentar tu panel de administración es “pan comido”: creas tu clase admin y laactivas en el archivo services.yml, sabiendo que tanto la clase PHP como la declaración del servicioes 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, comoel botón de editar en el listado. Con este admin podrás incluso hacer tus propios botones asociados atus controladores, por lo que usa el admin para lo que se adapte a ti, y adapta el admin para el restode 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 otroselementos que necesites.

Truco 3

Es posible que te guste tener la parte del admin completamente centralizada en tu bundle y no quierasdepender del archivo de servicios que está en la carpeta app. Esto se consigue con la inyección dedependencias de una forma muy simple. Si creas un nuevo bundle, esta clase ya te viene creada pordefecto. Puedes probarlo con este comando:

1 app/console generate:bundle

Pero sin duda, la mejor forma de aprender es “trasteando” (y rompiendo). Para ello, te dejo ladocumentación necesaria en este¹⁵ enlace. Recuerda modificar la parte de XML por YAML:

1 $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Res\

2 ources/config'));

3 $loader->load('services.yml');

4 $loader->load('admin.yml');

Nota: el enlace anterior podría modificar su contenido debido a que la documentacióndel 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

Page 24: Desarrollo fácil con Symfony - Leanpubsamples.leanpub.com/aprendesymfony2-sample.pdfDesarrollo fácil con Symfony AprendeadesarrollarconSymfonyyotrasherramientas queteapoyarányfacilitaránengranmedidatutrabajo

Capítulo 3: Admin Bundle 19

Resumen

En este capítulo hemos aprendido a instalar el Admin Bundle del proyecto Sonata y a crear nuestraprimera clase aplicada al administrador. Durante el siguiente capítulo instalaremos la gestión deusuarios basada en este administrador que nos dará control completo sobre ellos además de securizarel recién instalado admin.