ooblatron/slipstream

自动依赖注入

1.0.4 2022-12-07 23:08 UTC

This package is auto-updated.

Last update: 2024-09-08 03:11:18 UTC


README

Slipstream 自动化依赖注入,允许您在不修改任何其他类的情况下实时添加或删除依赖。依赖通常通过类的构造函数使用类型提示进行注入。或者,它们可以通过 inject() 方法进行注入。

安装

使用以下命令安装最新版本

$ composer require ooblatron/slipstream -o

请注意 -o 标志。这会生成 Slipstream 所需的 Composer 自动加载类映射。

基本用法

<?php

use Slipstream\SlipstreamFactory;

$vendorPath = '../vendor/'; // Change this to the location of your Composer vendor directory
$classLoader = require $vendorPath.'autoload.php';
$factory = new SlipstreamFactory($classLoader);
$newObject = $factory->get('newObject');

对象会自动注入所有依赖,无需您提供或更新 Pimple 注册细节。

PHP 7.4 示例:具有依赖关系的类

<?php

class NewObject
{
    private Dependency1 $dependency1;
    private Dependency2 $dependency2;
    
    public function __construct(
        Dependency1 $dependency1,
        Dependency2 $dependency2    
    ): {
      $this->dependency1 = $dependency1;
      $this->dependency2 = $dependency2;
    }
    
    public function someMethod() {
        $this->dependency1->doSomething();
    }
}    

PHP 8.1 示例

<?php

class NewObject
{
    public function __construct(
        private Dependency1 $dependency1,
        private Dependency2 $dependency2    
    ): { }
    
    public function someMethod() {
        $this->dependency1->doSomething();
    }
}    

在对象创建后注入依赖

这对于不能通过 __construct() 方法注入依赖的第三方类(例如 Laravel 模型)非常有用。此示例依赖于您的工厂已经创建(见上方)。

<?php

class ExistingObject
{
    public function inject(
        private Dependency1 $dependency1,
        private Dependency2 $dependency2    
    ): { }
    
    public function someMethod() {
        $this->dependency1->doSomething();
    }
}    
<?php

use Slipstream\Slipstream;

class ClassUsingExistingObject
{
    public function __construct(
        Slipstream $slipstream,
        ExistingObject $existingObject
    ) {
        $this->slipstream = $slipstream;
        $this->existingObject = $existingObject;
    }
    
    public function methodThatUsesExistingObject() {
        // Inject dependencies into ExistingObject
        $this->slipstream->inject($this->existingObject);
    }
}

添加新类

Slipstream 依赖于 Composer 自动加载类映射来识别依赖。因此,每次您创建或重命名一个类或更改类的命名空间时,必须运行以下命令。

composer dump-autoload -o

文档

关于

要求

  • PHP 7.1 或更高版本

工作原理

PHP 反射与 Composer 自动加载映射结合使用,以识别正在实例化的类的依赖项。这些依赖项会迭代实例化并注入到新对象中。

作者

Tim Rogers - tim@ooblatron.org - https://twitter.com/timdrogers

许可

Slipstream 在 MIT 许可证下发布 - 详细信息请参阅 LICENSE 文件

鸣谢

Laravel

此库受到了 Laravel 自动将依赖注入到控制器方法的方式的启发。

Pimple

此库使用 Pimple 依赖管理器 来存储已实例化的类以供重用和注入。