Sylius, un framework para e-commerce en PHP

Carlos Revillo
The Cocktail Engineering
7 min readJul 13, 2017

--

Imagen de Michal Chyrek

Cuando un cliente necesita implantar un e-commerce los equipos de desarrollo tratan de identificar cuál puede ser la mejor solución para la necesidad específica en el caso de este cliente. Esta necesidad puede pasar por construir una nueva solución de e-commerce desde cero o, por qué no, por añadir funcionalidades de e-commerce a una aplicación ya existente.

En el mundo PHP han sido varios los productos que se han desarrollado para ayudar en la construcción de estas soluciones. Estas soluciones se presentan como soluciones completas o bien como plugins instalables en otras soluciones también integrales.

Por ejemplo, WooCommerce ha sido implantado con éxito en muchas aplicaciones escritas con Wordpress. Pero volviendo a la preguntas de arriba, si estuviéramos empezando una nueva aplicación, deberíamos depender de Wordpress para luego añadir WooCommerce. Si por el contrario la aplicación ya estuviera construida y el ecommerce fuera un añadido, para poder usar WooCommerce tendríamos que adaptar todos nuestros modelos a Wordpress.

Caso similar es el de Drupal Commerce. Es una buena herramienta que depende de Drupal para trabajar. Este requisito impide pensar en Drupal Commerce como una solución a añadir a nada que no sea Drupal.
En este caso, y debido a los cambios en los cores de drupal entre versión y versión, si estuvieras con Drupal Commerce y Drupal 7, plantearse una migración a Drupal 8 tampoco parece la mejor idea mientras este módulo este lo suficientemente estable para esa versión.

En cuanto a soluciones completas destacan Prestashop y a Magento. Ambas son excelentes recursos pero, según mi experiencia y, sobre todo en el caso de Magento, son demasiado grandes para las necesidades concretas de algunos clientes. Por ejemplo, ¿por qué nuestra aplicación ha de tener los productos categorizados si nuestro cliente no quiere categorizar dichos productos ya que vende un número muy limitado de ellos?
De igual forma, si nuestra interfaz administrativa ya estuviera construida, tener que añadir otra interfaz para gestionar los productos de Magento no parece tampoco la mejor idea o al menos no parece algo tan sencillo como un plug and play.

Sylius al rescate

Una de los frameworks más interesantes de los aparecidos en los últimos tiempos es Sylius. En el año 2011, Paweł Jędrzejewski publicó una serie de componentes centrados en el e-commerce. Con estos componentes, él y otros muchos contribuidores comenzaron a desarrollar una plataforma a finales del año 2013. El proyecto comenzo a ganar adeptos y Paweł se pasó por Madrid para presentarlo en la SymfonyCon celebrada en 2014. La charla tuvo lugar poco después de que también se presentase Elcodi, otro interesante proyecto desafortunadamente abandonado.

Pese a la buena acogida que estaba teniendo Sylius, Paweł y su equipo no estaban del todo contentos con el resultado. Finalizando el año 2015 comenzaron una re-escritura del núcleo de la aplicación, re-escritura que continúa en estos días y que culminará con la publicación de la versión 1.0.

Aún así, el hecho de que el producto se encuentre todavía en estado Beta, no ha impedido que varias compañías hayan decidido ponerlo en producción.

A simple vista podemos pensar que Sylius no es más que otra solución de e-commerce escrita en PHP que tiene los mismos problemas citados para el caso de Magento con el agravante de que no dispone de tantas funcionalidades “out of the box”. Una visita a su demo así parece indicarlo.

Sin embargo, si bien Sylius puede usarse como solución completa tal y como estamos haciendo estos meses en The Cocktail, lo verdaderamente interesante es cómo está construida esta herramienta.

Sylius se basa en una serie de componentes, todos ellos desacoplados entre sí y que, para desarrollar la solución completa, han sido usados a través de bundles de Symfony.

Las dos palabras claves aquí son componentes y desacoplados. Esto quiere decir que si bien los creadores de Sylius han elegido Symfony para hacer uso de ellos, cada persona puede utilizar esos mismos componentes con cualquier otro framework de PHP o incluso sin framework alguno. Ésta es otra de las ventajas con respecto a las otras soluciones. Magento necesitaba Zend y ahora Symfony para funcionar. En el caso de Sylius no estamos limitados en cuanto a elección de framework, ORM o cualquier otro tipo de componente que queramos usar.

Con el fin de probar la flexibilidad de Sylius he pensado en crear desde cero un e-commerce que no dependerá de ningún framework ni ORM. El código de estos experimentos lo podéis encontrar en Github. En el código veréis un buen puñado de “WTF codes”, pero la idea principal de este ejercicio es mostrar cómo Sylius puede ayudarnos en la construcción de un e-commerce con PHP.

Productos

Cualquier e-commerce vende productos, los cuales pueden ser digitales, físicos, compuestos, etc. para ayudarnos con la construcción de nuestros productos, Sylius nos ofrece una clase como posible punto de partida. En el repositorio de Github veréis unos cuantos modelos más que también podríamos utilizar simplemente instalando ese componente vía composer. Pero de momento nuestra tienda es un tanto cutre. Nuestros productos no tienen ni atributos, ni opciones, ni variantes… pero es que no los necesitamos.

Para crear nuestro modelo de producto extendemos de esa clase y añadimos una propiedad donde guardaremos el “precio” del producto. Entrecomillamos “precio” porque de momento no vamos a utilizar moneda. Tampoco lo necesitamos.

Nuestra clase Product no tiene gran cosa. Añade esa propiedad price, un getter y un setter para la misma y un constructor para setear alguna otra propiedad de nuestro producto, entre ellas una traducción. (lo que indica que sylius está también preparado para multiidioma…)

de

Una vez tenemos el modelo de productos podemos construir nuestro catálogo. Para eso, en uno de esos wtf que veréis en el repositorio, existe creado una clase Catalog que se inicializa con 3 instancias de nuestro modelo Product. Este catálogo lo inicializaremos en cada request, algo que no tiene sentido alguno. Para lo que sí sirve es para demostrar que esos “productos” pueden ser cualquier cosa. Pueden extender del modelo de Sylius o pueden ser objetos obtenidos desde una tabla de una base de datos. Pueden incluso ser nodos de Drupal o post de Wordpress. En definitiva, puedes usar este componente con cualquiera que sea tu aplicación.
De igual forma, para persistirlos puedes decidir trabajar con MySQL o hacerlo con Oracle. Usar Doctrine o escribir SQL puro y duro.
En nuestro caso no estamos usando base de datos y ya tenemos un catálogo disponible, cuya información podemos obtener y mandársela a nuestras plantillas de Twig y presentar un listado de productos similar a éste:

El componente Order

Es difícil ver una herramienta de e-commerce que no tenga carrito de compra o que al menos no guarde de algún modo aquello que el usuario decida comprar antes de empezar el proceso de checkout. Para manejar esto Sylius nos ofrece el componente Order también muy sencillo de usar.
Las Order de Sylius lo único que necesitan es que les pases instancias de OrderItem. Ese OrderItem normalmente tendrá relación con un producto, pero lo bueno de Sylius es que no tienen por qué. Lo que sí tendrán será un precio y una serie de unidades, las cuales pueden tener “ajustes” (hola, promoción del 2x1). En función de esos datos, el componente será capaz de calcular el precio total del pedido.

o

De nuevo lo interesante aquí es hacer notar que nuestras órdenes no tienen aplicación de impuestos o gestión de gastos de envío. No tenemos ninguna necesidad de preocuparnos de desactivar métodos de envío que nos pueda dar Magento, por decir algo. Lo bueno es que Sylius también nos ofrece componentes para eso, los cuales podremos añadir en el momento en el que los necesitemos.

En nuestro caso, los OrderItem sí guardan una relación con el producto que estamos añadiendo a cesta, pero, reitero, no es obligatorio. Los OrderItem podrían ser cualquier otra cosa.

Para trabajar con la cesta tenemos un pequeño CartManager que leerá y escribirá una variable de sesión. Como en el caso del catálogo, esto es algo que no tiene mucho sentido, pero que debe servir para demostrar la flexibilidad que ofrecen los componentes de Sylius.

Un archivo cart.php recibirá peticiones POST desde el propio carrito y en función del botón usado se encargará de actualizar el carrito. Además, lo obtendrá de la sesión y lo pasará a la plantilla.

Tenemos nuestro carrito funcionando usando dos componentes de Sylius y sin necesidad de haber usado ningún framework o solución predefinida.

Conclusión

Para desarrollar un e-commerce solemos usar soluciones integrales o bien desarrollarlo todo ad-hoc. Sylius ofrece una serie de componentes que pueden servir como punto intermedio de ambas opciones. La flexibilidad que ofrecen sus componentes invita a pensar en él tanto para el desarrollo de nuevos proyectos como para añadir funcionalidades e-commerce a proyectos ya desarrollados sin importar con qué herramienta o framework hayan sido construidos.

--

--