Box,PHP的智能自动连接容器。

0.6.2 2020-05-19 10:59 UTC

This package is auto-updated.

Last update: 2024-09-10 18:08:35 UTC


README

Box,PHP的智能自动连接容器。

CI Style CI Codecov License Last Version

入门指南

安装

您可以使用Composer安装此库,如果您还没有安装,请下载它

您可以选择运行以下命令

composer require delights/box

或者通过在您的composer.json中添加一个需求

{
  "require": {
    "delights/box": "0.3.0"  
  }
}

添加需求后,别忘了运行composer install

在深入自动连接和其他功能之前,我们需要创建一个容器实例。

use Delights\Box\Container;

$container = new Container();

绑定

您可以将一些内容绑定到容器中,它的工作方式就像一个键 => 值数组。

$container->bind('key', 'value');
echo $container->resolve('key'); // prints "value"

如果您需要更具体的参数,您可以在闭包中绑定一个类,

$container->bind(Crawler::class, function () {
    return new Crawler('f4dg65gd6fg465g');
});

每次您请求Crawler::class时,这个闭包都会被执行,并创建一个新的Crawler实例。为了避免这种情况,您可以使用singleton方法。

$container->singleton(Connection::class, function () {
    return new Connection();
});

现在,Connection类将只实例化一次,闭包将不会再次执行。

您可能想为您的Crawler使用一个接口,这样您就可以轻松地交换实例和其他内容。然而,当需要CrawlerInterface时,您想要检索Crawler实例。而不是手动绑定这些类,您可以使用bindToImplementation方法。

$container->bindToImplementation(CrawlerInterface::class, Crawler::class);
// same as
$container->bindToImplementation(CrawlerInterface::class, new Crawler);
// same as
$container->bindToImplementation(CrawlerInterface::class, function () {
    return new Crawler;
});

解析

智能解析参数是此包的主要目标。您可以解析需要参数的任何内容,包括构造函数、闭包、方法、函数。我们甚至支持解析有注解的属性。

自动连接

自动连接允许容器使用反射API自动解析依赖关系。

use Delights\Box\Container;
$container = new Container();

class SomeClass {}
$container->resolve(SomeClass::class); // returns an instance of "SomeClass" 

class SomeOtherClass {
    public function __construct(SomeClass $dep) {
        $this->dep = $dep;
    }
}
$container->resolve(SomeOtherClass::class); 
// returns an instance of "SomeOtherClass"
// with $this->dep set to an instance of "SomeClass"

容器可以解析非类型化的参数,但只有两种情况:它们应该允许为null或具有默认值。

解析对象方法

class PostsRepository {
    public function all() {
        return ['My article'];    
    }
}

class PostController {
    public function index(PostsRepository $repository) {
        return $repository->all();    
    }
}

$container->call(PostController::class, 'index');
// This returns |'My article']

解析闭包

$container->closure(function (SomeClass $class) {
    return $class instanceof SomeClass;
}); // returns true

使用任意参数解析

class Vec2 {
    protected int $x;
    protected int $y;

    public function __construct(int $x, int $y) {
        $this->x = $x;
        $this->y = $y;
    }
}
$container->resolve(Vec2::class, [
    'x' => 2,
    'y' => 4
]); // returns an instance of "Vec2" 

顺序无关紧要,在我们的例子中,它可以是[x, y][y, x]

您可以将任意参数传递给任何解析函数。

单例

您可能想要有一个全局容器,它可以在您的应用程序中保持相同的绑定。

通常,您想要避免这种行为。

use Delights\Box\PersistentContainer;

PersistentContainer::getInstance();

在这里,当您第一次调用它时,将创建一个新实例。然而,如果您已经创建了一个实例,将返回相同的实例。

静态代理

有一个小捷径。

use Delights\Box\PersistentContainer;

// instead of this
PersistentContainer::getInstance()->bind('some', 'thing');

// you can do that
PersistentContainer::bind('some', 'thing');

这适用于任何PersistentContainer的公共方法。

安全

如果您发现任何与安全相关的问题,请通过oss@dorns.fr发送电子邮件,而不是使用问题跟踪器。

致谢

许可

版权所有 2020 Félix Dorn

特此授予任何获得此软件及其相关文档副本(“软件”)的人免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许获得软件的人进行此类操作,但受以下条件的限制:上述版权声明和本许可声明应包含在软件的所有副本或主要部分中

本软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的,包括但不限于对适销性、特定用途的适用性和非侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担责任,无论该责任源于合同行为、侵权行为或其他,以及与软件的使用或其他相关事宜。