Для всех встроенных реализаций marker_store верно следующее:
Если функции setMarking
или getMarking
существуют для объекта, содержащего состояние, они будут использоваться для установки или получения маркировки соответственно,
Существует 3 встроенных хранилища разметки: SingleStateMarkingStore
(с использованием средства доступа к свойству, следовательно, setMarking / getMarking), MultiStateMarkingStore
(то же самое), MethodMarkingStore
(явно вызывая эти функции, вы можете изменить функцию с помощью настройки property
вашей конфигурации marking_store
).
Разница заключается в аргументе, представленном вПри вызове setMarking
для одного состояния (это тип state_machine
и по умолчанию НЕ тип workflow
), аргументом является место (или состояние), в котором находится метка,Для мультисостояния (workflow
тип по умолчанию) аргументом является массив , где ключи - это места, а значения - это метки, обычно это 1
, а пустые места опускаются.
Итак, я предполагаю, что ваш BlogPost
(в настоящее время) имеет только одно состояние в любой момент времени, и что вам нужно сделать сейчас, это преобразовать отметку, данную в объект статуса - я приму вашерабочий процесс имеет тип state_machine
:
/** in class BlogPost */
public function setMarking(string $marking/*, array $context*/) {
$this->status->statusName = $marking;
}
public function getMarking() {
return $this->status->statusName;
}
особые случаи
Если BlogPostStatus
должен быть другой единица (например, постоянный объект), тогдавам нужно будет использовать новый интерфейс, который dbrumann связал , и подключиться к событию, чтобы добавить это в контекст.
Если BlogPostStatus может не существовать во время setMarking / getMarking, вы должны создать его на лету в установщике и проверить его в получателе. Но я уверен, что вы способны сделать это; o)
Кроме того, если вы используете не рабочие процессы с одним состоянием, а несколько состояний, вы должны найти способ преобразовать массив (мест-> пометки) в ваш статусный объект и наоборот.