22. Integrate Symfony Workflow Component

If you are using Symfony Workflow Component and if you wish to use it with Sonata, there is a 3rd party library that provides toolkit classes.

22.1. Download the Bundle

composer require yokai/sonata-workflow

22.2. Usage

Let’s say we have a BlogPost entity that is under a Symfony workflow:

# config/packages/workflow.yaml

framework:
    workflows:
        blog_post:
            type: state_machine
            marking_store:
                type: single_state
                arguments:
                    - status
            supports:
                - App\Entity\BlogPost
            places:
                - draft
                - pending_review
                - pending_update
                - published
            initial_place: draft
            transitions:
                start_review:
                    from: draft
                    to:   pending_review
                interrupt_review:
                    from: pending_review
                    to:   pending_update
                restart_review:
                    from: pending_update
                    to:   pending_review
                publish:
                    from: pending_review
                    to:   published

You can use the provided extension to take care of your entity admin.

# config/packages/sonata_admin.yaml

services:
    app.admin.blog_post:
        class: App\Admin\BlogPostAdmin
        tags:
            - { name: sonata.admin, model_class: App\Entity\BlogPost, controller: Yokai\SonataWorkflow\Controller\WorkflowController, manager_type: orm }

    app.admin.extension.workflow.blog_post:
        class: Yokai\SonataWorkflow\Admin\Extension\WorkflowExtension
        arguments:
            - '@workflow.registry'
            - transitions_icons:
                  start_review: fas fa-question
                  interrupt_review: fas fa-edit
                  restart_review: fas fa-question
                  publish: fas fa-check
# config/packages/sonata_admin.yaml

sonata_admin:
    extensions:
        admin.extension.workflow.blog_post:
            admins:
                - app.admin.blog_post

You are all set. If you visit your admin page in edit or show mode, you will see something like this:

Sonata Admin with Workflow