Primeros pasos con Symfony

"La potencia de Zend Framework con la simplicidad de CodeIgniter", esto es lo que diría si tuviera que describir Symfony en una sola frase, y es que (al menos con lo que he visto hasta el momento) Symfony es uno de los frameworks PHP más completos que he visto (equiparable a Zend) pero con una sintaxis y facilidad de uso similar a la de CodeIgniter, salvando el hecho del uso de consola para realizar muchas de las tareas.
Ir directo a: CakePHP | CodeIgniter | ZendFramework | Symfony
Llevo ya bastante tiempo metiéndome en el mundillo de los frameworks MVC para el desarrollo de aplicaciones web con PHP y la verdad es que la variedad de frameworks disponible es inmensa, es cierto que cada usuario tendrá unas preferencias, y que cada proyecto unas características y unas necesidades, por lo que decir que este o aquel framework es el mejor es algo arriesgado, y de eso ya hay muchas discusiones en internet, así que no voy a entrar a ello.
En este caso voy a comentar algunas de las impresiones que he tenido con los frameworks que he probado, que hasta la fecha han sido Cake PHP, CodeIgniter, Zend Framework, y ahora Symfony, sin duda cuatro de los frameworks PHP más utilizados. Muchos comentan, y ahí coincido, que para empezar a moverse entre frameworks PHP y el patrón MVC (Modelo, Vista, Controlador) lo mejor es empezar con CodeIgniter o CakePHP, y que si lo que queremos es algo más serio que nos permita hacer proyectos de mayor envergadura Zend Framework o Symfony.
CakePHP
Sobre Cake PHP, y antes de que nadie se me eche al cuello he de reconocer que este es el que menos he usado, he de decir que me parece un framework bastante sencillo, que permite realizar proyectos de pequeña envergadura de forma muy rápida siempre que sigamos las convenciones del framework como pueden ser nombres de clases o las tablas y campos en la base de datos. Si seguimos estas reglas el framework es capaz de generar gran parte del trabajo por nosotros y éste es sin duda uno de los puntos fuertes del mismo, además de la enorme cantidad de usuarios que tiene detrás, con su consiguiente documentación y comentarios en foros.
Este punto que aparece entre las mayores ventajas, es el que quizás también pondría como contra, ya que si nos olvidamos de esas convenciones porque deseamos algo más personalizado o porque el proyecto es bastante grande y esas convenciones no acaban de servir para nuestro propósito, las automatizaciones se pierden por completo, y el desarrollo (a mi parecer) se hace bastante complejo.
CodeIgniter
Sin duda otro gran framework, al contrario que con Cake, no está ligado a unas convenciones que nos ayuden a generar código de forma automática ya que su propósito no es el de proporcionar un framework completo con el que poder construir aplicaciones enteras a base de unir unos cuantos módulos, sino más bien el de proporcionar una base estable y fácilmente configurable sobre el que construir tú mismo la aplicación.
Tiene una sintaxis sencilla, y su estructura es bastante fácil de entender, quizás por el hecho de que se se basa en objetos para implementar la lógica de modelos y controladores, pero no nos lleva al extremo de que todo sean objetos, hace una mezcla bastante interesante de lo que es la programación orientada a objetos con el modelo procedimental, lo que hace que se parezca bastante al modelo al que la mayoría estamos acostumbrados.
Esto es uno de los puntos que más me ha gustado ya que te permite organizar la aplicación a tu aire, la estructura de directorios y ficheros es clara y se puede cambiar fácilmente, haciendo que sea posible agrupar varios controladores bajo un esquema mayor, tipo módulo (que no modelo), de forma bastante sencilla.
Al contario de lo que dicen algunos, sí soporta PHP5, y sí saca partido a las características de esta versión del lenguaje, ya que una de las primeras cosas que hace es cargar el gestor principal para PHP4 o PHP5 dependiendo de la versión que tengamos en el servidor. No se trata de ejecutar código para PHP4 en PHP5, desperdiciando o desaprovechando sus características si no que podríamos decir que el framework se encuentra disponible para ambas versiones (aunque bajo el mismo paquete) y se ejecuta una u otra dependiendo del entorno.
Como contra quizás pondría que el desarrollo está un poco parado, y muchas veces es necesario recurrir a soluciones planteadas por la comunidad para cosas tan comunes como tener un layout (así se llama este aspecto en Zend y en Symfony) común en todo el sitio. Soluciones como incluir un header.php, footer.php y similares en cada plantilla no son nada elegantes (ni sostenibles), 'hackear' el controlador principal para que haga esta tarea automáticamente puede servir, utilizar 'librerías' creadas por los usuarios podría ser otra opción y de hecho en los foros hay multitud de formas de hacerlo, unas mejores y otras peores, pero como digo, creo que cosas como estas deberían estar reflejadas en el framework base.
Zend Framework
Extenso, muy extenso, la cantidad de funcionalidades que ofrece Zend Framework por defecto es increíble, tenemos clases para casi todo y la documentación es excepcional, al menos la versión en inglés, el resto parece que están en manos de la comunidad y algunas (por ejemplo español) dejan bastante que desear.
Es un framework de corte profesional completamente orientado objetos, con clases que intentan contemplar cualquier posibilidad de conexión con el resto de elementos del framework, algo que por un lado permite muchísima flexibilidad, pero que por otro hace que la curva de aprendizaje sea bastante elevada, encontrándonos a menudo con varias llamadas a clases y subclases para hacer cosas que se podrían conseguir de forma más directa. No está mal, porque tampoco te prohíbe utilizar esas formas más simples, pero siempre acabas pensando "si el framework ofrece esto otro que puede ser más flexible y me puede llevar a actualizaciones futuras más rápidas voy a intentar usarlo".
La velocidad de desarrollo del proyecto, que en el framework anterior podría considerarse un problema por ser demasiado lenta, podría considerarse un problema también en Zend, pero esta vez por todo lo contrario. Las actualizaciones del framework son muy frecuentes, estaréis pensando ¿dónde está el problema?, pues bien, el problema es que las actualizaciones no se limitan solo a añadir funcionalidades, librerías o controladores (que también) sino que a veces los cambios afectan a la forma de organizar un proyecto, a los métodos para conectar controladores con los modelos que utilizan, o a los métodos que utilizan estos modelos para comunicarse con el sistema de almacenamiento final (bases de datos principalmente).
Esto hace que de una versión a otra tu proyecto haya quedado 'obsoleto' o que no pueda utilizar nuevas funcionalidades porque no se adapta a la nueva forma de organizar las cosas, es como si los desarrolladores andaran en busca del "framework perfecto" y cada cierto tiempo dieran marcha atrás para probar otra estructura que les parece mejor, como cuando te encuentras ante un proyecto nuevo y te paras a pensar cómo lo organizas y gestionas, pero a gran escala.
Personalmente tuve la ocasión de empezar un pequeño proyecto usando la versión 1.5 (hará ya año y medio), y tras acabarlo lo dejé un poco apartado, cuando lo retomé para añadirle cosillas ya iban por la versión 1.9 y los cambios en el framework eran brutales, tanto que las varias veces que me he sentado a ello me ha parecido que la mejor forma de continuarlo es reescribirlo entero. Estaba pensando que a ver si sacan la versión 2 y se estabiliza un poco la cosa, pero veo que ya está disponible la 1.10 rc1 y me da miedo mirar los cambios.
Symfony
Iba a ser el framework sobre el que tratar en este artículo y al final me he enrollado tanto explicando los otros que creo que este va a ser del que menos hable, igual debería cambiar el título del artículo ¿no?.
Primero decir que acabo de empezar a estudiar este framework, pero las primeras impresiones son muy, muy buenas. Había leído en varios sitios que es un framework profesional y una buena alternativa a Zend, y la verdad es que de momento coincido completamente con esos comentarios.
Ya en la página principal del proyecto nos encontramos un enlace a Jobeet, una aplicación real creada con Symfony y cuya creación nos explican en un completo tutorial paso a paso. Esto, que a muchos les puede parecer una tontería, a mi me ha parecido un acierto total ya que permite ver el flujo de trabajo de Symfony desde el principio hasta el final de un proyecto, y no se limita (como ocurre con otras documentaciones) a mostrarnos pequeñas partes del código, ni a dejarnos 'con la miel en los labios' con cosas como 'esto lo puedes conseguir utilizando las funciones de la clase blabla', y ale, búscate la vida.
Este tutorial comienza con una pequeña introducción al paradigma MVC y la propia naturaleza del proyecto (el objetivo que se persigue en la web), y continúa con los pasos iniciales como son la organización del proyecto, creación de su estructura o planificación de los modelos y sus correspondientes tablas en la base de datos, y pasa por aspectos como la seguridad o la creación del panel de gestión (algo común en este tipo de tutoriales), pero también por aspectos no tan comunes, como aprovechar la funcionalidad de Symfony para definir diferentes entornos de ejecución (desarollo, pruebas y producción por ejemplo), realizar pruebas con tests unitarios, crear web services o internacionalizar/localizar el sitio entre otros.
Con apenas seis capítulos del tutorial y un vistazo rápido al resto ya se puede ver la potencia que ofrece, la sintaxis sencilla, muy similar a la de CodeIgniter y ni de lejos tan enrevesada como la de Zend, la capacidad de utilizar el layout (que se echaba de menos en CodeIgniter) de forma sencilla y añadiéndole bloques, el potente enrutador para generar y personalizar las URL's amigables (bastante similar en funcionalidad al de Zend), la sencilla separación entre frontend y backend o el uso de ORMs (Object Relational Mapper) como Doctrine o Propel.
Doctrine y Propel son probablemente los ORM más utilizados y su objetivo es el de mapear una descripción de una base de datos relacional con una serie de clases para gestionarla. La forma de usarlos (a grandes rasgos, también estoy empezando en esto) consiste en definir la estructura de nuestros objetos y relaciones en uno (o varios) archivos de texto, de forma que Propel o Doctrine nos generan tanto las consultas SQL para generarlas las tablas (soportando varios gestores) como las clases PHP para acceder a ellas de forma sencilla.
La documentación de Symfony también es excelente y actualizada (disponible en papel o en PDF) y la comunidad de usuarios parece que es bastante activa pudiendo encontrar blogs, foros, wikis o listas de correo desde la propia página de la comunidad.
De momento voy a seguir investigando (primero me acabaré el tutorial) de este framework, y trataré de ir explicando los nuevos avances y/o descubrimientos que vaya haciendo. Como siempre, no dudéis en dejar comentarios ;)
- Etiquetas:

