- a configured flow can be brought into consideration, despite its event was not fired - it could either run through - or run into a RuntimeException and killing processing of valid flows Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>tags/v20.0.0beta2
@@ -65,6 +65,7 @@ class Application extends App implements IBootstrap { | |||
private function registerRuleListeners(IEventDispatcher $dispatcher, | |||
IServerContainer $container, | |||
ILogger $logger): void { | |||
/** @var Manager $manager */ | |||
$manager = $container->query(Manager::class); | |||
$configuredEvents = $manager->getAllConfiguredEvents(); | |||
@@ -81,6 +82,7 @@ class Application extends App implements IBootstrap { | |||
/** @var IOperation $operation */ | |||
$operation = $container->query($operationClass); | |||
$ruleMatcher->setEventName($eventName); | |||
$ruleMatcher->setEntity($entity); | |||
$ruleMatcher->setOperation($operation); | |||
@@ -62,6 +62,8 @@ class RuleMatcher implements IRuleMatcher { | |||
protected $entity; | |||
/** @var Logger */ | |||
protected $logger; | |||
/** @var string */ | |||
protected $eventName; | |||
public function __construct( | |||
IUserSession $session, | |||
@@ -101,6 +103,13 @@ class RuleMatcher implements IRuleMatcher { | |||
$this->entity = $entity; | |||
} | |||
public function setEventName(string $eventName): void { | |||
if ($this->eventName !== null) { | |||
throw new RuntimeException('This method must not be called more than once'); | |||
} | |||
$this->eventName = $eventName; | |||
} | |||
public function getEntity(): IEntity { | |||
if ($this->entity === null) { | |||
throw new \LogicException('Entity was not set yet'); | |||
@@ -155,6 +164,11 @@ class RuleMatcher implements IRuleMatcher { | |||
$matches = []; | |||
foreach ($operations as $operation) { | |||
$configuredEvents = json_decode($operation['events'], true); | |||
if ($this->eventName !== null && !in_array($this->eventName, $configuredEvents)) { | |||
continue; | |||
} | |||
$checkIds = json_decode($operation['checks'], true); | |||
$checks = $this->manager->getChecks($checkIds); | |||
@@ -78,4 +78,14 @@ interface IRuleMatcher extends IFileCheck { | |||
* @since 18.0.0 | |||
*/ | |||
public function getEntity(): IEntity; | |||
/** | |||
* this method can be called once to set the event name that is currently | |||
* being processed. The workflow engine takes care of this usually, only an | |||
* IComplexOperation might want to make use of it. | |||
* | |||
* @throws RuntimeException | |||
* @since 20.0.0 | |||
*/ | |||
public function setEventName(string $eventName): void; | |||
} |