Компонент Рабочий процесс

Компонент Рабочий процесс предоставляет инструменты для управления рабочим процессом или конечной машиной.

New in version 3.2: Компонент Рабочий процесс был представлен в Symfony 3.2.

Установка

Вы можете установить компонент 2 разными способами:

Then, require the vendor/autoload.php file to enable the autoloading mechanism provided by Composer. Otherwise, your application won't be able to find the classes of this Symfony component.

Создание рабочего процесса

Компонент Рабочий процесс предоставляет вам объектно-ориентированный способ для определения процесса или жизненного цикла, через который проходит ваш объект. Каждый шаг или этап в процессе называется местом. Вы также определяете переходы, которые описывают действие для перемещения из одного места в другое.

../_images/states_transitions.png

Набор мест и переходов создаёт определение. Рабочему процессу нужно Definition и способ написания состояний в объекты (т.е. экземпляр MarkingStoreInterface).

Рассмотрите следующий пример для поста блога. Пост может иметь один из множества предопределённых статусов (draft, review, rejected, published). В рабочем процессе эти статусы называются местами. Вы можете определять рабочий процесс так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\Transition;
use Symfony\Component\Workflow\Workflow;
use Symfony\Component\Workflow\MarkingStore\SingleStateMarkingStore;

$definition = new 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);

New in version 3.3: Свободный интерфейс для класса DefinitionBuilder был представлен в Symfony 3.3. До этого вам нужно было вызывать методы addPlaces(), addTransition() и build() отдельно.

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

Когда вы определяете несколько рабочих процессов, вам стоит рассмотреть использование Registry, который является объектом, хранящим и предоставляющим доступ к разным рабочим процессам. Регистр также поможет вам решить, поддерживает ли рабочий процесс объект, который вы пытаетесь использовать с ним:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
use Symfony\Component\Workflow\Registry;
use Acme\Entity\BlogPost;
use Acme\Entity\Newsletter;

$blogWorkflow = ...
$newsletterWorkflow = ...

$registry = new Registry();
$registry->add($blogWorkflow, BlogPost::class);
$registry->add($newsletterWorkflow, Newsletter::class);

Использование

Когда вы сконфигурировали Registry с помощью вашего рабочего процесса, вы можете использовать его таким образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// ...
$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.