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

php - 如何使用特定实例覆盖 DI 容器依赖项?

想象一下,我们有一个Request对象和一个Controller对象。该Controller对象是用一个Request对象构造的,如下所示:

如您所见,这是一个抽象类,因此实际上Controller将构造一个子类。让我们想象一下代码是这样的:

现在假设我们向我们的 . 添加一个依赖项RegistrationController,如下所示:

此时,我想做的是引入一个依赖注入容器,通过构造函数自动注入依赖。为此,我一直在使用PHP-DI。通常,这会是这样的:

然后,这将RegistrationController使用 的实例Request和 的实例进行实例化UserRepo。由于反射,它知道用这些对象构建,但如果我愿意,我也可以通过配置文件覆盖它。

问题是该Request对象采用动态参数。我需要Request传递给的对象RegistrationController是一个特定的实例,一个我刚刚创建的实例。

我基本上希望能够说:“给我一个这个类的实例,它的所有依赖项都注入了,但是对于一个特定的参数,传入这个特定的实例”。

我已经查看了PHP-DI(以及一大堆其他 DI 容器)是否支持特定参数的这种“覆盖”,但到目前为止我找不到任何东西。

我想知道的是:

  • 那里有可以做到这一点的 DI 容器吗?
  • 是否有另一种方法可以使类保持干净(我不想使用注释或其他任何会添加我用作依赖项的容器的方法)?
0 投票
1 回答
196 浏览

php - JMS DIExtraBundle / Symfony 应用程序之外的注释

我目前正在开发一个 symfony 应用程序,我希望在其中实现业务逻辑和框架的松散耦合。我不想依赖整个 symfony 框架,以后也许可以交换框架(并在包之外运行我的业务逻辑)。

Symfony DI Container 是一个独立的组件,可以在没有整个 symfony 框架的情况下使用。所以我基本上可以用这个组件处理我的依赖项(在一个 yml 文件中,通过 PHP 等)。

假设,我想使用JMSDiExtraBundle配置带有注释的依赖项。有没有可能在 symfony 应用程序之外使用这个包?如果不是,那么处理我的依赖关系的最佳选择是什么?我想使用注释:)

  • 使用 PHP、Yaml 或其他任何东西配置容器,无需注释即可工作
  • 将另一个 DI 容器与 Symfony 结合使用,它提供注释(例如PHP-DI
  • 不要独立于 symfony 构建应用程序,也不要交换框架。
0 投票
1 回答
1050 浏览

php - 如何将 PHP-DI 定义设置为 PHPActiveRecord 连接?

我是一个依赖注入的初学者,我在我的 PHP 5.5.9(在 Apache2 和 MySql 下)项目中使用了以下工具:

我所有的课程都是由作曲家自动加载的。

通过阅读它的文档并运行它的与自动装配、注释和配置相关的示例,我已经对 PHP-DI 定义有了一些了解,并且我已经将它与我自己的类一起使用,但现在我对如何设置供应商感到困惑PHPActiveRecord 等库。

通常要使用 PHPActiveRecord,您只需要像这样定义连接设置:

或这个:

最后你的模型应该扩展 ActiveRecord\Model 并且你准备好了。

现在,我正在尝试通过使用注释(例如 PHP-DI 的文档建议)将我的 ActiveRecord 模型注入控制器:

在这里我得到了错误:

看起来,没有提供给 ActiveRecord 的字符串连接。

我只是相信我需要一个正确的文件配置设置(我认为是 DI\factory)来根据上面的连接定义返回一个 ActiveRecord\Config 实例。

让我担心的另一点是 PHPActiveRecord 在它的 API 中有相当多的单例和静态函数,据我所知,由于有点紧密的耦合问题,它被认为是一种反模式,一旦出现这种情况,对 DI 的管理似乎没有好处在没有明确定义的“注入点”的情况下,例如构造函数和/或 setter 注入。

如果您认为我对我的问题不够清楚,请询问我,我可以提供更多信息。

0 投票
1 回答
505 浏览

php - 没有任何第三方框架的 PHP-DI 入门

我刚刚发现依赖注入,我想将它应用到我一直在从事的中型项目中。我已经有一个类文件夹,其中包含系统中使用的所有类

/应用程序/核心/类

我想知道如何配置 PHP-DI 以根据需要定位这些类。

提前致谢

0 投票
3 回答
295 浏览

php - PHP-DI 不能与 ZendFramework2 集成

您能否给我一个提示,为什么PHP-DI 与 Zend Framework 2的集成对我不起作用(使用 Apache/2.4.9 (Win64) PHP/5.5.12 和 Apache/2.2.22 (Win32) PHP/5.3.13 复制) )。

作曲家.json

配置\应用程序.config.php

模块/Morpho/config.module.config.php

配置/di.yml

模块/Morpho/src/Morpho/Controller/PartOfSpeechController

每次在 apache 下运行此代码时,我得到:

您的任何想法将不胜感激。

0 投票
1 回答
331 浏览

php - 为什么在 PHP 框架中使用依赖注入组件

当我第一次看到 PHP-DI、Symfony2 DI 等依赖注入组件时,我发现有一种方法可以通过一个实例化自动将任何类的实例注入到任何类中。

所以1.像2一样在根类中创建实例$foo = new Foo() 。然后我可以在任何对象(如全局单例)中使用这个实例,而无需传递对我要调用的类的构造函数或方法的引用。

但我发现,基本上我可以通过两种方式使用依赖注入 1. 将实例的引用传递给构造函数 2. 创建所有对象所在的容器。此容器可以注入其他类,但“不推荐”。

由于这两种方法都可以在纯 PHP 中轻松完成,第一种很清楚,第二种可以通过静态属性解决,那么为什么要使用 PHP-DI 或 Symfony2 来完成这项工作呢?

0 投票
1 回答
645 浏览

annotations - PHP-DI 注释不起作用

我已经使用 composer 在一个新的自定义项目中安装了 php-di 4.4。我正在使用 php 5.6.3 运行 xampp localhost,但我在这个项目上为 php 5.4 设置了 netbeans。我是 php-di 的新手,我确实在我的 android 项目中使用了注释,但似乎无法让它在这里工作。代码很简单,我正在测试注入看看它是如何工作的,这里是代码:

这是我得到的错误: Call to a member function methodA() on null in D:\Projects\profi\test.php 第 27 行

这是基本实现我不明白为什么它不注入。

先感谢您。

0 投票
1 回答
103 浏览

php - PHP-DI 注册 ctor 注入实例

我正在使用 php-di 并在我的项目中使用 twig。我想用 php-di 注册 $twig 的实例,以便将它的实例注入到需要它的对象的 ctor 参数中。我想使用 php 定义并避免使用 phpdoc 注释,并已阅读此http://php-di.org/doc/php-definitions.html

这是我的基本示例:

然后我在其他一些类中有 $twig 作为 ctor 参数。这甚至可能吗?需要明确的是,我不想为每个使用 $twig 的对象创建一个定义。

我得到的错误表明 php-di 正在尝试创建 Twig_Environment 的新实例,而不是使用已经创建的实例。

0 投票
2 回答
2073 浏览

php - 使用 PHP-DI 将参数注入构造函数

我正在努力让依赖注入以我期望的方式工作 -

我正在尝试注入一个类 Api,它需要知道为特定用户连接到哪个服务器。这意味着在配置文件中覆盖构造函数属性是没有用的,因为每个用户可能需要连接到不同的服务器。

如何使用正确的参数注入此类?是否可以以某种方式覆盖定义?有没有办法通过带参数调用容器来获取类?

为了(希望)澄清 - 我试图调用容器来实例化一个对象,同时将原本在定义中的参数传递给它。

0 投票
0 回答
62 浏览

php - 基于 PHP 构造函数的依赖注入与新的。哪个效率更高?

依赖注入有两种类型http://www.javatpoint.com/dependency-injection-in-spring

  1. 基于构造函数的依赖注入
  2. 基于 Setter 的依赖注入

但是,以下哪一项更有效,为什么?还是它们相同?,换句话说,依赖注入与new对象?

编辑

@Chetan Ameta,Federico,Sougata 通过构造函数或属性设置器进行依赖注入?更多的是关于使用哪种 Dependency 方法。后面的问题是关于证明使用哪种 DI 方法(构造函数或 Setter/Getter)。

但是我的问题是关于 DI 与 new 对象。为什么我们使用 DI?为什么不只是new类并使用对象?注意:在我的问题中,示例代码使用 PHP。体验过 PHP 和 JavaSpring,我看不出在这两种语言中使用 DI 或 OOP 有多大区别。