codeburner/container

史上最快的IoC容器。

v2.0.0 2016-12-11 03:57 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:50:21 UTC


README

Software License Build Status Code Coverage Quality Score

SensioLabsInsight

为您的构建提供最快IoC容器包,以构建快速的Web应用程序。

感谢Tom Butler,他的dice公告激励了我,这是一个快速的依赖注入容器。

##安装

codeburner/container添加到您的composer.json文件中,并更新或安装composer依赖项。

{
    "require": {
        "codeburner/container": "^2.0"
    }
}

或通过CLI

$ composer require codeburner/container --save

##使用方法

简介

欢迎来到Codeburner快速容器文档!在开始使用之前,建议您了解本包所有部分的 主要目标和使命。

性能

Codeburner项目创建以性能为重点的包,基准测试即将到来!

概念

容器负责自动实例化新对象,解析所有类依赖项,并存储这些对象。这使您可以移除硬编码的类依赖项,并在运行时动态注入依赖项,从而提高了灵活性。

使用方法

在您准备好要实例化的类后,您只需要注册绑定并调用即可。

use Codeburner\Container\Container;

$container = new Container;

// Regiser a "stdClass" class to a "std" key.
$container->set('std', 'stdClass');

// Accessing new "stdClass" objects.
$container->get('std');

示例

使用示例即将推出。

绑定

绑定是存储在容器中的对象。容器实现了PSR-11,提供get($id)has($id)方法来访问绑定,并定义set($id, $concrete)来存储对象。

class ClassA {
	public function __construct(stdClass $dependency) {

	}
}

$container->set('my-a', 'ClassA');

if ($container->has('my-a')) {
	$container->get('my-a');
}

绑定类型

可解析绑定

可解析绑定将在每次访问时返回一个新的实例。

$container->set('app.model.posts', App\Model\Post::class);

$obj1 = $container->get('app.model.posts'); // App\Model\Post#1
$obj2 = $container->get('app.model.posts'); // App\Model\Post#2

已解析绑定

已解析绑定不再只是单例,每次访问都会返回相同的实例。

// you can define by passing a third parameter to set
$container->set('database', App\Database::class, true);
// or using the `singleton` method
$container->singleton('database', App\Database::class);

$obj1 = $container->get('database'); // App\Database#1
$obj2 = $container->get('database'); // App\Database#1

绑定方式

字符串

定义绑定的最简单方式是仅提供一个类名作为字符串。

class ClassNameTest {

}

$container->set('someobj', ClassNameTest::class);

闭包

有时您需要在对象上设置一些属性或执行一些初始化逻辑,您可以使用闭包绑定来完成。

$container->set('someobj', function ($container) {
	$obj = new stdClass;
	$obj->attribute = 1;

	return $obj;
});

实例

如果您需要附加一个现有的实例,应使用setinstance方法。

$obj = new stdClass;

// you can set instances directly by the set method
$container->set('std', $obj);
// or use the `instance` method
$container->instance('std', $obj);

解析绑定

容器的伟大目标是自动注入所有类依赖项,如果您只需要创建一个类的实例而不将其绑定到容器中,则使用make方法。

class Post {
	public function __construct(Category $category) {
		$this->category = $category;
	}
}

class Category {
	public function __construct() {
		$this->id = rand();
	}
}

$post = $container->make(Post::class);

echo $post->category->id;

手动设置依赖项

有时您希望在实例化时,某些类将接收另一个类的特定对象。

class Post {
	public function __construct(Category $category) {
		$this->category = $category;
	}
}

class Category {
	public function __construct() {
		$this->id = rand();
	}
}

$category = new Category;
$category->id = 1;

$container->setTo(Post::class, Category::class, $category);
$post = $container->make(Post::class);

echo $post->category->id; // 1

make($abstract, $parameters = [], $force = false)接受第二个参数来定义已解析的依赖项,并接受第三个参数以确保创建新的对象。

$post = $container->make(Post::class, [Category::class => new Category], true);

执行闭包

如果您有一个具有依赖项的闭包,可以使用call($closure, $parameters = [])方法来解析它。

$container->call(function (User $user, Posts $posts) {
    // ...
});

make一样,您可以传递一个已解析依赖项的数组。

$container->call(function (User $user, Posts $posts) {}, [User::class => new User]);

扩展绑定

有时您需要修改绑定,要执行此操作,请使用extend方法。它们接收旧绑定对象和容器引用。

$container->set('app.services.mail', App\Services\MailService::class);

$container->extend('app.services.mail', function ($instance, $container) {
	$instance->environment('development');

    $instance->setHtmlWrapper($container->get('app.wrappers.html'));

	return $instance;
});

异常

Codeburner 容器实现了 PSR-11 标准,提供了两种异常类型,分别是 Psr\Container\Exception\NotFoundExceptionPsr\Container\Exception\ContainerException

API

  • Container
    • call(closure $closure, array $parameters = []) : mixed 执行一个闭包,解析其依赖项
    • make(string $abstract, array $parameters = [], bool $force = false) : mixed 在容器中解析某个对象
    • flush() : Container 刷新容器
    • get(string $abstract) : mixed 获取容器中存储的内容
    • has(string $abstract) : bool 验证容器中是否存在某个内容
    • set(string $abstract, $concrete, bool $shared = false) : Container 在容器中存储某个内容
    • setIf(string $abstract, $concrete, bool $shared = false) : Container 如果容器中不存在该内容,则存储它
    • setTo(string $abstract, string $dependencyName, $dependency) : Container 定义容器中某个已解析的依赖项
    • singleton(string $abstract, $concrete) : Container 存储一个新的单例对象
    • instance(string $abstract, $concrete) : Container 存储一个新的实例化类
    • isSingleton(string $abstract) : bool 验证容器中的内容是否为单例
    • isInstance(string $abstract) : bool 验证容器中的内容是否为实例
    • extend(string $abstract, closure $extender) : Container 包装某个实例的创建过程
    • share(string $abstract) : Container 将某个内容转换为单例