问题标签 [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.
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;
php - 如何为使用 ServiceLocatorTagPass 创建的 ServiceLocator 中的服务设置 ID?
我正在尝试使用创建服务定位器ServiceLocatorTagPass
,如下所示:
上面使用的类:
以上似乎工作正常。我看我可以$container->get('the_service')
的。我可以检查这是true
:
但是,如果我尝试通过服务定位器的 ID 从服务定位器获取各个服务,我什么也得不到:
显然我可以通过 ID'0'
和获得服务'1'
,这不太理想:
如何ServiceLocatorTagPass
为包含的服务设置 ID 集?有可能吗?
为了方便起见,整个事情都可以在这里运行。
(以上内容已更改,因此它适合所有可以运行的脚本,但这实际上是编译器传递和该编译器传递测试的一部分)
php - 编译 ContainerBuilder 会移除别名
我正在测试一个注册了几个别名的捆绑扩展。
在我的测试中,我会做:
并且测试将通过。
但是......如果我$container->compile()
在断言之前打电话:
测试将失败。如果我检查$container->getAliases()
,它是空的。
为什么在编译期间删除所有别名?
这是重现这种情况的简短脚本:
(这里可以直接执行)
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命令开始显示以下内容
但它仍然没有解决这种情况,因为我仍然得到与以前相同的异常。
找不到服务“购物车”:即使它存在于应用程序的容器中,里面的容器
php - 装饰服务的循环引用问题
正如文档所建议的那样,我编写了此服务以将 uuid 添加到规范化对象:
和services.yaml
但是突然(直到昨天一切都很好)当我运行作曲家或缓存清除时它开始给我这个错误
在 CheckCircularReferencesPass.php 第 67 行:检测到服务“App\Serializer\ApiNormalizer”的循环引用,路径:“App\Serializer\ApiNormalizer -> 序列化程序 -> App\Serializer\ApiNormalizer”。
symfony - Symfony:使用参数数组中的值作为服务参数
Symfony 3.4
我有一个看起来像这样的参数:
parameters.yml
:
我想将我的some_configuration
参数中的一个值直接传递给服务,而不是它some_configuration
本身。像这样的东西:
services.yml
:
这有可能吗?
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有问题。就像导入覆盖参数和服务只使用最后一个?如何将我的服务及其参数拆分到多个文件中?
谢谢 !
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
仅在错误说它正在使用的同一文件中声明,我没有找到此类的任何重复声明。但是项目没有编译,因为有错误。这是一个全新的项目,还没有任何代码或捆绑包。
php - 将动态参数传递给 Symfony 中的服务工厂
我正在将 Symfony 集成到具有自己基于 PSR-11 的依赖容器的旧应用程序中。一直在寻找一种将 DI 容器合并到 Symfony 使用的解决方案,但一无所获。为了让它发挥作用,我提出了一个我不喜欢的“hacky”解决方案。
我已经创建了这个类。它在其中创建一个旧 DI 容器的实例:
并将适当的条目添加到services.yaml
:
通过上述技巧,将这些类放在服务类构造函数中是可行的。不幸的是,它看起来很糟糕,用更多的存储库来扩展它会很痛苦(尤其是当有 50 个时)。是否有可能实现这样的目标services.yaml
?
这将使我services.yaml
在旧应用程序的单个命名空间中只有一个条目。
但是,也许我的问题还有其他解决方案?一直在尝试配置Kernel.php
和prepareContainer(...)
方法,但我也一无所获,因为旧的依赖项位于一个返回数组的 PHP 文件中:
php - 在测试中提供私有和已删除的服务
我正在尝试使vatin-bundle与 Symfony 6 兼容。
但测试失败
在编译容器时,“验证器”服务或别名已被删除或内联。您应该将其公开,或者直接停止使用容器并改用依赖注入。
这似乎是Symfony 6中的新功能
static::getContainer() 中的容器实际上是一个特殊的测试容器。它使您可以访问公共服务和未删除的私人服务服务。
validator
再次在测试中可用的首选方式是什么?
我发现的唯一方法是创建自己的别名,例如
并使用新别名。有没有更好的办法?