问题标签 [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 回答
504 浏览

php - 在 PHP-DI6 中注册 Slim 的 PHP-View

我正在尝试同时学习 Slim 框架和 PHP-DI。我不希望人们为我编写代码,但我在这里完全停滞不前。我要做的就是弄清楚如何使用 PHP-DI 的 Slim Bridge 将 Slim 的 PHP-View 对象传递到控制器类中。从那里,我会搞砸并弄清楚事情。但我什至无法让它发挥作用。我在想我一直在看的 Codecourse 教程可能已经过时了,因为它也不起作用,而且它使用 Twig 来启动,我暂时不想这样做,因为它只是一个我必须学习的东西......任何帮助将不胜感激。

0 投票
1 回答
169 浏览

php - 为什么标量参数值注入在构造函数中不起作用?

我有设置类:

并为 PHP-DI 配置:

当我启动我的应用程序时,它说:

DI\Definition\Exception\InvalidDefinition:无法解析条目“App\Kernel”:无法解析条目“App\Settings”:__construct() 的参数 $dir 没有定义或猜测的值

当我用一种方法设置所有值时,它可以正常工作:

怎么了?我没有进行任何额外的 DI 配置。

PHP-DI v6.0.2、PHP 7.2.5

0 投票
1 回答
163 浏览

php - PHP-DI 使用带有工厂的注解注入

我有一个创建对象的工厂。

工厂正在使用字符串和依赖注入(MySQL 类)创建该对象。在我的Abbruchprotokoll::class我有一个注入注释:

问题是,这个注入注释没有解决。我想这是因为我在上FactoryResolver并且没有injectMethodsAndProperties()喜欢ObjectCreator

我可以以其他方式将注入注释与工厂一起使用吗?

0 投票
1 回答
895 浏览

php - PHP-DI:创建与自动装配与获取。或者如何正确地将接口映射到定义提供的实现

对于 Web MVC 中的 PHP-DI 容器,我为路由器准备了以下定义:

现在我想将一个接口 ( ) 映射到条目MyLib\Routing\RouterInterface提供的实现。'router'在 PHP-DI 文档中,我发现了三种实现此目的的方法。像这样的东西:

  1. RouterInterface::class => DI\create('router')
  2. RouterInterface::class => DI\autowire('router')
  3. RouterInterface::class => DI\get('router')

当我应用第 3 个选项时,一切正常,例如,我可以使用以下命令检索接口条目:

但是,当我尝试前两个选项时,我收到了错误:

所以我想问一下:您能否向我解释一下,在这种情况下,这三个选项之间有什么区别?

谢谢


完成接受的答案:

@MatthieuNapoli 的答案是正确的。我会根据我运行的测试(见下文)得出以下结论来完成它。

结论:

帮助程序起作用create(),并且autowire()不以任何方式引用容器中的条目。他们接收一个类名作为参数,并确保该类的对象是新创建的(一次)。即使现有容器定义的名称与类名相同,即使该条目已经创建了相同类型的对象,也会发生这种情况。

仅辅助函数get()引用容器条目,而不是类名(正如 Matthieu 已经友好地介绍的那样)。

测试:

1)我定义了以下类:

2)我定义了以下容器条目:

3)我执行了以下代码:

4)我收到以下结果:

0 投票
1 回答
1073 浏览

php - PHP DI 和强制转换接口

我不明白,例如我正在使用 php-di 容器,我有 ClassA 和 ClassB,它们都是实现 Intreface1 我正在通过 DI 创建这两个类的对象

现在,当我将 ClassA 注入构造函数时,我需要准确地注入这个类,它创建了这个 classA 的依赖项,而不是 Intreface1

我可以以某种方式说这个特定的 ClassA 应该实现 intrefeca1 吗?在 PHP-DI 的文档中我发现

但我不明白它是如何工作的,LoggerIntreace 它只是一个将此文本映射到对象的字符串

0 投票
1 回答
1998 浏览

php - PHP-DI:注入构造函数的接口将无法正确解析

当注入构造函数时,我似乎无法让 PHP-DI 正确解析其配置类的接口。在下面的代码中,使用容器获取\Foo\IDog会返回一个Poodle类,但是当使用容器获取\Foo\Kennel(在构造函数中有一个\Foo\IDog)时,它不再识别它被配置为返回一个贵宾犬和错误说:

这是概念证明:

奇怪的是,如果我从中删除所有命名空间,它工作正常(这里没有命名空间:https ://gist.github.com/brentk/51f58fafeee8029d7e8b1e838eca3d5b )。

知道我做错了什么吗?

0 投票
0 回答
52 浏览

php - 将实体与模型分开或将它们保留为一个类 (SpotORM)

我正在逐步在我的项目中加入 ORM(使用 SpotORM)和依赖注入(使用 PHP-DI),并且我想把它做对。现在我无法弄清楚实体和模型是否应该是两个不同的类,或者只是一个。

Entity 类如下所示:

这使我可以访问firstnamewith $person->get("firstname")or $person->getFirstname()

我想创建一个getFullName()返回名字后跟姓氏的方法。我的第一个想法是把它写在这个实体类中,效果很好。

现在我想对 getSlug() 之类的方法使用依赖注入,使用来自库的 Slugifier。但是我不能在构造函数中注入它,因为它具有特定的签名并且仅由 SpotORM 调用。

所以我认为我需要有一个单独的类来放入我的方法,但是 ORM 不知道它,例如,如果我通过关系从组织实体获取人员实体列表,我不知道没有我的其他方法。

解决这个问题的通常方法是什么?

0 投票
1 回答
1399 浏览

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

数据库不应该自动加载吗?

痕迹:

  1. 目前,我的主index.php文件扩展init.php了它创建容器的文件(在帖子中粘贴了代码部分)。

  2. 然后我调用App类,它获取 URL(mysite.com/login/user_login) 并实例化一个新的控制器类并运行上述方法,在这种情况下,它是第一页 - MyApp/Contollers/Login.php

    1. user_login方法获取凭据,验证它们,如果它们有效,则使用 SystemUser 对象登录。

系统用户类:

0 投票
1 回答
1420 浏览

php - 如何从我想要的任何类中获取 PHP-DI 容器的实例?

我在我的 PHP 项目中使用 PHP-DI 6 容器。在我的程序开始时,我只是初始化容器并获取Application注入所有依赖项的类。

在下图中,您可以看到我在项目中使用的类。

类图

Asterisk Dispatcher 被注入到 Application 类中。

然后,在AsteriskDispatcher类中,我需要创建一个 Asterisk Manager 实例列表,该列表在不久的将来也将包含一些依赖项。

我不想通过所有类继承容器。有没有办法将 PHP-DI 容器初始化为单例,所以我可以随时使用它来创建一些对象?

这就是我现在这样做的方式,我只是在我的AsteriskDispatcher类中创建了一个新的 PHP-DI 容器实例,这看起来太糟糕了。

我真的很想了解如何在不违反 SOLID 原则的情况下使用 PHP-DI 容器。

0 投票
1 回答
672 浏览

php - 使用 PHP-DI 注入模拟对象以使用 PHPUnit 测试控制器

我已经按照“最佳实践”中的建议重构了一些控制器,以通过属性注入使用依赖注入:

我的 PHP-DI 配置被配置为注入AnimalClient对象的实例AnimalClientInterface,这在实现代码中很好,因为只有 1 个 real AnimalClient

在我的单元测试中,我需要将 aMockZebraClient注入此属性。我不能像我那样简单地配置它,AnimalClient因为其他类可能被类似地注释但需要,例如,MockTigerClient用于测试。

这是我的单元测试:

我认为使用该injectOn方法是解决此问题的正确方法,但我不知道如何配置容器以选择正确的模拟对象进行正确的测试。

由于遗留代码结构,构造函数注入是不可能的。应用程序中的所有控制器都需要重构以使用 DI 来更改Controller.