Symfony 4.1: Melhorias no Componente Workflow

Andréia Bohner
2 min readMar 24, 2018

--

No Symfony 4.1, o componente Workflow foi aprimorado com vários recursos principais e secundários. Este post resume os mais importantes.

Novo dumper PlantUML

Os workflows já podem ser exportados para o conhecido formato DOT e depois transformados em arquivos de imagem. No Symfony 4.1 foi adicionado suporte para outro formato popular chamado PlantUML. Então agora você pode escolher o formato que melhor lhe convier:

# traditional DOT-based dumping
$ bin/console workflow:dump my_workflow | dot -Tpng > my_workflow.png

# new PlantUML-based dumping
$ bin/console workflow:dump my_workflow --dump-format=puml | java -jar plantuml.jar -p > my_workflow.png

Removidas restrições nos nomes das transições/locais

Anteriormente, os nomes das transições (transitions) e dos locais (places) do workflow somente podiam conter os caracteres que correspondiam a essa expressão regular: [\w_-]. Agora você pode usar qualquer caractere nesses nomes.

Novas interfaces WorkflowInterface e WorkflowSupportStrategyInterface

A classe Workflow agora implementa a nova WorkflowInterface. Essa interface contém os mesmos métodos da classe existente (getMarking(), can(), apply(), getEnabledTransitions(), getName(), getDefinition() e getMarkingStore()) para que você não precise fazer nenhuma alteração no seu código.

Além disso, uma nova WorkflowSupportStrategyInterfacefoi criada para substituir a interface SupportStrategyInterface que agora foi descontinuada. A nova interface contém apenas o método supports(), então, novamente, você não precisa alterar nada em seu código, exceto a classe de interface.

Adicionados bloqueadores de transição

Os novos bloqueadores de transição definidos através da classe TransitionBlocker permitem que você forneça mais informações sobre por que uma transição não poderia acontecer no fluxo de trabalho:

$event->addTransitionBlocker(
new TransitionBlocker('You can not publish this article because it\'s too late. Try again tomorrow morning.')
);

E, é possível acessar essas informações em código PHP e nos templates Twig também:

<h2>Why you can't transition?</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>

Permitir armazenar metadados

Agora você pode armazenar metadados arbitrários em locais (places), transições (transitions) e workflows usando a opção 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'

Os metadados são armazenados usando objetos que implementam MetadataStoreInterface e podem ser obtidos com o 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'));
}
}

Nos templates Twig, você pode usar agora a função 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>

Adicionada uma nova classe TransitionException

Quando uma transição não pode ser aplicada ao workflow, uma nova Symfony\Component\Workflow\Exception\TransitionException é lançada ao invés do LogicException genérico anterior.

Tradução de: New in Symfony 4.1: Workflow improvements

--

--