Компонент Workflow¶
Компонент Workflow предоставляет инструменты для управления рабочим процессом или конечной машиной.
Установка¶
1 | $ composer require symfony/workflow
|
Также вы можете клонировать репозиторий https://github.com/symfony/workflow.
Note
If you install this component outside of a Symfony application, you must
require the vendor/autoload.php
file in your code to enable the class
autoloading mechanism provided by Composer. Read
this article for more details.
Создание рабочего процесса¶
Компонент Workflow предоставляет вам объектно-ориентированный способ для определения процесса или жизненного цикла, через который проходит ваш объект. Каждый шаг или этап в процессе называется местом. Вы также определяете переходы, которые описывают действие для перемещения из одного места в другое.

Набор мест и переходов создаёт определение. Рабочему процессу нужно
Definition
и способ написания состояний в объекты (т.е. экземпляр
MarkingStoreInterface
).
Рассмотрите следующий пример для поста блога. Пост может иметь один из множества предопределённых статусов (draft, review, rejected, published). В рабочем процессе эти статусы называются местами. Вы можете определять рабочий процесс так:
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\Transition;
use Symfony\Component\Workflow\Workflow;
use Symfony\Component\Workflow\MarkingStore\SingleStateMarkingStore;
$definitionBuilder = new DefinitionBuilder();
$definition = $definitionBuilder->addPlaces(['draft', 'review', 'rejected', 'published'])
// Переходы определяются с помощью уникального имени, исходного места и места назначения
->addTransition(new Transition('to_review', 'draft', 'review'))
->addTransition(new Transition('publish', 'review', 'published'))
->addTransition(new Transition('reject', 'review', 'rejected'))
->build()
;
$marking = new SingleStateMarkingStore('currentState');
$workflow = new Workflow($definition, $marking);
Workflow
теперь может помочь вам решить, какие действия разрешены в посте
блога, в зависимости от того, в каком месте он находится. Он будет держать
вашу логику домена в одном месте, а не распораживать её по всему вашему приложению.
Когда вы определяете несколько рабочих процессов, вам стоит рассмотреть использование
Registry
, который является объектом, хранящим и предоставляющим доступ к разным
рабочим процессам. Регистр также поможет вам решить, поддерживает ли рабочий процесс
объект, который вы пытаетесь использовать с ним:
use Symfony\Component\Workflow\Registry;
use Symfony\Component\Workflow\WorkflowInterface\InstanceOfSupportStrategy;
use Acme\Entity\BlogPost;
use Acme\Entity\Newsletter;
$blogWorkflow = ...
$newsletterWorkflow = ...
$registry = new Registry();
$registry->addWorkflow($blogWorkflow, new InstanceOfSupportStrategy(BlogPost::class));
$registry->addWorkflow($newsletterWorkflow, new InstanceOfSupportStrategy(Newsletter::class));
New in version 4.1: Метод addWorkflow()
был представлен в Symfony 4.1. В предыдущих версиях
Symfony это называлось add()
.
Использование¶
Когда вы сконфигурировали Registry
с помощью вашего рабочего процесса, вы
можете использовать его таким образом:
// ...
$post = new BlogPost();
$workflow = $registry->get($post);
$workflow->can($post, 'publish'); // False
$workflow->can($post, 'to_review'); // True
$workflow->apply($post, 'to_review');
$workflow->can($post, 'publish'); // True
$workflow->getEnabledTransitions($post); // ['publish', 'reject']
Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.