Symfony2 es uno de los frameworks más completo para PHP. Su motor de plantillas es simplemente sorprendente, fácil de usar y extender. Su ORM, llamado Doctrine, es de igual manera una muy poderosa herramienta, muy versátil y flexible. Claro está que Symfony2 no nos obliga a usar ni Twig como motor de plantillas ni tampoco a Doctrine como ORM, este es uno de los puntos más grandiosos de Symfony2: es muy atómico.
En resumen, Symfony2 es un conjunto de componentes acoplables destinados para que, trabajando juntos, proporcionen una poderosa herramienta de trabajo.
Porqué usar Symfony2
Aunque todos estamos de acuerdo con las muchas ventajas que nos proporciona el framework y su filosofía de trabajo, también es verdad que muchos desarrolladores llegamos al punto de la frustración cuando notamos la marcada diferencia en la curva de aprendizaje. Es decir, si ustedes como yo vienen de programar usando Codeigniter el cual es famoso por su simplicidad y por la curva de aprendizaje casi inexistente, entonces saben lo que se siente cuando uno intenta por primera vez usar Symfony2 (yo creo que tuve una depresión post-traumática o algo por el estilo).
Symfony2 es demasiado distinto, esta diseñado bajo una arquitectura orientada a servicios, donde la mayoría de nuestros objetos o servicios viven dentro de su contenedor de servicios.
Aunque esto parezca chino para la mayoría, para simplificar las cosas podemos decir que esto nos provee una manera muy organizada y limpia de programar una vez te acostumbres a ella. De hecho, se vuelve adictivo ver un código bien programado en Symfony, todo queda tan limpio y elegante que cuando ves tus trabajos anteriores usando CodeIgniter como es mi caso, te das cuenta de lo mucho que has aprendido, de lo mucho que ha mejorado tu manera de codificar, lo cual es, en cierta parte, algo motivador, así que si esto pudiera ser un incentivo, el usar Symfony mejorará tu código, aprenderás patrones de diseño, mejorarás considerablemente como programador y ya no te dará dolor de cabeza el mantener tus proyectos como en el pasado donde tenias que revisar toneladas de código repetitivo etc.
Cómo instalar Symfony2
Instalaremos Symfony2 usando composer y generaremos nuestro primer bundle.
Primero lo primero, comenzaremos por instalar y configurar un ambiente de desarrollo para symfony2, pudieramos instalar Symfony2 simplemente descargandolo de la página oficial www.symfony.com, pero les recomiendo descargarlo por composer como sugieren en la página http://symfony.com/download.
Instalar Composer de manera global en Linux:
Necesitaremos el paquete curl para descargarnos el ejecutable de composer, lo podemos instalar con el siguiente comando si usas Ubuntu/DebianCódigo :
sudo apt-get install curl
Luego de tener instalado nuestro paquete nos descargamos Composer con el siguiente comando
Código :
$ curl -sS https://getcomposer.org/installer | php
Para tener composer de manera global movemos nuestro ejecutable a la carpeta /usr/bin con el siguiente comando:
Código :
sudo mv composer.par /usr/bin/composer
y listo, ya tenemos Composer instalado.
Instalar Symfony2 en nuestro servidor local
Asumiremos que ya tienes Apache2, PHP y mySQL instalados y corriendo, así que comenzaremos desde el punto de cómo configurar un servidor virtual para Symfony2 en Apache. Necesitaremos notificar en nuestro archivo /etc/hosts el nombre de nuestro servidor virtual:Código :
sudo vim /etc/hosts
Luego agregamos el nombre de nuestro servidor virtual justo después de localhost como en el siguiente
Código :
127.0.0.1 localhost symfony.dev
Usaremos symfony.dev como nombre de nuestro servidor virtual, ahora necesitaremos crear el archivo de configuración apache para nuestro servidor virtual:
Código :
sudo vim /etc/apache2/sites-available/symfony.dev
Código :
<VirtualHost *:80> ServerName symfony.dev DocumentRoot "/var/www/symfony.dev/web" DirectoryIndex app.php <Directory "/var/www/symfony.dev/web"> AllowOverride All Allow from All </Directory> </VirtualHost>
Ahora nos descargamos Symfony2 usando Composer al directorio de nuestro servidor local Apache:
Código :
composer create-project symfony/framework-standard-edition symfony.dev/ 2.4.0
Luego de descargar el framework nos hará una serie de preguntas para cargar valores de configuración, tales como el nombre de nuestra db, si usaremos mysql o postgresql etc… llenamos estos valores con los nuestros y luego habilitamos nuestro servidor virtual en apache:
Código :
sudo a2ensite symfony.dev
Listo, si hemos realizado todos los pasos de manera correcta deberíamos poder ver al framework corriendo sin problemas con la siguiente dirección http://symfony.dev/app_dev.php
Symfony2 web interface:
Symfony2 viene con una interfaz web para cargar algunos valores de configuración, estos son los mismos que nos pregunta la consola después de haber instalado Symfony2 con composer. Tomate tu tiempo y revisa cada una de las páginas del demo de la web interface, cada una de ellas muestra algunos snippets con el código que está siendo utilizado para presentar esa sección del demo.
Los Bundles de Symfony2
Un Bundle es básicamente una agrupación de plantillas, archivos de configuración y clases de PHP necesarias para programar algún funcionamiento determinado en una aplicación de Symfony2. ¿Recuerdan la estructura de directorios de Codeigniter?, donde había un solo directorio para los controladores. otro para los modelos y otro para las vistas, lo cual volvía muy engorroso el codificar una aplicación grande y compleja, 100 o más controladores en un mismo directorio y aunque esto se puede separar en codeigniter, igual sigue siendo poco práctico comparado con el sistema de bundles de Symfony2.
Un bundle también tiene sus directorios para MVC, y puedes llamarlos como tu quieras, pero mejor sigue las convenciones para el nombramiento de bundles.
Usando los Generadores de Symfony2
Symfony2 viene con un poderoso componente de consola, el cual nos provee de varios comandos cuya finalidad es facilitarnos la vida a la hora de desarrollar aplicaciones, uno de estos es el comando:Código :
php app/console generate:bundle
Obviamente los comandos deben ser ejecutados desde el directorio raíz de nuestra aplicación
Este comando nos ayuda a generar los archivos básicos de un bundle, al ejecutarlo se nos presentarán varias opciones que nos permitirán configurar el bundle según nuestros requerimientos, de momento vamos a ejecutar el comando con todas las opciones ya predefinidas.
Código :
php app/console generate:bundle --namespace=Example/ItemBundle --format=yml --bundle-name=ExampleItemBundle --dir=src
Después de ejecutarse el comando, el generador de Symfony2 habrá codificado un bundle básico que puede ser usado como punto de partida. Este bundle de ejemplo es funcional, es decir, symfony2 ya hizo todo lo necesario para que puedas ejecutar el bundle sin problemas, sin embargo explicaremos algunos de los pasos importantes ejecutados.
- Actualización del Kernel: Seguro notaste durante la ejecución del comando generate:bundle que el generador de Symfony2 pregunta si deseas confirmar la actualización automática de tu kernel. Con esto el framework se refiere al archivo AppKernel.php que se encuentra en el directorio app del framework, fijate que en el método registerBundles deberías poder ver la siguiente sentencia (en caso de que hayas ejecutado el comando tal cual se presenta en este tutorial): new Example\ItemBundle\ExampleItemBundle(). En Symfony2 cada nuevo bundle debe ser registrado en el kernel en la misma forma que lo está nuestro ExampleItemBundle, esto incluye los bundles de terceros.
- Actualización del archivo de configuración de rutas: Symfony2 también nos pregunta si deseamos actualizar automáticamente el registro de rutas para nuestro bundle, este comando básicamente agrega las rutas de nuestro bundle al archivo principal de rutas localizado en app/routes.yml.
- Directorios generados: El generador también nos crea los directorios necesarios para nuestro bundle base, es importante tratar de usar las mismas convenciones que el generador, esto es por cuestiones de portabilidad.
Cómo funciona un bundle
Ya para este momento tenemos un bundle base funcionando perfectamente, ahora... como funciona ?
El controlador
Symfony nos generó un controlador base que se encuentra en src/Example/ItemBundle/Controller/DefaultController.php. Este controlador cuenta con un método acción llamado indexAction en el cual podemos ver como se recibe un parámetro por la url, tal cual como los controladores de Codeigniter o Laravel, y luego devolvemos la plantilla renderizada y le asignamos a la plantilla el parámetro name. En este ejemplo lo mas importante es notar el controlador padre del cual extendemos a nuestro controlador, aunque esto no es obligatorio debido a la gran flexibilidad que nos ofrece Symfony2, en la mayoría de los casos es recomendable extender al controlador padre, este nos proveerá de muchos métodos que nos facilitarán la vida.Las rutas
EL framework también nos generó un archivo de rutas, donde está definida la ruta para acceder a nuestro controlador, este se encuentra en src/Example/ItemBundle/Resources/config/routes.ymlCódigo :
example_item_homepage: pattern: /hello/{name} defaults: { _controller: ExampleItemBundle:Default:index }
Esta ruta además fue agregada al archivo global de rutas del framework el cual se encuentra en app/config/routing.yml
Código :
example_item: resource: "@ExampleItemBundle/Resources/config/routing.yml" prefix: /
Como se puede observar, podemos definir un prefijo para la ruta que estamos importando. Por el momento no colocaremos nada pero en un futuro iremos colocando los prefijos necesarios para distinguir nuestras rutas.
La ruta del bundle que generamos define el patrón hello/{name} donde name es el parámetro que estamos recibiendo en el controlador. El sistema de rutas de Symfony2 nos permite definir restricciones basadas en el tipo de petición http (GET o POST), también podemos codificarles restricciones propias, pero todo a su paso.
Plantillas de Twig
Por el momento no hay mucho que agregar, Symfony2 generará una vista de ejemplo en el directorio src/Example/ItemBundle/Resources/views/Default/index.html.twigCódigo :
Hello {{ name }}!
Aquí podemos ver cómo se imprimen variables en twig, {{name}}.
Por último deberíamos poder observar a nuestro bundle trabajando http://symfony.dev/app_dev.php/hello/world
Listo! ya tienes tu primer bundle configurado y trabajando, tomate tu tiempo y ve revisando cómo funciona siguiendo la explicaciones aquí dadas. En el próximo tutorial aprenderemos a definir nuestras entidades, exportarlas a la db y viceversa, además generaremos módulos cruds para nuestras tablas.
Hasta pronto.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Xabi el 16 de Diciembre de 2013
"Para tener composer de manera global movemos nuestro ejecutable a la carpeta /usr/bin con el siguiente comando:
Código :
sudo mv composer.par /usr/bin/composer"
Me dice: mv: no se puede hacer 'stat' sobre 'composer.par' : o sucho file or directory
Y los dos pasos anteriores los he echo bien, sin ningún problema. Que puedo estar haciendo mal?
Gracias,
Por metalvarez el 16 de Diciembre de 2013
-rw-r--r-- 1 metalvarez metalvarez 596480 dic 2 18:15 composer.par
Por ashrey el 17 de Diciembre de 2013
Por Jesus Marquez el 17 de Diciembre de 2013
Por metalvarez el 18 de Diciembre de 2013
Jesus Marquez-blog :
No entiendo muy bien tu pregunta así que de antemano me disculpo si no te soy de ayuda, con respecto a composer, si es como tu dices composer solo modificará los repositorios que estén configurados en el archivo composer.json, creo que a eso es a lo que te referías.
Por masterojitos el 18 de Diciembre de 2013
mv composer.phar /usr/bin/composer
Jesus Marquez, deberías poder solicitar que te den acceso a consola, ya que desde ahí se ejecutan todos los comandos, no veo otra forma
En cuanto a composer, este solo actualizara los bundles de terceros de los que estes dependiendo, comunmente alojados en la carpeta vendor
Alvarez, me gusta tu iniciativa de hablar de symfony... felicitaciones por ello... si tuviese tiempo haria yo tambien todo un manual de mis experiencias con el, pero como no es así, me quedo solo tratando de apoyar en lo mas posible a quienes pueda
P.D. Para que alguien pueda usar symfony de manera satisfactoria, creo que te falta dar mayor información, como detallar los pasos del virtual host, instalacion del apc, permisos en carpetas y configuracion en cache y logs, mmm entre tantos otros
Suerte a todos
Por César Cruz el 20 de Diciembre de 2013