@@ -351,14 +351,6 @@ order:
351
351
* ``workflow.[workflow name].announce ``
352
352
* ``workflow.[workflow name].announce.[transition name] ``
353
353
354
- You can avoid triggering those events by using the context::
355
-
356
- $workflow->apply($subject, $transitionName, [Workflow::DISABLE_ANNOUNCE_EVENT => true]);
357
-
358
- .. versionadded :: 5.1
359
-
360
- The ``Workflow::DISABLE_ANNOUNCE_EVENT `` constant was introduced in Symfony 5.1.
361
-
362
354
.. note ::
363
355
364
356
The leaving and entering events are triggered even for transitions that stay
@@ -452,6 +444,163 @@ missing a title::
452
444
453
445
The optional second argument of ``setBlocked() `` was introduced in Symfony 5.1.
454
446
447
+ Choosing which Events to Dispatch
448
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
449
+
450
+ .. versionadded :: 5.2
451
+
452
+ Ability to choose which events to dispatch was introduced in Symfony 5.2.
453
+
454
+ You are able to specify which events (does not apply to Guard event) will be
455
+ fired when performing each transition by passing an array of workflow events
456
+ to the ``events_to_dispatch `` configuration option.
457
+
458
+ Valid options for ``events_to_dispatch `` are:
459
+
460
+ * ``null `` - all events are dispatched
461
+ * ``[] `` - no events are dispatched
462
+ * ``['workflow.leave', 'workflow.completed'] `` - only specific events are dispatched
463
+
464
+ .. note ::
465
+
466
+ Guard Events are still dispatched in all instances.
467
+
468
+ .. configuration-block ::
469
+
470
+ .. code-block :: yaml
471
+
472
+ # config/packages/workflow.yaml
473
+ framework :
474
+ workflows :
475
+ blog_publishing :
476
+ # ...
477
+ events_to_dispatch : ['workflow.leave', 'workflow.completed']
478
+ # ...
479
+
480
+ .. code-block :: xml
481
+
482
+ <!-- config/packages/workflow.xml -->
483
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
484
+ <container xmlns =" http://symfony.com/schema/dic/services"
485
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
486
+ xmlns : framework =" http://symfony.com/schema/dic/symfony"
487
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
488
+ http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd"
489
+ >
490
+ <framework : config >
491
+ <framework : workflow name =" blog_publishing" >
492
+ <!-- ... -->
493
+ <framework : event-to-dispatch >workflow.leave</framework : event-to-dispatch >
494
+ <framework : event-to-dispatch >workflow.completed</framework : event-to-dispatch >
495
+ <!-- ... -->
496
+ </framework : workflow >
497
+ </framework : config >
498
+ </container >
499
+
500
+ .. code-block :: php
501
+
502
+ // config/packages/workflow.php
503
+ $container->loadFromExtension('framework', [
504
+ // ...
505
+ 'workflows' => [
506
+ 'blog_publishing' => [
507
+ // ...
508
+ 'events_to_dispatch' => [
509
+ 'workflow.leave',
510
+ 'workflow.completed',
511
+ ],
512
+ // ...
513
+ ],
514
+ ],
515
+ ]);
516
+
517
+ To specify that no events will be dispatched pass an empty array to the
518
+ configuration option.
519
+
520
+ .. configuration-block ::
521
+
522
+ .. code-block :: yaml
523
+
524
+ # config/packages/workflow.yaml
525
+ framework :
526
+ workflows :
527
+ blog_publishing :
528
+ # ...
529
+ events_to_dispatch : []
530
+ # ...
531
+
532
+ .. code-block :: xml
533
+
534
+ <!-- config/packages/workflow.xml -->
535
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
536
+ <container xmlns =" http://symfony.com/schema/dic/services"
537
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
538
+ xmlns : framework =" http://symfony.com/schema/dic/symfony"
539
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
540
+ https://symfony.com/schema/dic/services/services-1.0.xsd
541
+ http://symfony.com/schema/dic/symfony
542
+ https://symfony.com/schema/dic/symfony/symfony-1.0.xsd" >
543
+ <framework : config >
544
+ <framework : workflow name =" blog_publishing" >
545
+ <!-- ... -->
546
+ <framework : event-to-dispatch ></framework : event-to-dispatch >
547
+ <!-- ... -->
548
+ </framework : workflow >
549
+ </framework : config >
550
+ </container >
551
+
552
+ .. code-block :: php
553
+
554
+ // config/packages/workflow.php
555
+ $container->loadFromExtension('framework', [
556
+ // ...
557
+ 'workflows' => [
558
+ 'blog_publishing' => [
559
+ // ...
560
+ 'events_to_dispatch' => [],
561
+ // ...
562
+ ],
563
+ ],
564
+ ]);
565
+
566
+ You are also able to explicitly disable a specific event from being fired
567
+ when applying a transition::
568
+
569
+ use App\Entity\BlogPost;
570
+ use Symfony\Component\Workflow\Exception\LogicException;
571
+
572
+ $post = new BlogPost();
573
+
574
+ $workflow = $this->container->get('workflow.blog_publishing');
575
+
576
+ try {
577
+ $workflow->apply($post, 'to_review', [
578
+ Workflow::DISABLE_ANNOUNCE_EVENT => true,
579
+ Workflow::DISABLE_LEAVE_EVENT => true,
580
+ ]);
581
+ } catch (LogicException $exception) {
582
+ // ...
583
+ }
584
+
585
+ Choosing to disable an event for a specific transition will take precedence
586
+ over any events specified in the workflow configuration. In the above example
587
+ the ``workflow.leave `` event will not be fired, even if it has been specified
588
+ as an event to be dispatched for all transitions in the workflow configuration.
589
+
590
+ .. versionadded :: 5.1
591
+
592
+ The ``Workflow::DISABLE_ANNOUNCE_EVENT `` constant was introduced in Symfony 5.1.
593
+
594
+ .. versionadded :: 5.2
595
+
596
+ The constants for other events (as seen below) were introduced in Symfony 5.2.
597
+
598
+ * ``Workflow::DISABLE_LEAVE_EVENT ``
599
+ * ``Workflow::DISABLE_TRANSITION_EVENT ``
600
+ * ``Workflow::DISABLE_ENTER_EVENT ``
601
+ * ``Workflow::DISABLE_ENTERED_EVENT ``
602
+ * ``Workflow::DISABLE_COMPLETED_EVENT ``
603
+
455
604
Event Methods
456
605
~~~~~~~~~~~~~
457
606
@@ -665,7 +814,7 @@ of domain logic in your templates:
665
814
666
815
``workflow_has_marked_place() ``
667
816
Returns ``true `` if the marking of the given object has the given state.
668
-
817
+
669
818
``workflow_transition_blockers() ``
670
819
Returns :class: `Symfony\\ Component\\ Workflow\\ TransitionBlockerList ` for the given transition.
671
820
@@ -700,7 +849,7 @@ The following example shows these functions in action:
700
849
{% if 'reviewed' in workflow_marked_places(post) %}
701
850
<span class="label">Reviewed</span>
702
851
{% endif %}
703
-
852
+
704
853
{# Loop through the transition blockers #}
705
854
{% for blocker in workflow_transition_blockers(post, 'publish') %}
706
855
<span class="error">{{ blocker.message }}</span>
0 commit comments