pchouse / php-di
依赖注入库
1.0.0
2023-12-20 17:09 UTC
Requires
- php: ~8.2 || ~8.3
- joaomfrebelo/log4php: 3.0.1
Requires (Dev)
- jetbrains/phpstorm-attributes: >=1
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.0
- sebastianbergmann/php-text-template: ^1.1
- slam/phpstan-laminas-framework: ^v1.5
- squizlabs/php_codesniffer: ^3.8
This package is auto-updated.
Last update: 2024-09-15 10:37:55 UTC
README
依赖注入库
安装
composer require pchouse/php-di
用法
创建一个返回数组的绑定文件
Binds.php
return [ new Bind( Scope::TRANSIENT, IDependency::class, Dependency::class ), new Bind( Scope::TRANSIENT, IDependencyWiredOne::class, DependencyWiredOne::class ), new Bind( Scope::TRANSIENT, IDependencyWiredTwo::class, DependencyWiredTwo::class ), new Bind( Scope::SINGLETON, IDependencyWiredSingleton::class, DependencyWiredSingleton::class ), new Bind( Scope::PROVIDES, DependencyProvides::class, function () { $provides = new DependencyProvides(); $provides->setRandom( (new Randomizer())->getInt(9, 99999) ); return $provides; } ), new Bind( Scope::SINGLETON, DependencyProvidesSingleton::class, function () { $provides = new DependencyProvidesSingleton(); $provides->setRandom( (new Randomizer())->getInt(9, 99999) ); return $provides; } ), ];
创建一个返回数组的路由文件
Routes.php
return [ new Bind(Scope::ROUTE, IDependencyController::class, DependencyController::class), ];
在 bootstrap.php 或其他位置配置容器
Container::$bindsFilePath = "/path/to/Binds.php"; Container::$routesFilePath = "/path/to/Routes.php";
使用注入的类的示例
如果有参数,将构造函数标记为 #[Inject]
如果你想要使用事件,将需要注入的属性标记为 #[Inject]。实现 IDIEvents 接口以使用事件
class Dependency implements IDIEvents, IDependency { private bool $afterInstanceCreatedInit = false; private bool $beforeReturnInstanceInit = false; #[Inject] private IDependencyWiredOne $dependencyWiredOne; private int $rand = 0; #[Inject] public function __construct(private IDependencyWiredTwo $dependencyWiredTwo) { } public function getDependencyWiredOne(): IDependencyWiredOne { return $this->dependencyWiredOne; } public function setDependencyWiredOne(IDependencyWiredOne $dependencyWiredOne): void { $this->dependencyWiredOne = $dependencyWiredOne; } public function getDependencyWiredTwo(): IDependencyWiredTwo { return $this->dependencyWiredTwo; } public function setDependencyWiredTwo(IDependencyWiredTwo $dependencyWiredTwo): void { $this->dependencyWiredTwo = $dependencyWiredTwo; } public function afterInstanceCreated(): void { $this->afterInstanceCreatedInit = true; } /** * @throws \Exception */ public function beforeReturnInstance(): void { if (!$this->afterInstanceCreatedInit) { throw new \Exception( "The AfterInstanceCreated did not run" ); } $this->beforeReturnInstanceInit = true; } public function isAfterInstanceCreatedInit(): bool { return $this->afterInstanceCreatedInit; } public function isBeforeReturnInstanceInit(): bool { return $this->beforeReturnInstanceInit; } public function getRand(): int { return $this->rand; } public function setRand(int $rand):void { $this->rand = $rand; } }
在代码的任何部分手动获取实例
$instance = \PChouse\Di\Container::get(ICalssName); // OR $route = \PChouse\Di\Container::getRoute(IClassName);
在测试模式下使用模拟构建
在测试 bootstrap.php 中设置一个常量:const PHP_DI_TEST = 1;
只有标记为模拟的实例将在容器中替换
Container::build( [ new Bind(Scope::MOCK, IDependencyWiredSingleton::class, $mock) ] ); $dependency = Container::get(IDependency::class);
作用域
Scope::TRANSIENT // Allways a new instance Scope::SINGLETON // Create a singleton instance Scope::PROVIDES // For manually created instaces
许可证
版权所有 © 2023 Reflexão, Sistemas e Estudos Informáticos, Lda
在此特此授予任何获取本软件及其相关文档副本(以下简称“软件”)的人士,在不受限制的情况下使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许将软件提供给他人使用,但受以下条件的约束:
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。