Skip to content

symfony/workflow: custom marking store with access to property or arguments #49778

@Miras4207

Description

@Miras4207

Description

We would find it helpful if a custom implementation of MarkingStoreInterface had access to the configured property in workflow configuration. Currently, it does not seem possible.

Default MethodMarkingStore takes into account the configured property name:

framework:
    workflows:
        order:
            type: "state_machine"
            marking_store:
                type: "method"
                property: "status"

With this settings, the MethodMarkingStore operates with property status instead of the property marking which is set as default value in constructor:

final class MethodMarkingStore implements MarkingStoreInterface
{
    public function __construct(bool $singleState = false, string $property = 'marking')
    {
        $this->property = $property;
        // ...
    }

We would expect similar behaviour when using custom marking store, but the property configuration does not seem to have any effect:

framework:
    workflows:
        order:
            type: "state_machine"
            marking_store:
                service: app.marking_store.custom
                property: "status"
namespace App\Workflow\MarkingStore;

use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface;

class CustomMarkingStore implements MarkingStoreInterface
{
    protected string $property;

    public function __construct(string $property = 'marking')
    {
        $this->property = $property;
    }
}

In this case, the CustomMarkingStore always operates with property marking (which is set as default in constructor), but it should operate with property status instead.

Alternatively, having an option to define service arguments in workflow configuration would solve the issue:

framework:
    workflows:
        order:
            type: "state_machine"
            marking_store:
                service: app.marking_store.custom
                arguments:
                    $property: "status"

This seems to have been possible in version Symfony 4.4, but is no longer possible in Symfony 6.2.

Example

Currently, the only way to achieve the expected behaviour is to register a pre-configured service for each workflow definition like this:

services:
    app.marking_store.oder:
        class: App\Workflow\MarkingStore\CustomMarkingStore
        arguments:
            $property: 'status'
    app.marking_store.item:
        class: App\Workflow\MarkingStore\CustomMarkingStore
        arguments:
            $property: 'condition'
framework:
    workflows:
        order:
            type: "state_machine"
            marking_store:
                service: app.marking_store.order
        item:
            type: "state_machine"
            marking_store:
                service: app.marking_store.item

This feels unfortunate in case we have many workflow definitions that use the same custom marking store, but differ in property name only.

If using property or arguments as described above is not an option, would it be possible to at least introduce a new interface, for example PropertyAwareInterface that could be implemented together with MarkingStoreInterface like this?

namespace App\Workflow\MarkingStore;

use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface;
use Symfony\Component\Workflow\MarkingStore\PropertyAwareInterface;

class CustomMarkingStore implements MarkingStoreInterface, PropertyAwareInterface
{
    protected string $property;

    /**
      * {@inheritdoc}
      */
    public function setProperty(string $property): void
    {
        $this->property = $property;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions