Symfony:如何在Bundle Controller中调用私有服务

时间:2018-04-23 19:48:16

标签: php symfony

我创建了一个包,我想用它做最好的练习。

所以我的所有服务都是私人的

https://symfony.com/doc/current/service_container/alias_private.html

  

因此,除非您特别需要直接从中访问服务   容器通过$ container-> get(),最佳做法是让你的   私人服务。实际上,默认的services.yaml配置   默认情况下将所有服务配置为私有。

https://symfony.com/blog/new-in-symfony-3-4-services-are-private-by-default

  

在Symfony核心中,我们已经做到了,我们提供了所有服务   别名是私人的,除了一些选定的,在   自助时间。实际上,bootstrapping是最后也是唯一合法的   用例直接使用容器。

     

那么,我们是否应该弃用注入的可能性   service_container完全与ContainerAware *一起?那是一个   社区在准备Symfony时可能会考虑的可能性   5。

我有一个Trait或Abstract控制器,必须由App / Controller使用。该特征可以通过自动装配调用私人服务,问题是修复但是 Symfony的最佳实践是不要仅在Bundle中使用自动装配:

https://symfony.com/doc/current/service_container/autowiring.html

  

Public and ReusableBundles¶

     

公共捆绑包应明确配置其服务而不依赖   在自动装配上。

那么如何在我的Trait或抽象控制器中注入我的私人服务。或者甚至在没有用户必须配置的App控制器中都是services.yml。

我希望我很清楚。

抱歉我的英文。我试着改进它; - )

1 个答案:

答案 0 :(得分:3)

如果您正在开发第三方软件包,即一个将由其他人使用的软件包,那么您必须手动定义您的服务以及xml。这些是最好的做法。

现在,第三方捆绑包可以拥有公共服务。您引用的文章是指您的AppBundle服务,它应该是私有的,因为它包含您的应用程序/业务逻辑。默认情况下它们是私有的原因是因为您应该使用Constructor Dependency Injection来使用它们,因此事情更容易测试。

现在,关于你的问题,你不应该在第三方包中创建控制器:这不是好的做法。而是使用路由路由到将执行所需操作的服务。 Api平台就是这样做的:

routing.xml

EntryPointAction.php