diff --git a/Core/WorkflowServiceFacade.php b/Core/WorkflowServiceFacade.php index 71bd969..c6985df 100644 --- a/Core/WorkflowServiceFacade.php +++ b/Core/WorkflowServiceFacade.php @@ -21,12 +21,14 @@ class WorkflowServiceFacade protected $cacheDir; protected $debugMode; protected $logger; - + protected $recursionLimit; protected static $workflowExecuting = 0; - public function __construct(MigrationService $innerService, $cacheDir, $debugMode = false, LoggerInterface $logger = null) + public function __construct(MigrationService $innerService, $recursionLimit, $cacheDir, $debugMode = false, + LoggerInterface $logger = null) { $this->innerService = $innerService; + $this->recursionLimit = $recursionLimit; $this->cacheDir = $cacheDir; $this->debugMode = $debugMode; $this->logger = $logger; @@ -61,6 +63,10 @@ public function triggerWorkflow($signalName, array $signalParameters) return; } + if (self::$workflowExecuting >= $this->recursionLimit) { + throw new \Exception("Workflow execution halted as we reached {$this->recursionLimit} nested workflows"); + } + $wfd = new WorkflowDefinition( $workflowDefinition->name, $workflowDefinition->path, diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 49bd17b..5d2fb38 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -3,6 +3,8 @@ parameters: ez_workflowengine_bundle.workflow_directory: 'WorkflowDefinitions' # Set to false to disable completely the debug log of executed migration steps (also echoed to cli in verbose mode) ez_workflowengine_bundle.enable_debug_output: true + # Abort execution when workflows triggered in cascade reach this limit + ez_workflowengine_bundle.recursion_limit: 100 ez_workflowengine_bundle.workflow_service.facade.class: Kaliop\eZWorkflowEngineBundle\Core\WorkflowServiceFacade ez_workflowengine_bundle.workflow_service.inner.class: Kaliop\eZWorkflowEngineBundle\Core\WorkflowServiceInner @@ -29,6 +31,7 @@ services: class: '%ez_workflowengine_bundle.workflow_service.facade.class%' arguments: - '@ez_workflowengine_bundle.workflow_service.inner' + - '%ez_workflowengine_bundle.recursion_limit%' - '%kernel.cache_dir%/ezworkflowdefinitions' - '%kernel.debug%' - '@?logger'