Symfony 4.1: Melhorias no Componente Workflow
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 WorkflowSupportStrategyInterface
foi 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