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...

9 Responses

  1. Totalmente de acuerdo con la documentacion de Doctrine… y los de #doctrine que te mandan a leerla cada vez que haces una pregunta. Yo logre hacer una pequeña integracion entre ZF y Doctrine 2, y lo que me ayudo mucho fue haber entendido los conceptos de servicios y repositorios. En cualquier caso, si quieres puedes mirar lo que hice, tal vez te ayude,… o tal vez pienses que es una porqueria y tu me puedas ayudar a mi. Mi github

  2. juanfrasr says:

    Las annotaciones van geniales, en java las utlilizo mucho. Te facilita muchisimo la vida :).

  3. cordoval says:

    please no need to search and replace zf2
    do it in the way that is the sf2 way
    check http://www.craftitonline.com there is a post about zf2 integration I think if my memory does not fail.

  4. cordoval says:

    please no need to search and replace zf2
    do it in the way that is the sf2 way
    check http://www.craftitonline.com there is a post about zf2 integration I think if my memory does not fail.

    also I am waiting for your blog about pre and after execution controller actions…

  5. Ricard Clau says:

    @cordoval, I don’t know how ZF2 will deal with this, but if you’re using ZF1 libraries, and try to use Symfony2 UniversalClassLoader, you will notice that you get lots of errors because of the require_once lines that exist there to optimize autoloading process and thus bootstraping in Zend Framework.

    So, the only way to be able to use them without problems is to either comment all them (which is what this method does) or open them with your favorite Code Editor and replace the require_once ‘Zend/Whatever/Library.php’ by require_once ‘../vendor/zf/library/Zend/Whatever/Library.php’ (or the directory where they live). A third way would be to include Zend Framework directory in the include_path directive in php.ini.

    Moreover, you need to do this for require, require_once, include and include_once for all your Zend Framework files as there is still some inconsistence all around the framework.

    Regarding the pre and after execution actions post, stay tuned for this evening (CET time).

    Best regards!

  6. iruindegi says:

    Buenas!!
    Tengo un problemilla siguiendo los pasos que comentas. Necesito usar consumir un servicio web en soap (externo a mi empresa) y me han recomendado usar Zend_soap por lo que estoy intentando configurarlo en mi proyecto pero el comando me da el siguiente error:
    sed: illegal option — –
    usage: sed script [-Ealn] [-i extension] [file …]
    sed [-Ealn] [-i extension] [-e script] … [-f script_file] … [file …]

    (Estoy en un Mac). No sé si es debido a ello, pero cuando instancio el Zend_Soap_Client obtengo un error: Fatal error: Interface ‘Zend\Server\Client’ not found in /Users/gitek/www/hotel/vendor/zf/library/Zend/Soap/Client.php on line 38

    No se si me puedes echar un mano….
    gracias!

  7. iruindegi says:

    Avances… en Mac Os X hay que instalar gsed ( brew install gnu-sed ) y lanzar el comando del siguiente modo:
    find . -name ‘*.php’ -not -wholename ‘*/Loader/Autoloader.php’ -not -wholename ‘*/Application.php’ -print0 | xargs -0 gsed –regexp-extended –in-place ‘s/(require_once)/\/\/ \1/g’

    Aun y todo me sigue fallando y dando el mismo error. ¿Alguna idea? Gracias!!

  8. iruindegi says:

    Ains!
    solucionado! el problema era que estaba con el Zend Framework 2 y no el 1. Puedes borrar los comentarios si quieres 😉

  9. iruindegi He realizado el consumo de webservice con NUPSOAP, si te puedo ayudar en algo me avisas y te paso por email algunos ejemplos.