问题标签 [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.

0 投票
0 回答
187 浏览

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 代码”,因为容器不会隐藏任何依赖关系。

0 投票
1 回答
5157 浏览

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 文件中的初始代码

0 投票
3 回答
2933 浏览

php - 在控制器类中注入容器

我正在将我的应用程序从 Slim/3 迁移到 Slim/4。也许我很困惑,因为相同的东西有无穷无尽的语法,但我写了这个:

...它没有像我预期的那样工作,因为我得到了两个完全不同的容器实例(通过在 中设置断点来验证\DI\Container::__construct()):

  1. 我自己用$config = new Config();.
  2. 一个在 处自动创建,$app->run();然后作为参数传递给\Foo::__construct().

我做错了什么?

0 投票
3 回答
1112 浏览

php - PHP 中的依赖注入 (slim, php-di)

我有一个 Slim Php (slim4) 应用程序,我在其中添加了 Monolog 以进行日志记录。我将记录器添加到应用程序中,如下所示:

这适用于在我的大多数课程中注入记录器,只需执行以下操作:

现在我还想在中间件中使用记录器,如身份验证。我不知道如何正确地做到这一点。我可以通过将记录器添加为容器中的命名条目来实现此功能,如下所示:

然后通过从容器中取回它作为构造函数参数将其传递给中间件:

但是这个:

  • a) 按类名中断其他类的注入
  • b) 显然不是最佳实践

那么将这个记录器注入中间件的正确方法是什么?

0 投票
0 回答
131 浏览

php - 为什么 PHP PSR-11 Container 不提供设置依赖的方法?

如果我开发一个想要利用依赖容器的库,我认为容器implementation(php-di、symfony/dependency-injection 等)应该由库的用户决定,最终将它传递给我,因为我的类的构造函数中的示例,如下所示:

现在,如果我想在容器中添加一个条目,如果规范没有提供通用方法,我该如何以一种兼容不同 PSR-11 容器实现的方式来实现呢?我php-di会调用该set方法:

退一步说,在许多共同生活的库之间共享容器的方式应该是什么?我错过了什么吗?我不认为每个库都有自己的容器实现是可取的。

先感谢您。