Рабочий процесс Symfony - Возможно ли использовать доктринальные отношения в качестве держателя государства? - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь применить компонент рабочего процесса Symfony к своему приложению.

Как сказано в документации marking_store указывает на строку. Я гуглил по нему - это может быть string или json_array -поля доктрины.

Но что, если у меня есть сущность BlogPost с отношением BlogPostStatus, имеющая два поля: некоторые первичные id и statusName. Могу ли я настроить компонент рабочего процесса для изменения статусов моего BlogPost (т.е. установить новый BlogPostStatus в BlogPost сущность) и сохранить его в базе данных?

Теперь у меня есть только одно решение: добавить в мое поле BlogPost неотображаемую сущность и при его изменении изменить статус сущности.

У вас есть лучшее решение?

1 Ответ

1 голос
/ 05 октября 2019

Для всех встроенных реализаций 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)

Кроме того, если вы используете не рабочие процессы с одним состоянием, а несколько состояний, вы должны найти способ преобразовать массив (мест-> пометки) в ваш статусный объект и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...