Noticias

Introducción al Proyecto Sonata

En los inicios de Symfony, sin duda, uno de los componentes más apreciados por la comunidad era su generador de backend. Con unos cuantos comandos y alguna configuración, podíamos saltarnos la parte tediosa de generación del mantenimiento de las entidades de la aplicación. Aún con sus problemas y limitaciones, esta siempre ha sido una característica que hizo a muchos decantarse por este framework. El tiempo pasó y llegó la nueva versión del framework, Symfony2, y entre todas las novedades y características nuevas, pues no estaba nuestro querido admin generator. Enseguida comenzaron a aparecer algunas propuestas, entre ellas la que hoy nos ocupa, el proyecto Sonata iniciado por Thomas Rabaix.


Entre todos sus bundles sin duda el más conocido, por el cual comenzaron su proyecto y ganó más notoriedad es el AdminBundle. Hoy en día con más de 3 años de existencia, con más de 400 contribuidores es uno de los bundles más reconocidos y utilizados del ecosistema Symfony, siendo el el bundle más descargado sólo por detrás del gestor de usuarios FosUserBundle.

Pero el objetivo inicial de Sonata no ha sido ni es, el de instalarse en el espacio que antes ocupaba el generador de Symfony1, su proyecto consiste en la generación de distintos bundles para desarrollar comercios electrónicos y ya cuentan con más de 20 bundles para ello.

En el artículo de hoy, vamos a hacer un recorrido por algunos de los componentes más importantes del proyecto con una breve explicación de cada uno. En este primer acercamiento vamos a ver componentes más relacionados con la generación de backend, en entregas posteriores haremos una introducción más profunda a cada uno de los componentes de manera que podamos sacar partido a las funcionalidades que nos aportan.
 

El proyecto Sonata es un conjunto de más de 20 bundles, construidos con el framework de    desarrollo web Symfony2. Su objectivo: crear una serie de componentes/bundles para generar comercios electrónicos.

 

 AdminBundle


SonataAdminBundle permite generar de forma rápida un backend para gestionar nuestras entidades. Una vez configurado, nos permitirá realizar operaciones básicas sobre la misma como el alta, borrado y edición, además de otras como filtrado, búsqueda y exportación a diferentes formatos.

A diferencia de otros proyectos hace una aproximación basada en servicios, para la generación del backend. Para cada una de las entidades controladas por el bundle, debemos crear un servicio en el que básicamente se indica la entidad a administrar y la clase que se encargará de informar al bundle de los campos a gestionar, filtros a habilitar, etc. La decisión de basar la configuración en servicios junto con la facilidad de sobreescribir el bundle con nuestros controladores y plantillas le otorga una gran flexibilidad, ya que resulta muy sencillo inyectar dependencias o modificar plantillas de forma global o para una entidad en concreto.

El bundle integra la seguridad de Symfony2, agregando una gestión de roles propia que permite definir controles basados en grupos y permitiendo determinar permisos de listado, visualización, creación, edición, borrado y exportación por entidad. Además permite de forma sencilla la integración de opciones más avanzadas como los voters. Por supuesto se integra de forma transparente con el que prácticamente se podría considerar como bundle estándar de gestión de usuario FosUserBundle.


 MediaBundle


Con este bundle gestionaremos la parte multimedia de nuestra aplicación. Permite centralizar la carga de contenidos y abstraer la forma en que se muestran estos en el frontend. La gestión se realiza mediante providers, que vendría a representar un tipo de contenido, bien un fichero, una imagen o un video de youtube. SonataMedia cuenta con varios providers: para la gestión de imágenes, ficheros, videos de youtube, vimeo, etc. También en la documentación nos indica ejemplos de como agregar nuevos si fuera necesario.

Para resolver los distintos formatos en que queremos que una entidad multimedia esté disponible, SonataMediaBundle introduce el concepto de contexto. Un contexto agrupa providers y formatos, estos últimos indican datos como tamaño y calidad. La idea final es que podamos asociar nuestra entidad a un contexto para filtrar los tipos de providers que se puede utilizar y los formatos que se generarán cuando sea creada. En ocasiones este funcionamiento puede no ser óptimo o suficiente, si es tu caso SonataMedia se integra con el magnífico bundle LiipImagineBundle que permite aplicar múltiples filtros adicionales sobre los contenidos multimedia.

Para el manejo centralizado de los contenidos multimedia, el MediaBundle nos provee de una galería de gestión centralizada. La galería por defecto nos permite las operaciones básicas sobre la entidad, así como otro tipo de operaciones más avanzadas de retoque a través del servicio pixlr.

A la hora de enlazar contenido multimedia a otras entidades, SonataMedia provee de tipos de formulario específico, estos controles permiten cargar contenido multimedia nuevo o bien cargar uno de la galería centralizada. Hoy en día es normal utilizar algún plugin tipo ckEditor para permitir al usuario modificar los estilos sobre el contenido que está creando, en esta línea en la documentación de Sonata encontramos información para integrar ckEditor de manera que cargue las imágenes directamente desde la galería centralizada.
 

 PageBundle && BlockBundle


En el transcurso del desarrollo de un site, es muy habitual el tener secciones que deben ser administrables, pero cuya estructura difiere completamente. Para poder manejar este tipo de secciones heterogéneas de una forma homogénea hay distintos acercamientos. Sonata opta por la gestión vía bloques.

Un bloque viene a ser cada uno de estos fragmentos de contenido reutilizables que podemos necesitar en la creación de nuestras páginas, así bien, tendríamos un bloque especializado en mostrar texto, otro para mostrar un slidder, otro para mostrar los últimos tweets y así hasta disponer de tantos bloques como tipos de contenidos necesitemos. Cada uno de estos bloques puede recibir parámetros de manera que podamos adecuar su presentación al contexto desde donde lo llamamos.

Para agrupar estos bloques y conformar una página final utilizaremos el PageBundle. Esta entidad actua como contenedor de bloques. Para ello tenemos que asociar a cada tipología de página los bloques necesarios hasta conformar la estructura deseada. Al final, tendremos tantas páginas como tipologías de secciones tengamos.

El concepto de generación de páginas mediante bloques es muy potente y muchos proyectos modernos lo están implementando.


Algunos carencias del proyecto.

Pese a todas las bondades del proyecto, este todavía tiene algunas carencias que hay que señalar. Principalmente es la falta de gestión de múltiples idiomas, hoy en día es imprescindible contar con un sistema de este tipo y debe controlar al menos dos aspectos:

  • Traducción de uno a x idiomas.

  • Gestión de slugs multiidioma para la generación adecuada de url's amigables.

Cierta lentitud en la resolución de bugs e integración de pull request de la comunidad.

Quejas sobre la instalación del proyecto: a veces la documentación y el código no van a la par y es más costoso de lo que debiera tener el proyecto en funcionamiento.

A mi juicio, ninguna de estas carencias es motivo para no utilizar el proyecto, y adaptarlo a nuestras necesidades.


Alternativas al proyecto Sonata

En el transcurso del tiempo han ido surgiendo distintas alternativas ofreciendo bundles de alta calidad para la generación semiautomática de backends además de otros componentes para crear un cms a nuestra media, algunos proyectos que me parecen especialmente interesantes son:

  • AdminGeneratorBundle: es un proyecto que intenta recuperar la visión del antiguo generador de backend de Symfony1, permitiendo generar un backend completo a partir de ficheros yml. Algunas de sus ventajas respecto a SonataAdmin es su soporte integrado para la gestión de idiomas y una menor curva de aprendizaje.
  • KunstmaanBundlesCMS:  este proyecto integra una serie de bundles para construir un cms completo. Con gestión de traducciones y multimedia es una opción a valorar frente al proyecto Sonata. Con claros paralelismos en muchos de sus componentes es un proyecto interesante a estudiar. Puedes probar una demo en: http://bundles.kunstmaan.be
  • PrestaCMS: basado en SymfonyCMF para gestionar la persistencia y el proyecto Sonata para la generación del backend. Visita una demo en: http://sandbox.prestacms.com
  • Elcodi: conjunto de componentes para crear nuestro comercio electrónico.


Conclusiones

Hoy en día, no tiene sentido partir de cero cuando afrontamos nuevos proyectos. Es importante que funcionalidades básicas como gestión básica de entidades, gestión multimedia o gestión de seguridad estén ya resueltas. Proyectos como Sonata nos permiten resolver estos problemas de una manera elegante y rápida, permitiendo que nos concentremos en resolver la problemática del proyecto a desarrollar y aquellos aspectos que le aportan más valor al cliente.

El proyecto cuenta con un importante apoyo de la comunidad, es estable y flexible para poder adaptarse a nuestras necesidades por lo que es un buen punto de partida para cualquier de nuestros proyectos.

Hemos realizado una introducción al proyecto Sonata, hemos visto sus principales ventajas y algunos de sus inconvenientes. También hemos datos un repaso por algunos de sus principales bundles, en próximas entregas veremos con más detalles estos bundles y veremos como utlilzarlos en proyectos reales. Si no te lo quieres perder sígueme en twitter para estar al tanto.


Enlaces de interés

Web del proyecto Sonata: http://sonata-project.org/

Documentación del proyecto Sonata: http://sonata-project.org/bundles/

Demo proyecto Sonata: http://demo.sonata-project.org/


 


Symfony2 php Sonata Project CMS


Compartir mola!!