Новое в Symfony 3.2: Workflow компонент

Рабочие процессы являются фундаментальным элементом во многих структурах организаций. Они описывают последовательность операций, которые могут выполняться несколько раз, чтобы обеспечить некоторую услугу (например, покупая продукт, в приложении электронной коммерции), обрабатывать некоторые данные (например, публикации некоторого содержимого в приложении CMS) и т.д.

В Symfony 3.2 мы добавили новый компонент рабочего процесса, чтобы помочь вам определить эти рабочие процессы в своих приложениях. С технической точки зрения компонент реализует «рабочий процесс сети», который является подклассом сети Петри.

На практике, для создания рабочего процесса вы определяете «состояния» и «переходы» (которые являются событиями, которые могут возникнуть между двумя состояниями). Следующий пример показывает минимальный рабочий процесс, чтобы опубликовать некоторые содержимое:

framework:
    workflows:
        article_publishing:
            marking_store:
                type: property_accessor
            supports:
                - AppBundle\Entity\Article
            places:
                - draft
                - spellchecked
                - published
            transitions:
                spellcheck:
                    from: draft
                    to:   spellchecked
                publish:
                    from: spellchecked
                    to:   published

Теперь вы можете начать использовать этот рабочий процесс в шаблонах и контроллерах. Например, в шаблоне:

{# the workflow name is optional when there is just one workflow for the class #}
{% if workflow_can(article, 'publish') %}
    <a href="...">Publish article</a>
{% endif %}

{# if more than one workflow is defined for the 'Article' class #}
{% if workflow_can(article, 'publish', 'article_publishing') %}
    <a href="...">Publish article</a>
{% endif %}

{# ... #}

{% for transition in workflow_transitions(article) %}
    <a href="...">{{ transition.name }}</a>
{% else %}
    No actions available for this article.
{% endfor %}

В контроллере, вы можете получить любой заданный рабочий процесс по его имени, благодаря реестру рабочего процесса, созданного Symfony, а затем указать гдето данный переход к нему:

use Symfony\Component\Workflow\Exception\LogicException;

public function reviewAction(Article $article)
{
    // the try/catch is needed because this transition could already have been applied
    try {
        $this->get('workflow.article_publishing')->apply($article, 'spellcheck');
    } catch (LogicException $e) {
        // ...
    }
}

Если вы хотите выполнить пользовательскую логику, когда переход происходит, вы можете подключить слушателей к событиям генерируемым компонентом.

Это демонстрационное приложение для примера работы компонента рабочего процесса в действии и проект GitHub неофициального порта компонента для Symfony 2.3+ версий.

Добавить комментарий

Ваш адрес email не будет опубликован.

8 + 18 =