问题标签 [php-di]

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 投票
2 回答
379 浏览

php - PHP-DI调用默认参数为null的方法

我正在尝试对具有默认参数的方法使用PHP-DI 调用,但出现此错误

致命错误:未捕获的 Invoker\Exception\NotEnoughParametersException:无法调用可调用对象,因为没有为参数 1 提供值...

PS:PHP-DI 6

0 投票
1 回答
963 浏览

php - 将 PHPUnit 与 PHP-DI 一起使用

我正在使用 PHP-DI 库,它通过使用引导程序和配置文件非常适合我的代码,正如 PHP-DI 文档所推荐的那样。

然后,在我的应用程序中,我通过调用引导程序来获取容器并开始工作:

所以现在我正在尝试使用 PHPUnit 设置单元测试。

我想在每个 Test 类中获取 $container ,以便我可以按照 PHP-DI 文档中的建议使用 $container->injectOn($this) 注入每个测试的所有依赖项。

我偶然发现了这个未解决的问题 [这主要是在我的脑海中],但它仍然是开放的,似乎没有任何建议。

https://github.com/PHP-DI/PHP-DI/issues/125

我唯一的想法是我可以像我的主应用程序一样在 setUp() 中调用引导程序吗?

这是我应该做的吗?有没有更优雅或推荐的方法来做到这一点?

谢谢!

0 投票
1 回答
51 浏览

php-di - PHP-DI:无论如何,定义文件以什么顺序加载到容器中?

我计划在单独的目录和多级子目录中拥有许多定义文件(例如配置文件)。让我们假设,这些文件将包含许多复杂的定义情况——可以这么说。

所以我想问:无论如何,定义文件以什么顺序加载到容器中?

注意:在与某个应用程序环境(如“prod”、“dev”等)对应的配置文件中找到的定义将始终覆盖“正常”定义。因此,这与最终答案无关。

谢谢你。

0 投票
1 回答
223 浏览

php - 如何从 index.php 中调用独白?

有使用 PHP-DI 的 Monolog 示例(从手册中,有 2 个文件 - index.php 和 config.php:

此 config.php 在以下代码中使用:

我现在如何在 index.php 中使用它?我经常这样使用 Monolog:

但是如何用 Container 来调用它?我能够在简单的 $container->set(), $container->get() 模式下做到这一点。但是以这种方式使用 Container Builder 我找不到办法。此外,当我制作时var_dump($container),其中没有任何记录器的迹象。

0 投票
1 回答
164 浏览

php - 通过 setter 方法进行依赖注入

在 PHP 中存在依赖注入问题,我似乎无法找到答案。好的,快速的 PHP 类:

我正在使用来自http://php-di.org/的 php-di 包,尽管我愿意更改。我的问题是,如何直接注入到 add_order() 函数中?构造注入很简单,例如:

我希望发生相同类型的注入,但同时直接调用 add_order() 函数。我想要这样的东西:

有什么帮助吗?谢谢~

0 投票
3 回答
1271 浏览

php - php-di 如何访问容器定义

我有一些配置文件返回键值数组

我已将它作为定义添加到 php-di 容器中

问题是如何在 di 容器内使用的类的某些方法中从配置文件访问数据?

可以说我有一些课程

所以当我打电话时

一切都开始了,但我不知道如何访问注册类的方法中的定义数据,因为我在容器本身内没有容器实例来调用 smth

0 投票
2 回答
466 浏览

php - PHP-DI says missing parameter while in definition file has set

I am new to PHP-DI and I really do not understand what do I miss.

I have a container:

In the definition file:

And int the MyTestClass

For some reason I am getting this error message:

Fatal error: Uncaught DI\Definition\Exception\InvalidDefinition: Entry "Vendor\MyTestClass" cannot be resolved: Entry "Monolog\Logger" cannot be resolved: Parameter $name of __construct() has no value defined or guessable Full definition: Object ( class = Monolog\Logger lazy = false __construct( $name = #UNDEFINED# $handlers = (default value) array ( ) $processors = (default value) array ( ) ) ) Full definition: Object ( class = Vendor\MyTestClass lazy = false __construct( $logger = get(Monolog\Logger) ) ) in /var/www/dmholding.lh/vendor/php-di/php-di/src/Definition/Exception/InvalidDefinition.php on line 18

I am doing exactly as in the documentation.

Can somebody look at it?

0 投票
0 回答
74 浏览

php - 通过 php-di 进行依赖注入的定义

使用 php-di 进行依赖注入,但我显然没有做正确的事情。想知道是否有人可以告诉我我做错了什么。

好的,有一个 bootstrap.php 文件,里面没有命名空间,看起来像:

我相信您至少可以看到我正在尝试做的事情,并且它在技术上确实有效,尽管我确信我做错了。

我希望它可以互换,例如,您可以轻松地为 monolog/monolog 包翻转 Internet 记录器,或更改默认日志通道名称,或将数据库驱动程序翻转为 mysql 以外的某个类等。

但是,这些类相互依赖,因此必须按此顺序设置,如果放在 ContainerBuilder->AddDefinitions() 方法中,它只会抛出一个错误,说 app::class 无法解析。例如,log::class 构造函数注入了“app:class”,db::class 的构造函数同时注入了 app::class 和 loggerInterface::class 等。另外,我需要能够在定义这些时放入基于名称的参数。

任何见解都会有所帮助,因为我非常怀疑这是最好的方法,即使它确实有效。我是否应该只将容器注入到每个调用中,然后通过“container->get()”方法获取必要的对象/类?如果我可以直接注入构造函数,它会更好,更容易阅读。

任何帮助/见解将不胜感激。

0 投票
1 回答
33 浏览

php - 如何在php-di中注册calss以在实例化时自动调用某些方法

我以这种方式运行控制器

现在在控制器内部,如果我尝试自动装配模型,我需要使用模型

我收到有关错误参数类型的错误。控制器方法不应该总是使用一些模型,因为这个模型需要在方法内部实例化。

好的,然后我尝试直接实例化模型

但我收到的问题是我需要模型内的容器实例(例如,设置数据库连接,并且这些设置在容器内注册)。我可以像这样将容器实例从控制器传输到模型:

但是每次我需要一些模型时我都必须这样做,这很丑......

我是 php-di 的新手。我知道当我在方法内部实例化时 DI 不跟踪它......只是不知道如何完全设置它?

0 投票
1 回答
102 浏览

php - PHP-DI 使用先前定义的类

我正在尝试改进我的 PHP-DI 配置,但现在我卡住了。

我想为另一个类重用一个已经定义的类。

entityManager类应该来自Database->getEntityManager

这是我的 di 配置文件的一部分:

当我注入数据库时​​,效果很好。注释的定义效果很好,但我想实现的是最后一行,但它失败了。

这是我的数据库类的完整实现:

当我的代码需要实例化时,entityManager我收到此错误:

似乎它没有使用先前定义的数据库事物。

我错了什么?