Definición de Workflows en Symfony 5

El componente de Workflow proporciona utilidades para gestionar un flujo de trabajo o una máquina de estados.

Para instalar el componente de Workflow con Flex, hay que utilizar el siguiente comando:

> composer require symfony/workflow

Creación de un Workflow

Un Workflow es un proceso o un ciclo de vida a través del cual se mueven nuestros objetos. Cada paso, fase, estado, etc en el proceso se denomina place. Los objetos cambian de un place a otro mediante transitions.

Para definir un Workflow por tanto, es necesario definir:

  • places
  • transitions

Veamos un ejemplo de configuración de un workflow:

# config/packages/workflow.yaml

framework:
        workflows:
                solicitud_presupuesto:
                        type:'workflow'
                        marking_store:
                                type:'method'
                                property: 'status'
                        supports:
                                - App\Entity\AppRequest
                        places:
                                - pendiente
                                - aprobada
                                - rechazada
                        initial_marking: pendiente
                        transitions:
                                aprobar:
                                        from: pendiente
                                        to: aprobada
                                rechazar:
                                        from: pendiente
                                        to: rechazada

Este Workflow actuará sobre entidades App\Entity\AppRequesty utilizará la propiedad status para almacenar el place o los places de la entidad.

Si marking_store está definida como multiple_state, la entidad podrá estar en más de un place simultáneamente.

Si marking_store está definida como single_state, la entidad solamente podrá estar en un place simultáneamente.

Un ejemplo de entidad Articulo podría ser el siguiente:

/**
* Articulo
*
* @ORM\Table(name="articulo")}
* @ORM\Entity
*/

class Articulo
{
        /**
        * @var int
        *
        * @ORM\Column(name="id", type="integer", nullable=false)
        * @ORM\Id
        * @ORM\GeneratedValue(strategy="IDENTITY")
        */
        private $id;

        /**
        * @var string
        *
        * @ORM\Column(name="titulo", type="string", length=255,  nullable=false)
        */
        private $titulo;

        /**
        * @var string
        *
        * @ORM\Column(name="contenido", type="string", length=255,        nullable=false)
        */
        private $contenido;

        /**
        * Esta es la propiedad utilizada por el marking_store
        *
        * @var array
        *
        * @ORM\Column(type="json_array", nullable=true)
        */
        private $estado;
}

Si el workflow es single_state o state_machine, entonces la propiedad estado se definiría como string:

        ...
        /**
        * Esta es la propiedad utilizada por el marking_store
        *
        * @var string
        *
        * @ORM\Column(type="string", nullable=true)
        */
        private $estado;
        ...