Skip to content

Commit 7f91d84

Browse files
committed
[FrameworkBundle][Workflow] Add a way to register a guard expression in the configuration
1 parent 9157375 commit 7f91d84

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

DependencyInjection/Configuration.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,11 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode)
336336
->isRequired()
337337
->cannotBeEmpty()
338338
->end()
339+
->scalarNode('guard')
340+
->cannotBeEmpty()
341+
->info('An expression to block the transition')
342+
->example('is_fully_authenticated() and has_role(\'ROLE_JOURNALIST\') and subject.getTitle() == \'My first article\'')
343+
->end()
339344
->arrayNode('from')
340345
->beforeNormalization()
341346
->ifString()

DependencyInjection/FrameworkExtension.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,30 @@ private function registerWorkflowConfiguration(array $workflows, ContainerBuilde
498498
$listener->addArgument(new Reference('logger'));
499499
$container->setDefinition(sprintf('%s.listener.audit_trail', $workflowId), $listener);
500500
}
501+
502+
// Add Guard Listener
503+
$guard = new Definition(Workflow\EventListener\GuardListener::class);
504+
$configuration = array();
505+
foreach ($workflow['transitions'] as $transitionName => $config) {
506+
if (!isset($config['guard'])) {
507+
continue;
508+
}
509+
$eventName = sprintf('workflow.%s.guard.%s', $name, $transitionName);
510+
$guard->addTag('kernel.event_listener', array('event' => $eventName, 'method' => 'onTransition'));
511+
$configuration[$eventName] = $config['guard'];
512+
}
513+
if ($configuration) {
514+
$guard->setArguments(array(
515+
$configuration,
516+
new Reference('workflow.security.expression_language'),
517+
new Reference('security.token_storage'),
518+
new Reference('security.authorization_checker'),
519+
new Reference('security.authentication.trust_resolver'),
520+
new Reference('security.role_hierarchy'),
521+
));
522+
523+
$container->setDefinition(sprintf('%s.listener.guard', $workflowId), $guard);
524+
}
501525
}
502526
}
503527

Resources/config/workflow.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,7 @@
2727
<argument type="service" id="workflow.registry" />
2828
<tag name="twig.extension" />
2929
</service>
30+
31+
<service id="workflow.security.expression_language" class="Symfony\Component\Workflow\EventListener\ExpressionLanguage" public="false" />
3032
</services>
3133
</container>

0 commit comments

Comments
 (0)