Рабочие процессы являются фундаментальным элементом во многих структурах организаций. Они описывают последовательность операций, которые могут выполняться несколько раз, чтобы обеспечить некоторую услугу (например, покупая продукт, в приложении электронной коммерции), обрабатывать некоторые данные (например, публикации некоторого содержимого в приложении 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+ версий.