Logic 使用Symfony3中的参考组件进行维修

Logic 使用Symfony3中的参考组件进行维修,logic,symfony,Logic,Symfony,在我的SF3项目中,我有两个相互依赖的服务,它们会导致循环引用问题: page_handler : arguments : ["@sentence_handler"] sentence_handler : arguments : ["@page_handler"] 因为,从类PageHandler我使用SentenceHandler向页面添加一个句子,从SentenceHandler我使用PageHandler从页面获取所有句子 我注意到有3个选项可以解决此问题: 将我的a

在我的SF3项目中,我有两个相互依赖的服务,它们会导致循环引用问题:

page_handler : 
    arguments : ["@sentence_handler"]
sentence_handler :
    arguments : ["@page_handler"]
因为,从类PageHandler我使用SentenceHandler向页面添加一个句子,从SentenceHandler我使用PageHandler从页面获取所有句子

我注意到有3个选项可以解决此问题:

  • 将我的addSession()方法移动到SentenceHandler:但我将从SentenceHandler修改一个页面,它不符合逻辑
  • 将getAllSequences()方法移到PageHandler:但我将从PageHandler获取句子,这不符合逻辑
  • 将getPage()方法从PageHandler复制到SentenceHandler,这将变得独立:但它不是干的
最好的方法是什么?您有其他想法吗?

在两种服务上都使用:

page_handler:
    class: PageHandler
    calls:
        - ["setSentenceHandler", ["@sentence_handler"]]

sentence_handler:
    class: SentenceHandler
    calls:
        - ["setPageHandler", ["@page_handler"]]

只要您不需要/不使用constructor中的服务(这是有问题的),就不会有明显的区别。这意味着您以后可以安全地将服务注入到其他服务中。

最糟糕的方法是将容器注入到服务中,并在需要时获取相关服务。通常避免这样做getPage功能是否可以移动到它自己的服务中并注入到其他处理程序中?那会解决你的干燥问题。谢谢你,我不知道注射的不同类型!小心点。这个技巧是有效的,但这种交叉依赖性会使代码难以维护。