我创建了一个包,我想用它做最好的练习。
所以我的所有服务都是私人的
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。
我希望我很清楚。
抱歉我的英文。我试着改进它; - )
答案 0 :(得分:3)
如果您正在开发第三方软件包,即一个将由其他人使用的软件包,那么您必须手动定义您的服务以及xml。这些是最好的做法。
现在,第三方捆绑包可以拥有公共服务。您引用的文章是指您的AppBundle服务,它应该是私有的,因为它包含您的应用程序/业务逻辑。默认情况下它们是私有的原因是因为您应该使用Constructor Dependency Injection来使用它们,因此事情更容易测试。
现在,关于你的问题,你不应该在第三方包中创建控制器:这不是好的做法。而是使用路由路由到将执行所需操作的服务。 Api平台就是这样做的: