chillLogger = $chillLogger; $this->security = $security; $this->userRender = $userRender; } public static function getSubscribedEvents(): array { return [ 'workflow.transition' => 'onTransition', 'workflow.guard' => [ ['guardEntityWorkflow', 0], ], ]; } public function guardEntityWorkflow(GuardEvent $event) { if (!$event->getSubject() instanceof EntityWorkflow) { return; } /** @var EntityWorkflow $entityWorkflow */ $entityWorkflow = $event->getSubject(); if ($entityWorkflow->isFinalize()) { $event->addTransitionBlocker( new TransitionBlocker( 'workflow.The workflow is finalized', 'd6306280-7535-11ec-a40d-1f7bee26e2c0' ) ); return; } if (!$entityWorkflow->getCurrentStep()->getDestUser()->contains($this->security->getUser())) { if (!$event->getMarking()->has('initial')) { $event->addTransitionBlocker(new TransitionBlocker( 'workflow.You are not allowed to apply a transition on this workflow. Only those users are allowed: %users%', 'f3eeb57c-7532-11ec-9495-e7942a2ac7bc', [ '%users%' => implode( ', ', $entityWorkflow->getCurrentStep()->getDestUser()->map(function (User $u) { return $this->userRender->renderString($u, []); })->toArray() ), ] )); } } } public function onTransition(Event $event) { if (!$event->getSubject() instanceof EntityWorkflow) { return; } /** @var EntityWorkflow $entityWorkflow */ $entityWorkflow = $event->getSubject(); $step = $entityWorkflow->getCurrentStep(); $step ->setTransitionAfter($event->getTransition()->getName()) ->setTransitionAt(new DateTimeImmutable('now')) ->setTransitionBy($this->security->getUser()); $this->chillLogger->info('[workflow] apply transition on entityWorkflow', [ 'relatedEntityClass' => $entityWorkflow->getRelatedEntityClass(), 'relatedEntityId' => $entityWorkflow->getRelatedEntityId(), 'transition' => $event->getTransition()->getName(), 'by_user' => $this->security->getUser(), 'entityWorkflow' => $entityWorkflow->getId(), ]); } }