【问题标题】:Symfony 2.8 Autowiring for method injectionSymfony 2.8 用于方法注入的自动装配
【发布时间】:2023-03-27 13:19:01
【问题描述】:

2020 年更新(本应更早)。每个控制器操作都可以有一个新类。每个控制器都可以通过它要执行的操作命名,使用Invoke() 方法。 Consider "Action Domain Responder" (ADR).

我为什么要这样做?控制器不一定遵守 SRP,我也不打算为每个实际上是控制器“动作”的类创建一个新类。因此,控制器不应该通过构造函数注入所有内容,但被调用的相关方法应该能够明确声明“我需要这些对象”和另一个方法“这些其他对象”。

As of Symfony 2.8,如果您在services.yml 中提供autowire: true,则依赖注入组件现在为您的服务提供自动装配。

我将控制器定义为服务,如下所示:

test_controller:
    class: AppBundle\Controller\TestController
    autowire: true

我的控制器如下所示:

class TestController
{
    public function indexAction(TestClass1 $tc1, $id)
    {
        return new Response('The slug is: ' . $id);
    }
}

你会注意到我在输入TestClass,这只是一个空类。但是,当我刷新页面时出现以下错误:

我需要在我的services.yml 文件中进行哪些更改才能在我的控制器方法中进行自动关联依赖注入?请注意,问题不是,因为之后我有一个$id 'slug'。删除它没有任何作用。

【问题讨论】:

  • 但是你有没有“使用 xxx\TestClass1;”在你的控制器之上?不确定您是否需要为“services.yml”中的控制器操作做点什么。
  • 当然我导入了命名空间 :PI 在services.yml 中寻找控制器操作的内容,我发现对calls: 密钥的引用散布在互联网上,但在 symfony 文档或任何其他内容中都没有工作。
  • 我怀疑你的方法是否可行。路由器正在调用 indexAction。该容器用于创建控制器,但我不明白它如何成为路由过程的一部分。
  • @Jimbo,很好。是的,尝试将 $id 作为第一个参数。我正在为控制器使用下一个构造:public function updateAction($idCategory, Request $request),它可以工作,在 services.yml 中不需要任何东西......
  • 因为auto wire: 应该是autowire: 而且我认为这只能在构造函数中完成。

标签: php symfony dependency-injection autowired


【解决方案1】:

编辑:我创建了一个捆绑包,可以或多或少地做你想做的事,称为DunglasActionBundle

免责声明:我是 Symfony 自动装配系统的作者。

Symfony 依赖注入组件(和自动装配系统是其中的一部分)不是这样工作的。它只允许在服务的类构造函数中自动注入依赖项,对控制器类、动作和 HttpKernel 组件的其他部分一无所知。

目前无法做您想做的事。最初,自动装配系统是为域服务设计的,而不是为控制器设计的。

应该可以使用a custom param converter 将自动装配系统与控制器参数桥接起来。不过,我建议你换个方式I've first described here

还有另一种方法我想讨论几次,但我 没有时间写博客。

它是 ADR 模式的派生/类似模式,应用于 Symfony。

  1. 动作是一个带有__invoke() 方法的单个类,其中包含它的所有内容 逻辑(应该只是一些胶水代码行来调用域和 响应者)。
  2. 动作被注册为服务(它可以是 使用编译器传递和一些约定自动化,类似于如何 我们现在发现控制器,能够覆盖 必要时定义)
  3. 在此类操作服务上,启用了自动装配。

这意味着几乎与当前控制器一样容易用于 开发者,但具有显式依赖图和更好的 可重用性。只有真正需要的东西才会被注入。在 事实上,在 Symfony 中使用这样的系统已经是可行的了。我们在 API 平台大师。例如,这是一个动作: https://github.com/dunglas/DunglasApiBundle/blob/master/Action/PostCollectionAction.php

在这个实现中,我还依赖内核事件来实现 即插即用某种逻辑(持久性、验证...) 解耦的方式,但它超出了范围。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 2016-03-12
  • 1970-01-01
  • 2016-08-17
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多