Una semana con Symfony2 – Qué gozada! – Integración con librerías de Zend FW

Como habéis podido leer en anteriores posts y en el about-me del blog recientemente he cambiado de trabajo, dejando Privalia por Ulabox, una nueva startup que pretende cambiar cómo compramos los artículos del hogar.

La verdad es que la primera semana ha ido muy bien, los compañeros genial y personalmente, lo que más me motiva del nuevo puesto de trabajo es que está todo por hacer, y por tanto no hay legacy code, deuda técnica y todas estas cosas que tanto miedo dan en las empresas con cierta antigüedad y que han crecido descontroladamente.

Y una de mis apuestas personales ha sido empezar el nuevo backoffice con Symfony2, pese a que aún estamos en fase de Release Candidate (aunque ya quisieran muchos frameworks ser la mitad de estables, robustos, testeados y documentados que Symfony2).

Y la verdad es que las impresiones de esta primera semana no han podido ser más positivas.

– La barra de debug en entornos de devel y test es extremadamente útil. Es cierto que ya existe en las últimas versiones de Symfony, pero nunca había tenido el placer de hacer un proyecto con él, más allá del Jobeet y algunas pruebas personales en casa.

– El sistema de cacheo es espectacular. El bootstrap del framework es sencillamente rapdísimo. Y si lo ponemos con settings de producción vemos que puede aguantar perfectamente frontales e-commerce con gran carga. Bien es cierto que tenemos que añadir un paso en nuestro sistema de deploy para limpiar este cache, pero actualmente ya es normal limpiar caches de Smarty, CDNs (si usamos), etc…

El concepto ‘bundle’ es muy interesante de cara a poder hacer módulos reaprovechables en múltiples proyectos (ayuda mucho a esto el concepto Git Modules) y a integrar librerías de terceros.

– El UniversalClassLoader permite trabajar con librerías 100% PHP5.3 pero también es compatible con las librerías con ClassName PEAR Convention (como por ejemplo las de Zend Framework, que muchas no tienen aún equivalente en Symfony2)

– El sistema de annotations me encanta. Solamente las había usado con PHPUnit, pero en Symfony las podemos usar para sustituir las configuraciones en YAML o XML. Es muy cómodo y robusto. Además, podemos pensar que ralentiza las operaciones, pero el sistema de cacheado detecta cambios y rápidamente cachea la configuración de annotations en clases de PHP.

Doctrine2.1 y sus annotations. Aquí me ha costado un poco más, pues ya había un modelo existente que he tenido que adpatar un poquito para ser 100% Doctrine compliant. También debo decir que para mí la documentación de Doctrine es poco clara y no es que haya demasiados buenos ejemplos por Internet. Al final, de todas maneras, he conseguido tener bien el setup y hacer formularios algo complejos.

Twig como sistema de plantillas. Bastante fácil y rápido. Es un buen candidato a acabar sustituyendo a nuestro viejo compañero de fatigas Smarty. Además, combinado con assetic y otros bundles para, por ejemplo, redimensionar imágenes, nos permite cuidar también la parte de front-end desde el framework.

Tengo pendiente aún probar muchas cosas.
No he empezado a integrar PHPUnit y Behat (que es el sistema de testeo funcional que tenemos en Ulabox), sigue habiendo partes algo oscuras para mí, y seguramente tendré que hacer Bundles varios para integrarme con otras aplicaciones (ERP, Sistema atención al cliente, CDN si acabamos usándolo).

Pero al final las primeras impresiones son importantes y en mi caso no han podido ser mejores. La verdad es que Symfony2 a primera vista parece algo hostil y si no estamos muy familiarizados con los namespaces y las annotations puede echarnos un poco para atrás, pero ya existe mucha documentación para empezar a trabajar y la verdad es que la curva de aprendizaje no es tampoco tan tan alta como pueda parecer. Lógicamente, llegar a realmente dominar el framework será complicado, pero eso sucede en todos.

Para terminar, os dejo por aquí un mini-tutorial para integrar librerías de Zend Framework, que seguro que alguno lo encuentra extremadamente útil. En mi caso he importado todas las librerías de Server y Client para tratar y generar Web Services, sean SOAP, JSON-RPC, REST, etc…

Pasos para integrar librerías de Zend Framework

1. Creamos la carpeta zf/library dentro de la carpeta app/vendor de Symfony2
2. Copiaremos ahí dentro todas las librerías de Zend Framework que necesitemos (ojo que a veces será necesario importar alguna librería base extra como Zend_Exception, ya que todas las Exceptions extienden de ella)
3. En el archivo app/autoload.php, modificaremos la parte de registerPrefixes (destinada a ayudarnos con la carga de librerías hechas en PHP5.2) de la siguiente manera:

<?php
   $loader->registerPrefixes(array(
       ...
       'Zend_' => __DIR__.'/../vendor/zf/library',
   ));
?>

4. Con esto ya estaría, pero las librerías de Zend FW tienen algunos require de librerías base para optimizar que ya no necesitaremos en Symfony2. Puede parece un coñazo entrar a borrar todas, pero por suerte, está documentada en la documentación oficial una solución a ello.


$ cd vendor/zf/library
$ find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
-not -wholename '*/Application.php' -print0 | \
xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'

Y ahora sí, en cualquier parte del framework, podremos hacer por ejemplo:

<?php
$zf = new \Zend_Soap_Client();
$zf -> getFunctions();
?>

Y si lo hemos hecho todo bien veremos que nos salta una Zend_Soap_Client_Exception diciendo que no hemos cargado ningún WSDL. Pero todo bajo el kernel de Symfony2.

Me marcho dos semanas de vacaciones y no podré actualizar, pero próximamente más posts sobre Symfony2!

You may also like...