问题标签 [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 - 在控制器类中注入容器
我正在将我的应用程序从 Slim/3 迁移到 Slim/4。也许我很困惑,因为相同的东西有无穷无尽的语法,但我写了这个:
...它没有像我预期的那样工作,因为我得到了两个完全不同的容器实例(通过在 中设置断点来验证\DI\Container::__construct()
):
- 我自己用
$config = new Config();
. - 一个在 处自动创建,
$app->run();
然后作为参数传递给\Foo::__construct()
.
我做错了什么?
php - 如何在 slim 4 中设置和注入多个 PDO 数据库连接?
我可以创建一个实例PDO
并成功注入它。我PDO::class
直接定义并在构造函数中注入了__construct(PDO $pdo)
. 我需要类似的东西PDO1::class
并PDO2::class
像下面这样注入它:__construct(PDO1 $pdo1, PDO2 $pdo2)
但这显然行不通。只有一个PDO
类,我需要做的是具有不同数据库凭据的 2 个实例。
最好的方法是什么?
我通过这样的 PDO 设置了一个数据库定义,它可以工作:
文件:dependencies.php
文件:index.php
文件SomeRepository.php
我在这篇文章中看到过这样的事情:
但这是最好的方法吗?以及如何在无需注入整个容器的情况下访问存储库类中的连接?
php - 在 PHP-DI 中创建对象时,如何执行一段代码?
我这样设置我的依赖项\DI\Container
:
\Adyen\Client
无法在构造中配置,因此我需要在第一次创建后执行一个与configClient()
创建的对象没有任何关联的函数。
是否可以在第一次创建对象时“触发”该方法或任何其他代码$this->container->get('AdyenClient')
,即使需要更改依赖项的设置方式?
据我阅读,官方文档中没有任何类似的场景。
php - PHP-DI 无法将接口连接到带有超薄桥的实现
我来自 .net 和 DI/IOC 容器的世界,如 autofac、ninject 等。
我希望,andphp-di
的文档似乎暗示以下内容应该有效:
index.php / 前端控制器
有问题的“控制器即服务”:
接口和实现,在一个代码块中为简洁起见:
当我用 php 开发服务器运行它并点击<addr>/list
时,我得到(有几个换行符用于可视化和清理我的个人信息):
这似乎暗示我的呼吁addDefinitions
没有以任何方式受到尊重。我已经尝试过DI\get
,DI\autowire
和DI\create
其他任何我能找到的东西......我没有额外的注册,我没有额外的任何有趣的东西。
的所有php-di
文档都说(就像所有 DI 框架应该一样):“类型提示接口并注册要使用的具体类型”但是他们所有的 slim-bridge 示例都只是显示了一个正在注入的类(这要少得多有用的国际海事组织)。至此,如果我将 更改HelloController
为接受 ctor 参数ListRepository
而不是ListRepositoryInterface
一切都按预期工作。
我只是不擅长 php 并且不懂接口和类型提示吗?我是一个糟糕的 php-di 吗?我在做一些 php 开发人员会认为是疯狂的事情吗?我是否只是误解了所有内容并通过 c# 有色眼镜看它?
php - PHP 中的依赖注入 (slim, php-di)
我有一个 Slim Php (slim4) 应用程序,我在其中添加了 Monolog 以进行日志记录。我将记录器添加到应用程序中,如下所示:
这适用于在我的大多数课程中注入记录器,只需执行以下操作:
现在我还想在中间件中使用记录器,如身份验证。我不知道如何正确地做到这一点。我可以通过将记录器添加为容器中的命名条目来实现此功能,如下所示:
然后通过从容器中取回它作为构造函数参数将其传递给中间件:
但是这个:
- a) 按类名中断其他类的注入
- b) 显然不是最佳实践
那么将这个记录器注入中间件的正确方法是什么?
php - 无法使用 php-di 处理依赖注入
这是一个让我发疯了一个多星期的问题。我通过 composer 安装了php-di,并将我自己的项目添加到 composer.json 文件中:
然后我创建了我的 /public/index.php:
这是 /src/Base/Service.php 内容:
当我加载 index.php 时,Apache 说:
我的方法有什么问题?
php - PHP-DI:如何使用自定义构造函数参数值创建接口实现?
我正在使用 php-di 6.0.10
我的 DI 配置中有接口实现:
\App\Writer\WriterInterface::class => DI\get(\App\Writer\Text::class)
它有这样的构造函数:
在我的应用程序中,我想用动态 $filePath 参数实例化编写器:
但我得到这个错误:
DI\Definition\Exception\InvalidDefinition:无法解析条目“App\Writer\Text”:__construct() 的参数 $filePath 没有定义的值或可猜测的完整定义:Object ( class = App\Writer\Text lazy = false __construct( $settings = get(App\Settings) $dataConverter = get(App\DataConverter) $filePath = #UNDEFINED#)
怎么了?我深入研究 DI 代码,发现它像 \DI\Definition\SelfResolvingDefinition 一样处理我的定义,并且没有将参数传递给 resolve() 方法。它仅在我明确指定接口实现时才有效 - App\Writer\Text 用于 make() 方法。但我需要有动态接口实现。
如何让它以我想要的方式工作?
php - 如何使用 php-di 正确注入可重用的控制器注入
我正在启动一个新的 slim 4 应用程序,当前的 slim 版本更像是一个路由器而不是一个框架,并且没有开箱即用的 di 容器,所以我选择PHP-DI
作为 DI 容器。并且不描述容器中的每个控制器,也不将容器实例传递给我正在使用PHP-DI
自动装配的控制器。
但是使用这种方法,我需要将所有依赖项注入每个控制器,并且大多数依赖项都可以被所有控制器重用。例子:
有没有办法制作一个基本控制器,向它注入所有可重用的依赖项,以便在DIc
创建/自动装配每个新控制器时,所有已经注入 bz 控制器的依赖项都扩展了基本控制器?此外,基本控制器可能应该使用方法注入,否则,我仍然需要创建一个构造函数并将每个控制器中的所有注入传递给基本控制器,如下所示:
这可能与在没有基本控制器的情况下向每个控制器注入依赖项相同。
我尝试配置基本控制器:
但它不起作用,并且依赖null
于每个扩展基本控制器的控制器。
PHP-DI
http://php-di.org/doc/best-practices.html#writing-controllers建议使用属性注入,但是对于我来说,为每个控制器注入所有可重用的注入仍然看起来像样板,并且当我们打破封装时注入私有属性。
我能想到的解决方案之一是ControllerHelper
使用所有可重用的依赖项作为桥接器/包装器并注入它而不是所有这些依赖项,它将减少重复代码的数量。但是,也许有更好的解决方案???
更新:我知道它实际上是在 OOP 中工作的,如果你扩展基类,你需要将所有依赖项传递给它。但是为了减少一些重复,这里有一些魔法会很好:)而且它不是一个会被其他人使用的外部包,所以如果有可能以某种方式实现的话,这种魔法可能是可以的。
更新:换句话说,我想要实现的是:
哪里$this-render
是一个BaseController
使用模板引擎依赖来渲染视图的类方法:
如您所见,我不想将依赖项注入到,SomeController
但以某种方式将它们注入一次BaseController
php - PHP-DI 定义未由定义数组中的条目名称索引
在使用 Postman 在 Slim3 中发布 JWT 身份验证的电子邮件和密码时,我收到以下致命错误。我该如何解决这个问题?