Nuevo en Symfony 4.3: Mejoras en el componente Workflow
Symfony 4.3 ha mejorado el componente Workflow con pequeñas y grandes mejoras. En este artículo te contamos las más importantes.
Añadido el contexto al método Workflow::apply()
Cuando se aplica una transición, ahora puedes pasar como tercer argumento opcional un array con información de contexto (por ejemplo, el usuario que realiza la transición o la fecha actual):
$workflow->apply($article, $request->request->get('transition'), [ 'time' => date('y-m-d H:i:s'), ]);
Si utilizas esta nueva funcionalidad, no olvides actualizar tu entidad u objeto asociado al workflow:
class Article { - public function setMarking($marking) + public function setMarking($marking, $context = [])
Además, actualiza la configuración del workflow para usar MethodMarkingStore
:
framework: workflows: article: type: workflow marking_store: - type: multiple_state + type: method
Esta funcionalidad fue contribuida por Grégoire Pineau en el pull request #29146.
Posibilidad de modificar el contexto en un listener
Tener que pasar a mano el contexto cada vez que llamas a ->apply()
es bastante
aburrido y genera código duplicado. Por eso ahora es posible usar un listener
que pase el contexto automáticamente:
class TransitionEventSubscriber implements EventSubscriberInterface { private $tokenStorage; public function __construct(TokenStorageInterface $tokenStorage) { $this->tokenStorage = $tokenStorage; } public function onWorkflowArticleTransition(TransitionEvent $event) { $context = $event->getContext(); $token = $this->tokenStorage->getToken(); if ($token instanceof TokenInterface) { $user = $token->getUser(); if ($user instanceof UserInterface) { $context['user'] = $user->getUsername(); } } $event->setContext($context); } public static function getSubscribedEvents() { return [ TransitionEvent::class => 'onWorkflowArticleTransition', ]; } }
Esta funcionalidad fue contribuida por Grégoire Pineau en el pull request #30902.
Coloreado de workflows
La nueva opción dump_style
permite definir el diseño de los elementos del
workflow al exportarlo a una imagen SVG o PNG:
transitions: submit: from: start to: travis metadata: title: transition submit title dump_style: label: 'My custom label' arrow_color: '#0088FF' label_color: 'Red'
Este es el aspecto que tendría el workflow del ejemplo:
Esta funcionalidad fue contribuida por Alexis Lefebvre en el pull request #29538.
Posibilidad de configurar múltiples estados iniciales
Al contrario que en las máquinas de estados, en un workflow es posible que el sujeto se encuentre en varios lugares a la vez. Por eso ahora el componente Workflow permite configurar más de un estado inicial:
workflows: article: type: workflow initial_marking: [foo, bar] places: [foo, bar, a, b, c, d]
Esta funcionalidad fue contribuida por Grégoire Pineau en los pull requests #30468 y #30890.
Configuración más sencilla
A partir de Symfony 4.3, si el sujeto solo puede estar en un estado, debes
utilizar una máquina de estados en vez de un workflow. Además, en ese caso
la propiedad (llamada marking
por defecto) es una cadena de texto. Si el
sujeto puede estar en varios estados a la vez, usa un workflow y la propiedad
marking
será un array en ese caso.
Gracias a esta simplificación, se ha mejorado el DX (developer experience):
framework: workflows: article: type: workflow marking_store: type: method # This will be the default value in Symfony 5.0 property: marking # This is the default value, it could be omitted task: type: state_machine marking_store: type: method # This will be the default value in Symfony 5.0 property: state
Esta funcionalidad fue contribuida por Grégoire Pineau en los pull requests #30551 y #30890.
Añadida la función workflow_transition_blockers()
de Twig
En Symfony 4.1 se añadió una funcionalidad para saber por qué una transición determinada se había bloqueado. En Symfony 4.3 hemos añadido una función de Twig para poder generar fácilmente una lista con todos los bloqueos:
<h2>No es posible publicarlo por los siguientes motivos:</h2> <ul> {% for blocker in workflow_transition_blockers(article, 'publish') %} <li> {{ blocker.message }} {% if blocker.parameters.expression is defined %} <code>{{ blocker.parameters.expression }}</code> {% endif %} </li> {% endfor %} <ul>
Esta funcionalidad fue contribuida por Grégoire Pineau en el pull request #30908.
Fuente: New in Symfony 4.3: Workflow improvements
Comentarios
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.