【问题标题】:Symfony: How to call private services in Bundle ControllerSymfony:如何在 Bundle Controller 中调用私有服务
【发布时间】:2018-10-03 23:03:38
【问题描述】:

我创建了一个捆绑包,我想使用它的最佳实践。

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

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 核心中,我们已经做到了,我们制作了所有服务和 别名私有,除了少数选定的,需要在 引导时间。事实上,自举是最后也是唯一合法的 直接使用容器的用例。

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

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

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

公共和可重复使用的捆绑包¶

Public bundles 应该明确地配置他们的服务,而不是依赖 关于自动装配。

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

我希望我很清楚。

对不起我的英语。我尝试改进它;-)

【问题讨论】:

  • 你找到答案了吗?如果没有,我可以用代码解释一下,可能会更清楚。
  • @TomášVotruba 我使用Api平台的解决方案,每个动作都是一个服务。但是如果用户想要创建一个控制器,他可以使用一个制造者控制器,该控制器在一个特征中使用不同的服务操作。我不明白,Symfony 在第三方包中说“不要使用控制器”或“不要使用容器”,但 easyadmin 包使用它。
  • Action as service 是 IMO 的最佳解决方案 :) 文档在某些地方可能会令人困惑,也不要将其视为“上帝”,每个文档都有很多固执己见的想法。

标签: php symfony


【解决方案1】:

如果您正在开发第三方捆绑包,即将被其他人使用的捆绑包,那么您必须手动定义您的服务,也可以在 xml 中定义。这些是最佳做法。

现在,第三方捆绑包可以拥有公共服务。您引用的文章是指您的 AppBundle 服务,因为它包含您的应用程序/业务逻辑,所以应该是私有的。之所以默认它们是私有的,是因为你应该使用构造函数依赖注入来使用它们,所以事情更容易测试。

现在,关于您的问题,您不应该在第三方捆绑包中创建控制器:这不是一个好习惯。相反,使用路由来路由到将执行您需要的操作的服务。 Api Platform 在此处执行此操作:

routing.xml

EntryPointAction.php

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2015-02-01
    • 2014-01-06
    • 2017-06-03
    • 2018-12-24
    相关资源
    最近更新 更多