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