Workflow, el nuevo componente de Symfony

Los componentes de Symfony son la base de aplicaciones PHP tan importantes como Drupal 8, Laravel, Symfony y la mayoría de CMS creados con PHP. En la actualidad existen 29 componentes que cubren muchas de las necesidades comunes de las aplicaciones web. A ellos se podrían sumar próximamente el nuevo componente Workflow.

Grégoire Pineau (conocido como @lyrixx en GitHub) acaba de enviar un pull request al repositorio de Symfony solicitando la inclusión de este nuevo componente: ver PR 11882.

Como es evidente a partir de su título, el objetivo del componente es crear flujos de trabajo mediante la definición de máquinas de estados finitos. Las máquinas de estados se utilizan para modelar el comportamiento de sistemas.

Una buena forma de entender el propósito de este componente es ver el ejemplo de código que han publicado:

use Symfony\Component\Workflow\Definition;
use Symfony\Component\Workflow\Transition;
use Symfony\Component\Workflow\Workflow;
 
// Aquí se define para la entidad "Foo" una máquina con 3 estados:
// nuevo, pendiente y completado
$fooDefinition = new Definition('Acme\\Bundle\\AcmeBundle\\Entity\\Foo');
$fooDefinition->addStates(array(
    'new', 'pending', 'finished'
));
 
// además de los estados, la clave de una máquina de estados consiste en
// definir las transiciones entre los diferentes estados:
// aquí se define una transición llamada "procesar" que cambia el estado
// de "nuevo" a "pendiente"
$fooDefinition->addTransition(new Transition('process', 'new', 'pending'));
 
// aquí se define una transición llamada "finalizar" que cambia el estado
// de "pendiente" a "completado"
$fooDefinition->addTransition(new Transition('finish', 'pending', 'finished'));
 
$dispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher();
 
// aquí se define un nuevo flujo de trabajo basado en esta máquina de estados
$workflow = new Workflow('foo', $fooDefinition, $dispatcher);
$workflow->setStateProperty('internalState');
 
// el estado inicial de la entidad es "nuevo"
$foo = new Foo();
$state = $workflow->getState($foor);
echo $state; // 'new'
 
// el método can() comprueba si podemos pasar la entidad a un determinado estado
if ($workflow->can($order, 'finish')) {
    // esta instrucción no se ejecuta, ya que no podemos pasar de
    // "nuevo" a "completado"
    $workflow->apply($order, 'finish');
}
 
// aplicamos la transición "procesar" a la entidad (el cambio de estado
// es automático)
$workflow->apply($order, 'process');
$state = $workflow->getState($foor);
echo $state; // 'pending'

Aunque ahora mismo este componente es muy básico, ya se utiliza con éxito en producción en algunas de las aplicaciones y servicios creados por SensioLabs, la empresa responsable de Symfony. La intención es hacer evolucionar este componente hasta llegar algún día a poder definir redes de Petri.

Si quieres aportar tu opinión sobre este componente, revisar su código, proponer ideas o mejoras o hacer cualquier pregunta, no dudes en añadir tus comentarios (en inglés) en el pull request 11882 de Symfony.

Comentarios

  1. Muy interesante. En paradigma tenemos un workflow propio para un sistema de intercambio de dinero, vamos a ver si este nuevo componente nos ayuda a simplificar el actual.

    Ariel Ferrandini el 8 de septiembre de 2014, 20:49:05

  2. Como comenta Antonio García en este tuit, lo de las máquinas de estado, ya sea bien hechas o en plan casero, es algo que tarde o temprano todas las aplicaciones empresariales necesitan para gestionar sus estados.

    En cualquier caso, todavía es pronto para saber si llegaremos a utilizar este componente :)

    Javier Eguiluz el 8 de septiembre de 2014, 20:54:15

  3. Interesante. En el campo de los videojuegos las máquinas de estado finitas se vienen usando desde hace tiempo, pero ahora estan siendo reemplazadas por Behavior Trees. Me pregunto si estos servirán igual de bien para aplicaciones empresariales.

    foo el 8 de septiembre de 2014, 23:33:49

  4. Recordemos al viejo, olvidado pero primerizo zetacomponents/Workflow de Sebastian Bergman.

    Este componente es un paso más. Ahora esperar BPMN para importar flujos de otros entornos y voilà.

    Antonio Garcia Marin el 9 de septiembre de 2014, 0:16:06

  5. En mi caso ando rumiando cómo sustituir phing para mis tareas de deployment. Tenía claro que quería dejar de lado el lenguaje xml, que en definitiva no es un lenguaje de programación y desarrollar los "jobs" en php. Lo que necesito en esencia es un workflow de tareas.

    Felix Pons el 9 de septiembre de 2014, 19:39:53

  6. Me parece excelente iniciativa.

    Gabriel Gallardo el 10 de septiembre de 2014, 21:04:00

  7. Excelente noticia. Por fin se incorpora una iniciativa para workflows. La vengo esperando hace mucho tiempo desde la época del ezWorkflow de ezComponents, que finalmente quedó en el olvido y con muy poca documentación.

    Espero con ansias que siga mejorando.

    Juan Ardissone el 11 de septiembre de 2014, 2:43:14

  8. Creo que hay que ir por el la do de BPMN. Ya hay mucho caminado por ahi y daria un sentido muy profesional a toda la comunidad

    Roberto German Puentes Diaz el 15 de septiembre de 2014, 16:26:50

Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente unos meses después de su publicación para asegurar que estos sigan siendo relevantes.

Publicada el

8 de septiembre de 2014

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.