问题标签 [psr-11]
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 框架使用依赖注入容器进行对象实例化的原因是什么?
我将专注于 Zend 框架,因为我最了解它,但这当然适用于其他使用控制反转容器的 PHP 框架中的其他类似机制。
在 Zend Framework 的情况下,通过一些重构/操作,完全可以不使用容器。
工作示例
$container
查看文档,目前 Zend Framework 正在使用(取自此处)做这样的事情:
左侧=>
包含“keys”,可以是任何字符串,包括类定义字符串。右侧是类名的回调或 FQDN。在上面的例子中,它是一个匿名的 PHP 函数,它就像一个工厂来实例化一个新实体,使用$container
通过框架调用传递给该函数的 DiC。
为什么不移除容器并执行以下操作:
如果裸函数很麻烦,上面可以转换为类。
在上面我删除$container
并用硬编码函数调用替换了任何容器使用,new
因为没有提供参数
由于factories
数组是Zend 容器配置的一部分,要真正将其分解出来,我必须Model\AlbumTable::class
用工厂调用替换任何其他容器调用实例,以便返回Model\AlbumTable
实例。完成后,我可以有一个无容器的 Zend 实现,直接调用工厂,而不是通过显式定义所有依赖项的容器调用它们。
问题的精神是……为什么要使用容器,它到底提供了什么,为什么不使用“真正的 PHP 代码”,因为容器不会隐藏任何依赖关系。
php - 找不到运行时接口'Psr\Container\ContainerInterface'的php错误
我最近向我正在开发的 PHP 应用程序上传了一个新依赖项,现在我在 Postman 中不断收到以下错误
致命错误:在第13行 的/var/www/html/api/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php中找不到接口“Psr\Container\ContainerInterface”
我已经更新了作曲家以及许多其他内容,但似乎仍然无法确定问题所在。(也不确定这是否意味着错误是 index.php 文件或 container.php 文件)
这是 container.interface.php 文件中的代码
这是我的 index.php 文件中的初始代码
php - 在控制器类中注入容器
我正在将我的应用程序从 Slim/3 迁移到 Slim/4。也许我很困惑,因为相同的东西有无穷无尽的语法,但我写了这个:
...它没有像我预期的那样工作,因为我得到了两个完全不同的容器实例(通过在 中设置断点来验证\DI\Container::__construct()
):
- 我自己用
$config = new Config();
. - 一个在 处自动创建,
$app->run();
然后作为参数传递给\Foo::__construct()
.
我做错了什么?
php - PHP 中的依赖注入 (slim, php-di)
我有一个 Slim Php (slim4) 应用程序,我在其中添加了 Monolog 以进行日志记录。我将记录器添加到应用程序中,如下所示:
这适用于在我的大多数课程中注入记录器,只需执行以下操作:
现在我还想在中间件中使用记录器,如身份验证。我不知道如何正确地做到这一点。我可以通过将记录器添加为容器中的命名条目来实现此功能,如下所示:
然后通过从容器中取回它作为构造函数参数将其传递给中间件:
但是这个:
- a) 按类名中断其他类的注入
- b) 显然不是最佳实践
那么将这个记录器注入中间件的正确方法是什么?
php - 为什么 PHP PSR-11 Container 不提供设置依赖的方法?
如果我开发一个想要利用依赖容器的库,我认为容器implementation
(php-di、symfony/dependency-injection 等)应该由库的用户决定,最终将它传递给我,因为我的类的构造函数中的示例,如下所示:
现在,如果我想在容器中添加一个条目,如果规范没有提供通用方法,我该如何以一种兼容不同 PSR-11 容器实现的方式来实现呢?我php-di
会调用该set
方法:
退一步说,在许多共同生活的库之间共享容器的方式应该是什么?我错过了什么吗?我不认为每个库都有自己的容器实现是可取的。
先感谢您。