问题标签 [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-Skeleton 中演示的 PHP-DI 设置访问 slim4 的 routeParser?
我已经建立了一个基于 SlimPHP 团队的Slim Skeleton应用程序的新应用程序。在我的路由定义中,我希望能够访问Slim4 文档中描述的路由解析器。因此,例如,我希望能够编辑骨架的app/routes.php文件,如下所示:
$app->getRouteCollector()->getRouteParser()
不起作用是有道理的,因为$app
这里没有定义。但我认为我们会改为调用$this->getRouteCollector()->getRouteParser();
,但这会产生错误:"Call to undefined method DI\\Container::getRouteCollector()"
。
看来我的困惑肯定是关于依赖注入,这对我来说是新的,对我来说不是自然而然的。老实说,我很想在其他地方(在 index.php 中?)定义 $routeParser 变量,这样我就可以在任何路由定义中访问它,而不必每次都调用 $app->getRouteCollector()->getRouteParser()。但目前我愿意接受任何有效的方法。
php - PHP-DI 容器配置
这是我之前的问题(范围很差)的后续问题,这让我意识到我需要了解更多关于 DI 的知识:
- 有人能解释一下 PHP-DI Demo 中依赖注入的哪些方面和相关概念吗?如果容器支持自动装配,下面显示的配置是什么?
https://github.com/PHP-DI/demo
具体来说,我看到演示似乎正在使用默认的自动接线设置(即启用),但仍有配置发生,如下所示
https://github.com/PHP-DI/demo/blob/master/app/config.php
- 具体关于 DI 和自动装配概念,如果我也有一个
SQLArticleRepository
实现ArticleRepository
呢?我如何能够使用运行时值在存储库类型之间进行选择?
php - 共享对象的相同实例:auryn 与 PHP-DI
我正在尝试构建我的第一个无框架 PHP 应用程序,并且正在关注本教程。我对教程中描述的一些概念相对较新。尽管如此,我还是决定使用PHP-DI作为依赖注入器,而不是建议的(rdlowrey/auryn)。
除了文件Bootstrap.php
(和文件Dependencies.php
:
$class
Homepage
只能是只有一个方法 ( )的类的实例show()
,在 (**) 中调用:
综上所述,应用程序返回一个 200 HTTP 响应,其主体为空 [此处 (*)],但如果我尝试在 (***) 之后打印 HTTP 响应的内容,我会得到正确的响应。这可能意味着 HttpResponse 类有两个不同的实例。(那正确吗?)
通过使用教程作者rdlowrey/auryn,使用该方法share()
在类之间共享相同的HttpReponse实例,如“原始”Dependencies.php
文件所示:
有没有办法使用 PHP-DI(使用 PHP 定义)获得相同的行为?
这是我的版本Dependencies.php
:
php - 使用 Ray Di 在构造函数中动态注入数据
我正在尝试使用ray di在构造函数中注入数据。但我遇到了一些问题。这是我的代码
现在我正在使用两个类Db
& PostgreDb
。后来我打算使用新的类MysqlDb
,比如SqliteDb
等。我不想configure()
每次创建新类时都改变。
谁能帮我?谢谢。
php - 带有延迟注入 mysqli 的 PHP-DI 显示警告尚未允许属性访问
我有一个控制台应用程序。我的应用程序使用 PHP-DI 来自动连接应用程序和引导。我的服务使用 mysqli,所以我使用 PHP Di 作为惰性创建它,我的服务通过自动连接使用它们。
如果我在 mysqli 定义中删除了惰性,它可以正常工作而没有问题,但是当我使用惰性时,它会盯着显示警告。
php - 使用 php-di 在 slim 4 中集成学说
尝试将教义与 slim 4 和 php-di 一起使用,我无法通过 autowire 运行它。按照我的设置:
索引.php
然后我的存储库:
目前我收到以下错误消息:
有人可以告诉我如何分别解决这个问题是否有任何其他可能更清洁/更简单的方法来使用 php-di 集成学说?
更新
参考无法自动装配的提示,ClassMetadata
我将结构更改如下:
索引.php
用户服务/核心/模型/User.php:
和 userservice/infrastructure/UserRepository.php:
现在我在 UserRepository 构造(getRepository)中收到以下错误:
我怎样才能让教义找到实体?
php - 从 Slim 4 中的路由组覆盖注入的类?
我有一个 Slim4 应用程序,由多个模块组成,这些模块分隔在不同的路由组中,如下所示:
MyMiddleware 接收一个接口
当我们设置容器时,我们告诉它要注入哪个类,以便 PHP-DI 知道使用哪个类来构造中间件:
和
我的主要问题是:
是否有可能以某种方式覆盖IMyInterface::class
基于路由组的容器设置的实现?所以我可以有类似的东西:
主容器设置:
具体路由组容器设置:
php - 为什么 PHP-DI 中的 PHP 定义不起作用?
我尝试在我的项目的处理程序(服务)中注入依赖项
我的处理程序
RegionRepository
- 一个接口,RegionSQL
是实现
我试图用类似 commandBus 的东西运行一个处理程序
$this->commandBus->execute(new CreateRegionCommand('address', 'postal_code', 'country'));
命令总线
但我得到一个错误
Too few arguments to function Region\Application\Command\CreateRegionHandler::__construct(), 0 passed and exactly 1 expected in Region\Application\Command\CreateRegionHandler.php:
如何进入$repository
我的CreateRegionHandler
?我试过CreateRegionHandler::class => autowire(Region\Infrastructure\Persistance\RegionSql::class)
了,但它也不起作用。谢谢
php - PHPUnit测试具有依赖关系的类的特定方法
在阅读了相当多的文档后,我想出了这个函数来测试服务方法findAllUsers
。我首先创建存储库的存根,然后告诉相关方法findAllusers
返回什么(是的,它们在 repo 和服务中具有相同的名称),然后创建一个我想UserService.php
用 repo 存根和空实例测试的类的实例。
类的构造函数UserService.php
和UserValidation.php
我觉得给类提供空实例并不是很优雅。有没有更清洁的方法?我想我想要的是创建一个UserService
仅提供相关依赖项(模拟UserRepository
实例)的实例,并让其余部分由 di 容器自动装配,php-di
这有意义吗?我听说过创建一个用于测试的容器,该容器返回手动创建的具有默认返回值的假类,因为它无论如何都用于稍后的集成测试。我很想看到一些例子和变体。
我对自动化测试非常陌生,因此欢迎对此功能提出任何批评,即使它与问题没有直接关系。
编辑
在阅读了评论和答案之后,我认为我可以想象的理想功能是在容器中注册UserService
类,该容器使用所需的自定义依赖项(在我的情况下是模拟UserRepository
)和(对于最少的开销)进行实例化其他依赖项的空模拟,不仅用自定义模拟替换存储库,还让自动装配功能注入真正的依赖项。但也许我在这里错了,我不知道注入真正的依赖项是否更慢或更多开销。
为了实现这一点,尽管在容器中注册新依赖项的函数必须以某种方式检测给定的参数(UserRepository
如果有多个,则包含或数组)和所需的缺失依赖项(UserValidation
and Logger
)并模拟它们并最终创建UserService
with cutom的实例UserRepository
和被嘲笑的UserValidation
and Logger
。
这是我的编程和 PHP 知识有限的地方,因为我不知道一种干净的编程方式。可能我不是第一个这样做的人,无论如何它是非常反模式的,但是如果我知道你对这个想法的看法以及为什么这可能是一个坏主意以及如何做到这一点,我会很有趣。