问题标签 [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 投票
1 回答
234 浏览

symfony - PHP-DI Symfony Bridge 如何工作以及如何正确设置它?

通过使 PHP-DI 6 和 Symfony 4 组合工作,我遇到了一些问题。所以我想更深入地了解它是如何工作的/应该如何工作并检查我是否真的正确配置了它。

Symfony 默认使用自己的 DI 容器,symfony/dependency-injection. 在App\Kernel里面有一个“钩子”的方法configureContainer(...)。在这种方法中,可以配置 DIC。DIC 配置的另一个地方是services.yaml.

现在我安装php-di/php-diphp-di/symfony-bridge设置它并在App\Kernel#buildPHPDIContainer(...)PHP -DI 文档中解释:

理论部分:

之后会发生什么/应该发生什么?Symfony DIC 是否变为非活动状态?如果不是,是否意味着应用程序同时使用了两个 DIC?禁用 Symfony 的 DIC 有意义吗?

总的来说:PHP-DI Symfony Bridge 的想法/方法是什么——替换框架的 DIC 或将其自身集成到其中?

实用部分:

我在上面描述了让 PHP-DI 与 Symfony 一起工作的设置步骤。还有其他事情要做吗?例如,应该AppKernel\configureContainer(...)保持原样还是应该成为 PHP-DI 的代理AppKernel\buildPHPDIContainer(...)?是否应该services.yaml删除?

0 投票
1 回答
1573 浏览

dependency-injection - 如何在 PHP-DI 的定义中使用 autowire(...)、create(...) 和 get(...)?

PHP-DI 6 提供了多个在定义中工作的函数。其中三个似乎在定义上下文中做同样的事情:autowire(...)create(...)get(...)。例如,我有以下类型:

FooServiceInterface注入 Symfony 控制器(构造函数注入)。

现在我的文件包含定义:

有用。

我也可以这样设置:

它仍在工作。

这个

不起作用。

和这个

做。

这三个函数之间有什么区别(在定义的上下文中)?推荐使用哪一个函数来设置通用接口依赖定义(如SomeInterface::class => DI\recommendedFunction(SomeClass::class))?

0 投票
1 回答
2126 浏览

php - PHP DI - 无法解析 __construct() 的参数 $logger 没有定义或猜测的值

我正在尝试获取 PHP-DI 工作的基本示例,但我很容易被困在一个相当基本的示例中。我假设我在这里遗漏了一些简单的东西,但无法将其单独列出。

它没有识别 LoggerInterface 类型的提示,但这是直接从示例中提取的,所以我不明白我做错了什么。

当我从服务签名中删除 LoggerInterface 时,该示例运行良好。

服务等级:

配置文件

用法:

例外:

object(DI\Definition\Exception\InvalidDefinition)#115 (7) {
["message":protected]=> string(196) "Entry "TestService" 无法解析:__construct() 的参数 $logger 没有定义值或可猜测的完整定义:对象 (class = arkon\ServiceLayer\TestService lazy = false)"

0 投票
2 回答
311 浏览

php - 如何使用 PHP-DI 将用户数据从控制器传递到服务

我的控制器有一个帐户对象和一个用户对象,几乎所有与后端的交互都依赖于这些对象来设置访问权限、限制数据加载、++++(我没有使用任何特定的框架)

我的控制器有不同的方式知道要使用哪些对象,但通常这是在登录用户的会话中(但后端进程可能会从队列等中获取此信息)。

所以,我正在尝试为我的 ServiceLayer 设置 PHP-DI,我需要将 Account、User 对象注入到服务中,但是我该如何以一种好的方式来确保它们具有正确的值呢?

我的第一次尝试是将其传递给 ContainerFactory:

然后在配置中动态使用这些值,但是当我启用编译时,由于值被缓存,这停止了工作。(很明显但是是的..)

我可以使用工厂来创建 userObject 和 Account 对象,例如直接从工厂中的会话中读取值。但这感觉很脏,并且只在某些情况下有效。

该文档仅处理特定于环境的值,因此我没有找到有关如何处理特定于会话的数据的任何好的描述。

有什么建议的模式吗?

0 投票
1 回答
319 浏览

php - PHP DI 注释不起作用

我刚开始使用PHP-DI,它很棒,但是我无法解决一个问题。

这是我的服务定义

我的班级定义如下

具有该配置我收到以下错误

无法解析条目“services.report”:__construct() 的参数 $repository 没有定义或猜测的值 完整定义:对象 ( class = \CRM\Report\Service\ReportService lazy = false __construct( $repository = #UNDEFINED# ) )

我试图调试源代码,并注意到甚至AnnotationReader没有创建一个实例。

但是当使用以下定义时

一切正常。

我的配置有什么问题?

0 投票
1 回答
48 浏览

php - 自动装配配置中的所有类或

我使用 php-di 在我的 API-Application 中自动加载类。

然而,为了速度,php-di 声明您必须手动自动装配类以进行编译。所以他们给了我们这个例子:

我不明白我们必须自动装配哪些类进行编译。所有课程?还是只有控制器?

由于应用程序很大,我可以想象这个 DiC 配置文件会变得有多大。不仅如此,如果我创建一个新的存储库或模型,那么我不应该忘记将它添加到我的 DiC 配置中。

来源: http: //php-di.org/doc/performances.html

0 投票
1 回答
279 浏览

php - PHPUnit 与 Slim 和 PHP-DI 一起使用

我认为我的应用程序存在设计缺陷。我会解释为什么。

我有一个围绕 httpclient 的包装器,它被注入(通过 php-di)到各种其他类中。

我使用 Slim 创建一个 api。当调用进入我的应用程序时,Slim 会将它引导到正确的控制器,该控制器注入了一个 httpclient。(实际上,注入 httpclient 的不是控制器,但我试图在示例中保持简单)

现在到单元测试(集成测试)部分。我使用引导文件来初始化 slim(使用 php-di 桥接器)。我对每个环境都有不同的文件。所以另一个类(存根,如果你喜欢的话),作为 httpclient 注入到控制器中。

到目前为止,一切都很好。现在我想根据我的意愿改变这个 httpclient-stub 的结果。像这样:

不幸的是,我无法从测试函数中访问 $httpclientStub。我现在使用单例类将变量从测试传递到存根。这是相当丑陋的。

对于更好的“存根”解决方案有什么建议吗?

0 投票
2 回答
2584 浏览

php - PHP-DI 无法解析:条目无法解析:__construct() 的参数 xxxxxx 没有定义值或可猜测的完整定义

只是把它扔在这里,因为我找不到很多关于这个错误的信息,我花了大约 2 个小时才找到它。掌心

在 container.php -> DBService 中定义为:

类型:DI\Definition\Exception\InvalidDefinition 消息:无法解析条目“PVS\HomeController”:无法解析条目“PVS\DBService\DBService”:__construct() 的参数 $settings 没有定义或猜测的值完整定义:对象( 类 = PVS\DBService\DBService 懒惰 = false __construct( $settings = #UNDEFINED# $session = get(PVS\Helpers\Storage\Contracts\SessionInterface) $validator = get(PVS\Validation\Contracts\ValidatorInterface) ) ) 完整定义: Object ( class = PVS\HomeController lazy = false __construct( $container = get(Psr\Container\ContainerInterface) $view = get(Slim\Views\Twig) $router = get(Slim\Router) $flash = get( Slim\Flash\Messages) $session = get(PVS\Helpers\Storage\Contracts\SessionInterface) $db = get(PVS\DBService\DBService) ) ) 文件:

所以我开始在我的容器或 DBService.php 本身中寻找问题。问题实际上出在错误消息第一行的控制器中。

0 投票
1 回答
1370 浏览

symfony - 如何在 Symfony 4 中注册事件监听器?

我正在编写一个 Symfony 应用程序。含义:应用程序具有 Symfony 应用程序的结构并使用 Symfony 的M VC(symfony/http-kernelsymfony/routing),但应尽可能独立于框架。因此,我使用的是PHP-DI 而不是框架的 DI

现在我已经添加了symfony/event-dispatcher组件并为所有自定义事件注册了一个监听器。

services.yaml

在我的system.event_handlerPHP-DI 依赖文件中定义:

现在我收到一个错误:

运行时异常

“system.event_handler”的定义没有类。如果您打算在运行时动态注入此服务,请将其标记为 synthet=true。如果这是一个仅由子定义使用的抽象定义,请添加abstract=true,否则指定一个类以消除此错误。

为什么?以这种速度使用别名是错误的吗?

好的,我已经用services.yaml我的事件处理程序的 FQCN 替换了别名:

没有错误了。但是事件处理程序仍然没有被添加到EventDispatcher.

如何在 Symfony 4 中注册事件监听器(在 PHP-DI 容器中定义)?

0 投票
0 回答
283 浏览

symfony - 如何在 Symfony 的 services.yaml 中使用 PHP-DI 中定义的服务?

我正在编写一个应用程序,它具有 Symfony 应用程序的结构和一些 Symfony 功能,但应尽可能与框架分离。因此,我使用的是PHP-DI 而不是框架的 DI

现在我需要 Symfony EventDispatcher(我的框架解耦架构的苦药,但无论如何......)。我的问题是,我没有从services.yamlPHP-DI 容器中获得引用——而且我的听众没有开始附加到EventDispatcher.

如何在中使用 PHP-DI 容器的服务services.yaml(特别是对于EventDispatcher,如果它有任何细节)?


这是一些代码:

services.yaml(完全地)

App\Kernel(完全地)

/config/dependencies/common.php(带有依赖项的文件,相关提取)