rs-world/instantiator

为PHP提供松耦合设计的依赖处理程序

v0.1.0 2020-11-17 10:36 UTC

This package is auto-updated.

Last update: 2024-09-19 22:51:37 UTC


README

Build Status Issues Forks Stars License

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。我将尽快查看并提供反馈。