rs-world / instantiator
为PHP提供松耦合设计的依赖处理程序
v0.1.0
2020-11-17 10:36 UTC
Requires
- php: ^7.1 || ^8.0
Requires (Dev)
- phpunit/phpunit: ^9.4
README
Instantiator
Instantiator是一个非常轻量级的库,实现了Instantiator模式来解决软件组件或类之间的依赖问题。有关Instantiator模式的更多信息,请访问此链接。
入门指南
Instantiator非常易于使用和处理依赖关系。它的一个非常好的特性是它非常灵活。
使用composer获取Instantiator
Instantiator
库尚未添加到packgist中。因此,您需要将此仓库添加到您的composer中并安装它。您可以将以下内容添加到您的composer.json文件中
{ "repositories": [ { "url": "https://github.com/rs-world/instantiator.git", "type": "git", "no-api": true } ], "require": { "rs-world/instantiator": "*" }, "minimum-stability": "dev", "prefer-stable": true }
安装完毕后,您可以在项目中使用它。
如何使用Instantiator
要使用instantiator,您必须扩展Instantiator类
。以下是一个示例,它为Database类
创建了一个Instantiator
class DatabaseIntantiator extends Instantiator { protected function register() { $this->instance([ "default" => function($a, $b) { return new \Path\To\Database($a, $b); }, "test" => function($a, $b) { return new \Path\To\FakeDatabase($a, $b); } ]); } public function get(A $a, B $b): \Path\To\DatabaseInterface { return $this->getInstance($a, $b); } }
现在,您可以使用DatabaseInstantiator类如下
// in default mode $dbi = new DatabaseInstantiator(); $db = $dbi->get($a, $b); var_dump($db instanceof \Path\To\Database); // prints true // in test mode $dbi = new DatabaseInstantiator("test", true); $db = $dbi->get($a, $b); var_dump($db instanceof \Path\To\DatabaseFake); // prints true
您可以将Instantiator
的模式设置为全局的test
。为此
// set global mode to "test" Instantiator::setGlobalMode("test"); // now $dbi = new DatabaseInstantiator(); $db = $dbi->get($a, $b); var_dump($db instanceof \Path\To\Database); // prints false var_dump($db instanceof \Path\To\DatabaseFake); // prints true
使用Instantiator解决依赖关系
您可以使用Instantiator轻松处理依赖关系。假设有一个Service类依赖于Database。那么
class ServiceInstantiator extends Instantator { protected function register() { // ... // ... $dbi = new \Path\To\DatabaseInstantiator( $this->getMode(), $this->getFallback() ); $db = $dbi->getInstance($a, $b); $this->instance([ "default" => function($x) use($db) { return \Path\To\Service($db, $x); } ]); } public function get($x): ServiceInterface { return $this->getInstance($x); } }
您可以使用它如下
// ... $si = new ServiceInstantiator(); $service = $si->get($x); // ...
您不必担心数据库实例化,也不必担心在测试时使用哪个数据库类,因为当模式设置为“test”时,“DatabaseFake”将被实例化。这使您的任务变得如此简单!
无论您是在生产环境中还是在测试或开发应用程序时,Instantiator都提供了许多功能。Instantiator的文档正在制作中,任何类型的贡献都非常受欢迎。
许可证
要了解项目许可证,请访问此处。
贡献
该项目正在继续进行,它具有很大的发展潜力。因此,如果您有任何想法或改进,请发送一个pull request。我将尽快查看并提供反馈。