Symfony workflow :: can проходит через прослушиватель событий workflow guard

Я не знаю, если многие из вас уже проверили symfony workflow компонент, но я надеюсь, что некоторые из вас есть 🙂

Итак, я использую этот компонент на два объекта и я хочу первый объект в Обновить второй в зависимости от transition это применяется.

Для этого я использую workflow guard listener на моем первый объект и попытаться сделать workflow::apply на моем второй объект (используя второй рабочий процесс …).

Проблема в том, что когда я делаю workflow::canсобытие отправляется и он пытается применять новый статус на моем второй объект … Это совсем не нормально, так как я просто спрашиваю если я могу подать заявку некоторый переход и не просить на самом деле применяются это на моем первый объект.

конфиг

framework:
workflows:
request_for_operation:
type: 'state_machine'
marking_store:
type: 'single_state'
arguments:
- 'status'
supports:
- AppBundle\Entity\RequestForOperation
places:
- draft
- pending_for_management
- in_progress
- finished
- canceled
transitions:
request_for_operations:
from: draft
to:   pending_for_management
start_rfop_management:
from: pending_for_management
to:   in_progress
close:
from: in_progress
to:   finished
cancel:
from: [pending_for_management, in_progress]
to:   canceled
operation:
type: 'state_machine'
marking_store:
type: 'single_state'
arguments:
- 'status'
supports:
- AppBundle\Entity\Operation
places:
- draft
- pending_for_management
- in_progress
- finished
- canceled
transitions:
validate_operation:
from: draft
to:   pending_for_management
start_tracking:
from: pending_for_management
to:   in_progress
close:
from: in_progress
to:   finished
cancel:
from: [pending_for_management, in_progress]
to:   canceled

подписчик

class RequestForOperationListener implements EventSubscriberInterface
{
public function __construct(
OperationManager $operationManager,
UserNotifier $userNotifier
) {
$this->operationManager = $operationManager;
$this->userNotifier = $userNotifier;
}

public static function getSubscribedEvents()
{
return [
'workflow.request_for_operation.guard.request_for_operations' => ['onRequestForOperations'],
'workflow.request_for_operation.guard.start_rfop_management' => ['onStartRfopManagement'],
'workflow.request_for_operation.guard.close' => ['onClose'],
'workflow.request_for_operation.guard.cancel' => ['onCancel'],
];
}

public function onRequestForOperations(GuardEvent $event)
{
/** @var RequestForOperation $rfop */
$rfop = $event->getSubject();

//get all the operations linked to the rfop
$operations = $rfop->getOperations();
foreach ($operations as $operation) {
//set the status of the operation to 'pending_for_management'
$this->operationManager->applyTransition($operation, 'validate_operation');
//set the status of the sub-operations to 'pending_for_management'
foreach ($operation->getChildren() as $subOperation) {
$this->operationManager->applyTransition($subOperation, 'validate_operation');
}

//get the users (i.e: managers) linked to the operation and notify them (by mail or whatever)
$this->notifyAssignedUsers($operation->getUsers(), $operation);
}
}
}

6

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]