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