【发布时间】: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