在 Symfony 6.3 中动态添加工作流到服务

问题描述 投票:0回答:2

Symfony 6.3 docs 有关工作流注册表的状态:

请注意,将注册表注入到您的服务中并不是 推荐。

但是,我需要在服务方法中获取特定的工作流程,该方法根据密钥决定使用哪个工作流程。我事先不知道要加载哪个工作流程,因此无法注入特定的工作流程。我怎样才能做到这一点?现在,我注入注册表。我可以以某种方式注入 service_container 并稍后从那里获取它吗?

php symfony dependency-injection symfony-workflows
2个回答
1
投票

您可以使用服务定位器来访问每个工作流程。

文档中提到过:

如果您想检索所有工作流程,例如出于文档目的,您可以使用以下标签注入所有服务:

workflow: all workflows and all state machine;
workflow.workflow: all workflows;
workflow.state_machine: all state machines.

可以使用 Symfony 6/7 使用定位器属性轻松完成此操作:

public function __construct(
    #[TaggedLocator('workflow')] private ContainerInterface $workflowsAndStateMachinesLocator,
    #[TaggedLocator('workflow.workflow')] private ContainerInterface $workflowsLocator,
    #[TaggedLocator('workflow.state_machine')] private ContainerInterface $stateMachinesLocator,
) {
}

0
投票

这是我的解决方案:

    #WorkflowLoader.php
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
use Symfony\Component\DependencyInjection\Attribute\TaggedLocator;
use Symfony\Component\Workflow\Workflow;
use RuntimeException;

class WorkflowLoader
{
    public function __construct(
        #[TaggedLocator('workflow')] private readonly ContainerInterface $serviceLocator
    )
    {
    }

    public function getWorkflow($workflowName): Workflow
    {
        try {
            if (!$workflow = $this->serviceLocator->get('state_machine.' . $workflowName)) {
                $workflow = $this->serviceLocator->get('workflow.' . $workflowName);
            }
        } catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) {
            throw new RuntimeException("Process Workflow $workflowName could not be loaded. \n" . $e->getMessage());
        }
        return $workflow;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.