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

Publicada el

11 de junio de 2019

Etiquetas

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.