Nuevo en Symfony 4.1: mejoras en el componente Workflow

En Symfony 4.1 hemos mejorado el componente Workflow con un montón de mejoras y en este artículo se explican las más relevantes.

Nueva opción para exportar a PlantUML

La configuración de los workflows se puede exportar al formato DOT para después generar una imagen que represente al workflow. Ahora en Symfony 4.1 también puedes exportarlos al formato PlantUML, que es muy popular en algunas herramienta de programación:

# exportación a formato DOT y conversión en imagen
$ bin/console workflow:dump my_workflow | dot -Tpng > my_workflow.png
 
# exportación a formato PlantUML y conversión en imagen
$ bin/console workflow:dump my_workflow --dump-format=puml | java -jar plantuml.jar -p > my_workflow.png

Esta funcionalidad fue contribuida por Sébastien Morel en el pull request #24705.

Eliminadas las restricciones en los nombres de lugares y transiciones

En las anteriores versiones de Symfony los nombres de las transiciones y los lugares de los workflows solo podían contener caracteres que cumplieran con esta expresión regular: [\w_-]. Ahora puedes usar cualquier carácter.

Esta funcionalidad fue contribuida por Grégoire Pineau en el pull request #26079.

Nuevas interfaces WorkflowInterface y WorkflowSupportStrategyInterface

La clase Workflow ahora implementa la interfaz WorkflowInterface, que define los mismos métodos que la clase actual (getMarking(), can(), apply(), getEnabledTransitions(), getName(), getDefinition() y getMarkingStore()) por lo que no tendrás que hacer ningún cambio en tu código.

Además, se ha añadido una nueva interfaz llamada WorkflowSupportStrategyInterface para reemplazar a SupportStrategyInterface. La nueva interfaz contiene también los mismos métodos que la anterior, así que no se requieren cambios en tu código.

Esta funcionalidad fue contribuida por Hamza Amrouche en el pull request #24751.

Añadida una nueva clase TransitionBlocker

La nueva clase TransitionBlocker permite dar información sobre el motivo por el que cualquier transición del workflow no puede realizarse.

$event->addTransitionBlocker(
    new TransitionBlocker('No puedes publicar este artículo porque es demasiado tarde. Inténtalo de nuevo mañana.')
);

Esta información se puede obtener tanto en PHP como en plantillas Twig:

<h2>¿Por qué no se puede realizar esta acción?</h2>
<ul>
    {% for transition in workflow_all_transitions(article) %}
        {% if not workflow_can(article, transition.name) %}
            <li>
                <strong>{{ transition.name }}</strong>:
                <ul>
                {% for blocker in workflow_build_transition_blocker_list(article, transition.name) %}
                    <li>
                        {{ blocker.message }}
                        {% if blocker.parameters.expression is defined %}
                            <code>{{ blocker.parameters.expression }}</code>
                        {% endif %}
                    </li>
                {% endfor %}
                </ul>
            </li>
        {% endif %}
    {% endfor %}
</ul>

Esta funcionalidad fue contribuida por Grégoire Pineau en el pull request #26076.

Metadatos

Los workflows, lugares y transiciones ahora pueden almacenar metadatos gracias a la opción metadata:

# config/packages/workflow.yaml
framework:
    workflows:
        my_workflow:
            supports:
                - App\Entity\BlogPost
            metadata:
                some_key: 'some_value'
                other_key: 'other_value'
            # ...
            places:
                some_place:
                    metadata:
                        some_key: 'some_value'
            # ...
            transitions:
                some_transition:
                    metadata:
                        some_key: 'some_value'

Los metadatos se almacenan en objetos que implementan MetadataStoreInterface y se obtienen mediante el método getMetadata():

public function onReview(Event $event)
{
    $metadataStore = $event->getWorkflow()->getMetadataStore();
    foreach ($event->getTransition()->getTos() as $place) {
        $this->flashbag->add('info', $metadataStore->getPlaceMetadata($place)->get('some_key'));
    }
}

En las plantillas Twig, utiliza la función workflow_metadata():

<strong>Current place(s)</strong>
<ul>
{% for place in workflow_marked_places(article) %}
    <li>
        {{ place }}:
        <code>{{ workflow_metadata(article, 'title', place) ?: 'n-a'}}</code>
    </li>
{% endfor %}
</ul>
 
<strong>Enabled transition(s)</strong>
<ul>
{% for transition in workflow_transitions(article) %}
    <li>
        {{ transition.name }}:
        <code>{{ workflow_metadata(article, 'title', transition) ?: 'n-a'}}</code>
    </li>
{% endfor %}
</ul>

Esta funcionalidad fue contribuida por Grégoire Pineau en el pull request #26092.

Añadida una nueva clase TransitionException

Cuando una transición no se puede aplicar, en Symfony 4.1 se lanza una excepción de tipo Symfony\Component\Workflow\Exception\TransitionException en vez de la anterior excepción genérica LogicException.

Esta funcionalidad fue contribuida por Andrew Tchircoff en el pull request #26587.

Fuente: New in Symfony 4.1: Workflow improvements

Comentarios

Publicada el

26 de abril de 2018

Etiquetas

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

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