问题标签 [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.
php - 在 PHP-DI6 中注册 Slim 的 PHP-View
我正在尝试同时学习 Slim 框架和 PHP-DI。我不希望人们为我编写代码,但我在这里完全停滞不前。我要做的就是弄清楚如何使用 PHP-DI 的 Slim Bridge 将 Slim 的 PHP-View 对象传递到控制器类中。从那里,我会搞砸并弄清楚事情。但我什至无法让它发挥作用。我在想我一直在看的 Codecourse 教程可能已经过时了,因为它也不起作用,而且它使用 Twig 来启动,我暂时不想这样做,因为它只是一个我必须学习的东西......任何帮助将不胜感激。
php - 为什么标量参数值注入在构造函数中不起作用?
我有设置类:
并为 PHP-DI 配置:
当我启动我的应用程序时,它说:
DI\Definition\Exception\InvalidDefinition:无法解析条目“App\Kernel”:无法解析条目“App\Settings”:__construct() 的参数 $dir 没有定义或猜测的值
当我用一种方法设置所有值时,它可以正常工作:
怎么了?我没有进行任何额外的 DI 配置。
PHP-DI v6.0.2、PHP 7.2.5
php - PHP-DI 使用带有工厂的注解注入
我有一个创建对象的工厂。
工厂正在使用字符串和依赖注入(MySQL 类)创建该对象。在我的Abbruchprotokoll::class
我有一个注入注释:
问题是,这个注入注释没有解决。我想这是因为我在上FactoryResolver
并且没有injectMethodsAndProperties()
喜欢ObjectCreator
。
我可以以其他方式将注入注释与工厂一起使用吗?
php - PHP-DI:创建与自动装配与获取。或者如何正确地将接口映射到定义提供的实现
对于 Web MVC 中的 PHP-DI 容器,我为路由器准备了以下定义:
现在我想将一个接口 ( ) 映射到条目MyLib\Routing\RouterInterface
提供的实现。'router'
在 PHP-DI 文档中,我发现了三种实现此目的的方法。像这样的东西:
RouterInterface::class => DI\create('router')
RouterInterface::class => DI\autowire('router')
RouterInterface::class => DI\get('router')
当我应用第 3 个选项时,一切正常,例如,我可以使用以下命令检索接口条目:
但是,当我尝试前两个选项时,我收到了错误:
所以我想问一下:您能否向我解释一下,在这种情况下,这三个选项之间有什么区别?
谢谢
完成接受的答案:
@MatthieuNapoli 的答案是正确的。我会根据我运行的测试(见下文)得出以下结论来完成它。
结论:
帮助程序起作用create()
,并且autowire()
不以任何方式引用容器中的条目。他们接收一个类名作为参数,并确保该类的对象是新创建的(一次)。即使现有容器定义的名称与类名相同,即使该条目已经创建了相同类型的对象,也会发生这种情况。
仅辅助函数get()
引用容器条目,而不是类名(正如 Matthieu 已经友好地介绍的那样)。
测试:
1)我定义了以下类:
2)我定义了以下容器条目:
3)我执行了以下代码:
4)我收到以下结果:
php - PHP DI 和强制转换接口
我不明白,例如我正在使用 php-di 容器,我有 ClassA 和 ClassB,它们都是实现 Intreface1 我正在通过 DI 创建这两个类的对象
现在,当我将 ClassA 注入构造函数时,我需要准确地注入这个类,它创建了这个 classA 的依赖项,而不是 Intreface1
我可以以某种方式说这个特定的 ClassA 应该实现 intrefeca1 吗?在 PHP-DI 的文档中我发现
但我不明白它是如何工作的,LoggerIntreace 它只是一个将此文本映射到对象的字符串
php - PHP-DI:注入构造函数的接口将无法正确解析
当注入构造函数时,我似乎无法让 PHP-DI 正确解析其配置类的接口。在下面的代码中,使用容器获取\Foo\IDog会返回一个Poodle类,但是当使用容器获取\Foo\Kennel(在构造函数中有一个\Foo\IDog)时,它不再识别它被配置为返回一个贵宾犬和错误说:
这是概念证明:
奇怪的是,如果我从中删除所有命名空间,它工作正常(这里没有命名空间:https ://gist.github.com/brentk/51f58fafeee8029d7e8b1e838eca3d5b )。
知道我做错了什么吗?
php - 将实体与模型分开或将它们保留为一个类 (SpotORM)
我正在逐步在我的项目中加入 ORM(使用 SpotORM)和依赖注入(使用 PHP-DI),并且我想把它做对。现在我无法弄清楚实体和模型是否应该是两个不同的类,或者只是一个。
Entity 类如下所示:
这使我可以访问firstname
with $person->get("firstname")
or $person->getFirstname()
。
我想创建一个getFullName()
返回名字后跟姓氏的方法。我的第一个想法是把它写在这个实体类中,效果很好。
现在我想对 getSlug() 之类的方法使用依赖注入,使用来自库的 Slugifier。但是我不能在构造函数中注入它,因为它具有特定的签名并且仅由 SpotORM 调用。
所以我认为我需要有一个单独的类来放入我的方法,但是 ORM 不知道它,例如,如果我通过关系从组织实体获取人员实体列表,我不知道没有我的其他方法。
解决这个问题的通常方法是什么?
php - 如何获取 PHP DI 容器?
如何使用PHP DI加载数据库容器?这是迄今为止我尝试过的变体之一。
设置.php
初始化文件
SystemUserDetails.php
MyApp\Models\SystemUser\SystemUserDetails::__construct() 函数的参数太少,在第 54 行的 /www/myapp/models/SystemUser.php 中传递了 0,而预期的文件正好是 1 文件:/www/myapp/models/SystemUser/SystemUserDetails .php
数据库不应该自动加载吗?
痕迹:
目前,我的主
index.php
文件扩展init.php
了它创建容器的文件(在帖子中粘贴了代码部分)。然后我调用
App
类,它获取 URL(mysite.com/login/user_login) 并实例化一个新的控制器类并运行上述方法,在这种情况下,它是第一页 -MyApp/Contollers/Login.php
。- 该
user_login
方法获取凭据,验证它们,如果它们有效,则使用 SystemUser 对象登录。
- 该
系统用户类:
php - 如何从我想要的任何类中获取 PHP-DI 容器的实例?
我在我的 PHP 项目中使用 PHP-DI 6 容器。在我的程序开始时,我只是初始化容器并获取Application
注入所有依赖项的类。
在下图中,您可以看到我在项目中使用的类。
Asterisk Dispatcher 被注入到 Application 类中。
然后,在AsteriskDispatcher
类中,我需要创建一个 Asterisk Manager 实例列表,该列表在不久的将来也将包含一些依赖项。
我不想通过所有类继承容器。有没有办法将 PHP-DI 容器初始化为单例,所以我可以随时使用它来创建一些对象?
这就是我现在这样做的方式,我只是在我的AsteriskDispatcher
类中创建了一个新的 PHP-DI 容器实例,这看起来太糟糕了。
我真的很想了解如何在不违反 SOLID 原则的情况下使用 PHP-DI 容器。
php - 使用 PHP-DI 注入模拟对象以使用 PHPUnit 测试控制器
我已经按照“最佳实践”中的建议重构了一些控制器,以通过属性注入使用依赖注入:
我的 PHP-DI 配置被配置为注入AnimalClient
对象的实例AnimalClientInterface
,这在实现代码中很好,因为只有 1 个 real AnimalClient
。
在我的单元测试中,我需要将 aMockZebraClient
注入此属性。我不能像我那样简单地配置它,AnimalClient
因为其他类可能被类似地注释但需要,例如,MockTigerClient
用于测试。
这是我的单元测试:
我认为使用该injectOn
方法是解决此问题的正确方法,但我不知道如何配置容器以选择正确的模拟对象进行正确的测试。
由于遗留代码结构,构造函数注入是不可能的。应用程序中的所有控制器都需要重构以使用 DI 来更改Controller
.