Symfony 6.3 docs 有关工作流注册表的状态:
请注意,将注册表注入到您的服务中并不是 推荐。
但是,我需要在服务方法中获取特定的工作流程,该方法根据密钥决定使用哪个工作流程。我事先不知道要加载哪个工作流程,因此无法注入特定的工作流程。我怎样才能做到这一点?现在,我注入注册表。我可以以某种方式注入 service_container 并稍后从那里获取它吗?
您可以使用服务定位器来访问每个工作流程。
在文档中提到过:
如果您想检索所有工作流程,例如出于文档目的,您可以使用以下标签注入所有服务:
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,
) {
}
这是我的解决方案:
#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;
}
}