【发布时间】:2018-11-07 07:12:41
【问题描述】:
我正在为 symfony 开发一个类似记录的活动系统,但遇到了一个问题。
我在 symfony 中有一个不是服务的助手类,我也不希望它成为一个服务。这个类有一个名为 container 的静态属性和一个设置它的静态方法。现在的问题是,什么时候调用这个静态方法来设置容器?
我已经尝试过捆绑扩展、编译器通过,但都没有成功。 (主要是因为它们必须是服务,当我将其作为服务并稍后扩展它时,它会跳过编译器传递。)
如果有人需要任何进一步的信息,请告诉我,并提前致谢!
【问题讨论】:
-
你能解释一下它不是服务的意思吗?如果我对您的理解正确,您希望将服务注入容器以使其可用,即您想要一个合成服务,就 Symfony DI 而言。见:symfony.com/doc/current/service_container/…
-
不。实际上我根本不是这么说的。我想要服务容器 INSIDE 的这个助手类是不是服务。所以,它只是一个普通的类,带有一个静态方法:
public static function set(ContainerInterface $container) { self::$container = $container; } -
我提供了一个更详尽的答案,希望更清楚。合成服务方法是 Kernel 类用来创建容器,使其作为 Kernel 的一部分可用,但也将自身注入到容器中以使其像服务一样可用。看来您对该术语的定义与 Symfony 所称的服务不同。在任何情况下,展示您如何创建此帮助程序或计划创建它以及您如何/在何处使用它以及其中的容器可能有助于更好地了解您的问题并让我们提供更好的解决方案。
-
如果你坚持做这种静态的东西,那么去掉setContainer方法,让你的类直接使用全局$kernel->getContainer方法()访问容器。但是你走错了路,只会遇到更多的问题。特别是在 S4 中,容器服务默认是私有的,不能通过容器直接访问。
-
好吧,我不打算将外观构建到 symfony 中,只是活动记录模型。而且由于我不会在实体上公开容器引用,所以我看不出它是一种反模式。
标签: symfony activerecord service static containers