问题标签 [symfony-dependency-injection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
271 浏览

php - 如何在自定义捆绑控制器中使用原则 - “控制器具有必需的构造函数参数并且容器中不存在。”

我有一个带有两个自定义可重用包的 Symfony 5.3 项目。

我在bundle1中创建了一个实体,我希望能够从bundle2中读取和写入它

但是,我无法成功地将 Doctrine 包含在我的任何捆绑控制器中。

我已经尝试了一切:扩展控制器,扩展AbstractController,添加构造函数来传递教义,将控制器定义为服务,但我无法得到任何工作。

项目/bundle1/src/Controller/testController.php:

错误:

URI "/list" 的控制器不可调用:控制器 "Bundle1\TestController\TestController" 具有必需的构造函数参数并且在容器中不存在。您是否忘记将控制器定义为服务?

编辑** 以下内容已根据@Cerad 的帮助进行了修改,但不幸的是相同的错误消息仍然存在。

我正在使用自动装配,并且通过依赖注入加载了以下 services.xml:

项目/bundle1/Resources/config/services.xml:

我已经使用注释进行路由

项目/config/routes/annotations.yaml 文件:

当我php bin/console debug:container 'bundle1.controller.test_controller'在控制台中运行时,我得到:

未找到与“bundle1.controller.test_controller”匹配的服务。

项目/bundle1/src/Bundle1.php

项目/配置/bundles.php

似乎我没有正确地将我的控制器定义为服务,但在文档中找不到有关如何执行此操作的明确信息。

**更新:


刚刚在错误堆栈中找到了这个**

ArgumentCountError 函数 Bundle1\TestController\TestController::__construct() 的参数太少,在第 147 行的 /home/Project/vendor/symfony/http-kernel/Controller/ControllerResolver.php 中传递了 0,而预期的正好是 1

在 bundle1/src/Controller/TestController.php(第 17 行)类 TestController { private $entityManager; 公共函数 __construct(EntityManagerInterface $entityManager) { $this->em = $entityManager;

0 投票
1 回答
31 浏览

php - 如何为使用 ServiceLocatorTagPass 创建的 ServiceLocator 中的服务设置 ID?

我正在尝试使用创建服务定位器ServiceLocatorTagPass,如下所示:

上面使用的类:

以上似乎工作正常。我看我可以$container->get('the_service')的。我可以检查这是true

但是,如果我尝试通过服务定位器的 ID 从服务定位器获取各个服务,我什么也得不到:

显然我可以通过 ID'0'和获得服务'1',这不太理想:

如何ServiceLocatorTagPass为包含的服务设置 ID 集?有可能吗?

为了方便起见,整个事情都可以在这里运行。

(以上内容已更改,因此它适合所有可以运行的脚本,但这实际上是编译器传递和该编译器传递测试的一部分)

0 投票
1 回答
44 浏览

php - 编译 ContainerBuilder 会移除别名

我正在测试一个注册了几个别名的捆绑扩展。

在我的测试中,我会做:

并且测试将通过。

但是......如果我$container->compile()在断言之前打电话:

测试将失败。如果我检查$container->getAliases(),它是空的。

为什么在编译期间删除所有别名?

这是重现这种情况的简短脚本:

(这里可以直接执行)

0 投票
0 回答
100 浏览

php - Symfony 5 symfony/dependency-injection 容器不按名称处理服务

在配置文件services.yaml中,我创建了几个具有名称的服务

我在我的控制器中使用这些服务

但是由于某种原因,通过这样的服务调用,我得到了一个例外。

服务“cart”未找到:即使它存在于应用程序的容器中,“App\Controller\CartController”中的容器是一个较小的服务定位器,只知道“doctrine”、“http_kernel”、“parameter_bag”、“request_stack” ”、“路由器”、“security.authorization_checker”、“security.csrf.token_manager”、“security.token_storage”和“session”服务。尝试改用依赖注入。

bin/console debug:container命令显示容器包含我的服务,但由于某种原因它们没有命名

然后我改变了我的services.yaml如下

之后,我的服务获得了名称,并且bin/console debug:container命令开始显示以下内容

但它仍然没有解决这种情况,因为我仍然得到与以前相同的异常。

找不到服务“购物车”:即使它存在于应用程序的容器中,里面的容器

0 投票
1 回答
524 浏览

php - 装饰服务的循环引用问题

正如文档所建议的那样,我编写了此服务以将 uuid 添加到规范化对象:

services.yaml

但是突然(直到昨天一切都很好)当我运行作曲家或缓存清除时它开始给我这个错误

在 CheckCircularReferencesPass.php 第 67 行:检测到服务“App\Serializer\ApiNormalizer”的循环引用,路径:“App\Serializer\ApiNormalizer -> 序列化程序 -> App\Serializer\ApiNormalizer”。

0 投票
2 回答
57 浏览

symfony - Symfony:使用参数数组中的值作为服务参数

Symfony 3.4

我有一个看起来像这样的参数:

parameters.yml

我想将我的some_configuration参数中的一个值直接传递给服务,而不是它some_configuration本身。像这样的东西:

services.yml

这有可能吗?

0 投票
1 回答
227 浏览

php - Symfony DependencyInjection:导入多个资源(yaml)

我正在尝试在非 Symfony 项目中实现 Symfony 依赖注入组件 ( https://symfony.com/doc/current/components/dependency_injection.html ) 。

如果我将所有服务和参数放入一个“services.yaml”文件中,效果会很好。前任:

由于文件变得非常大,我想将其拆分为不同的文件,如下所述:https ://symfony.com/doc/current/service_container/import.html#importing-configuration-with-imports

所以我尝试了:

但是在这种配置中,我收到以下错误:

致命错误:未捕获的 Symfony\Component\DependencyInjection\Exception\RuntimeException:无法自动装配服务“OtherNamespace\Database\Drivers\MySqlDriver”:方法“__construct()”的参数“$host”是类型提示的“字符串”,您应该配置它的价值明确。

如果我切换导入顺序,那么是CookieSession有问题。就像导入覆盖参数和服务只使用最后一个?如何将我的服务及其参数拆分到多个文件中?

谢谢 !

0 投票
1 回答
199 浏览

compiler-errors - 无法声明 Symfony DependencyInjection 类,因为该名称已在使用中

我创建了一个新的 symfony 5.3 项目。我正在使用六边形架构开发这个应用程序。

我添加了一个我为另一个 symfony 项目开发的 Bundle。此捆绑包在原始项目中工作。但在新项目中,我收到以下错误:

文件夹结构是:

MycompanyUserBundle 的代码是:

MycompanyUserExtension 的代码是:

命名空间 UserBundle 在 composer.json 中声明

并且捆绑也在 config/bundles.php 中声明为UserBundle\MycompanyUserBundle::class => ['all' => true],

该捆绑包也在映射下的 config/packages/doctrine.yaml 中引用

MycompanyUserExtension仅在错误说它正在使用的同一文件中声明,我没有找到此类的任何重复声明。但是项目没有编译,因为有错误。这是一个全新的项目,还没有任何代码或捆绑包。

0 投票
1 回答
187 浏览

php - 将动态参数传递给 Symfony 中的服务工厂

我正在将 Symfony 集成到具有自己基于 PSR-11 的依赖容器的旧应用程序中。一直在寻找一种将 DI 容器合并到 Symfony 使用的解决方案,但一无所获。为了让它发挥作用,我提出了一个我不喜欢的“hacky”解决方案。

我已经创建了这个类。它在其中创建一个旧 DI 容器的实例:

并将适当的条目添加到services.yaml

通过上述技巧,将这些类放在服务类构造函数中是可行的。不幸的是,它看起来很糟糕,用更多的存储库来扩展它会很痛苦(尤其是当有 50 个时)。是否有可能实现这样的目标services.yaml

这将使我services.yaml在旧应用程序的单个命名空间中只有一个条目。

但是,也许我的问题还有其他解决方案?一直在尝试配置Kernel.phpprepareContainer(...)方法,但我也一无所获,因为旧的依赖项位于一个返回数组的 PHP 文件中:

0 投票
1 回答
60 浏览

php - 在测试中提供私有和已删除的服务

我正在尝试使vatin-bundle与 Symfony 6 兼容。

但测试失败

在编译容器时,“验证器”服务或别名已被删除或内联。您应该将其公开,或者直接停止使用容器并改用依赖注入。

这似乎是Symfony 6中的新功能

static::getContainer() 中的容器实际上是一个特殊的测试容器。它使您可以访问公共服务和未删除的私人服务服务。

validator再次在测试中可用的首选方式是什么?

我发现的唯一方法是创建自己的别名,例如

并使用新别名。有没有更好的办法?