问题标签 [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.
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-di
和php-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
删除?
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)"
php - 如何使用 PHP-DI 将用户数据从控制器传递到服务
我的控制器有一个帐户对象和一个用户对象,几乎所有与后端的交互都依赖于这些对象来设置访问权限、限制数据加载、++++(我没有使用任何特定的框架)
我的控制器有不同的方式知道要使用哪些对象,但通常这是在登录用户的会话中(但后端进程可能会从队列等中获取此信息)。
所以,我正在尝试为我的 ServiceLayer 设置 PHP-DI,我需要将 Account、User 对象注入到服务中,但是我该如何以一种好的方式来确保它们具有正确的值呢?
我的第一次尝试是将其传递给 ContainerFactory:
然后在配置中动态使用这些值,但是当我启用编译时,由于值被缓存,这停止了工作。(很明显但是是的..)
我可以使用工厂来创建 userObject 和 Account 对象,例如直接从工厂中的会话中读取值。但这感觉很脏,并且只在某些情况下有效。
该文档仅处理特定于环境的值,因此我没有找到有关如何处理特定于会话的数据的任何好的描述。
有什么建议的模式吗?
php - PHP DI 注释不起作用
我刚开始使用PHP-DI
,它很棒,但是我无法解决一个问题。
这是我的服务定义
我的班级定义如下
具有该配置我收到以下错误
无法解析条目“services.report”:__construct() 的参数 $repository 没有定义或猜测的值 完整定义:对象 ( class = \CRM\Report\Service\ReportService lazy = false __construct( $repository = #UNDEFINED# ) )
我试图调试源代码,并注意到甚至AnnotationReader
没有创建一个实例。
但是当使用以下定义时
一切正常。
我的配置有什么问题?
php - 自动装配配置中的所有类或
我使用 php-di 在我的 API-Application 中自动加载类。
然而,为了速度,php-di 声明您必须手动自动装配类以进行编译。所以他们给了我们这个例子:
我不明白我们必须自动装配哪些类进行编译。所有课程?还是只有控制器?
由于应用程序很大,我可以想象这个 DiC 配置文件会变得有多大。不仅如此,如果我创建一个新的存储库或模型,那么我不应该忘记将它添加到我的 DiC 配置中。
来源: http: //php-di.org/doc/performances.html
php - PHPUnit 与 Slim 和 PHP-DI 一起使用
我认为我的应用程序存在设计缺陷。我会解释为什么。
我有一个围绕 httpclient 的包装器,它被注入(通过 php-di)到各种其他类中。
我使用 Slim 创建一个 api。当调用进入我的应用程序时,Slim 会将它引导到正确的控制器,该控制器注入了一个 httpclient。(实际上,注入 httpclient 的不是控制器,但我试图在示例中保持简单)
现在到单元测试(集成测试)部分。我使用引导文件来初始化 slim(使用 php-di 桥接器)。我对每个环境都有不同的文件。所以另一个类(存根,如果你喜欢的话),作为 httpclient 注入到控制器中。
到目前为止,一切都很好。现在我想根据我的意愿改变这个 httpclient-stub 的结果。像这样:
不幸的是,我无法从测试函数中访问 $httpclientStub。我现在使用单例类将变量从测试传递到存根。这是相当丑陋的。
对于更好的“存根”解决方案有什么建议吗?
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 本身中寻找问题。问题实际上出在错误消息第一行的控制器中。
symfony - 如何在 Symfony 4 中注册事件监听器?
我正在编写一个 Symfony 应用程序。含义:应用程序具有 Symfony 应用程序的结构并使用 Symfony 的M VC(symfony/http-kernel
等symfony/routing
),但应尽可能独立于框架。因此,我使用的是PHP-DI 而不是框架的 DI。
现在我已经添加了symfony/event-dispatcher
组件并为所有自定义事件注册了一个监听器。
services.yaml
在我的system.event_handler
PHP-DI 依赖文件中定义:
现在我收到一个错误:
运行时异常
“system.event_handler”的定义没有类。如果您打算在运行时动态注入此服务,请将其标记为 synthet=true。如果这是一个仅由子定义使用的抽象定义,请添加abstract=true,否则指定一个类以消除此错误。
为什么?以这种速度使用别名是错误的吗?
好的,我已经用services.yaml
我的事件处理程序的 FQCN 替换了别名:
没有错误了。但是事件处理程序仍然没有被添加到EventDispatcher
.
如何在 Symfony 4 中注册事件监听器(在 PHP-DI 容器中定义)?
symfony - 如何在 Symfony 的 services.yaml 中使用 PHP-DI 中定义的服务?
我正在编写一个应用程序,它具有 Symfony 应用程序的结构和一些 Symfony 功能,但应尽可能与框架分离。因此,我使用的是PHP-DI 而不是框架的 DI。
现在我需要 Symfony EventDispatcher
(我的框架解耦架构的苦药,但无论如何......)。我的问题是,我没有从services.yaml
PHP-DI 容器中获得引用——而且我的听众没有开始附加到EventDispatcher
.
如何在中使用 PHP-DI 容器的服务services.yaml
(特别是对于EventDispatcher
,如果它有任何细节)?
这是一些代码:
services.yaml
(完全地)
App\Kernel
(完全地)
/config/dependencies/common.php
(带有依赖项的文件,相关提取)