轻量级依赖注入

v0.1.1-alpha 2014-08-20 18:58 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:37:08 UTC


README

轻量级依赖注入。

Build status

使用方法

要安装,请将其添加到您的 composer.json 中

"require": {
	"stuartwakefield/platter": "0.1.0"
}

在您运行 composer install 之后,您将能够使用 Platter DI 管理器。

使用您的定义创建一个新的 Platter 实例

$factory = new Platter(array(
	'dbuser' => 'admin',
	'dbpassword' => 'password',
	'dbname' => 'test',
	'dbhost' => '0.0.0.0',
	'connectionstring' => function ($container) {
		return "mysql:dbname={$container->get('dbname')};host={$container->get('dbhost')}";
	},
	'pdo' => function ($container) {
		return new PDO(
			$container->get('connectionstring'),
			$container->get('dbuser'),
			$container->get('dbpassword')
		);
	},
	'repository' => function ($container) {
		return new Repository($container->get('pdo'));
	}
));

要从容器中检索对象,只需使用 get 方法

$repository = $factory->get('repository');

您还可以将 Platter 容器链接在一起,一个容器被视为子容器,另一个容器被视为父容器。

$parent = new Platter(array(
	'dbuser' => 'xyz',
	'dbpassword' => 'abc'
));

$factory = new Platter(array(
	'DataSource' => function ($container) {
		return new DataSource(
			$container->get('dbuser'),
			$container->get('dbpassword')
		);
	}
), $parent);

$ds = $factory->get('DataSource');

在解决依赖关系时,如果子容器没有该依赖项的定义,则依赖项将从父容器中获取。

注意: 依赖项的解决方向是单向的,父容器不会检查其子容器以获取依赖项。因此,附加到容器的定义只能访问该容器及其父容器中的其他定义,但不能访问其子容器中的定义。

以下将不起作用

$parent = new Platter(array(
	'DataSource' => function ($container) {
		return new DataSource(
			$container->get('dbuser'),
			$container->get('dbpassword')
		);
	}
));

$factory = new Platter(array(
	'dbuser' => 'xyz',
	'dbpassword' => 'abc'
), $parent);

$ds = $factory->get('DataSource'); // "Identifier 'dbuser' is not defined"

如果不理解,这可能会导致混淆

$parent = new Platter(array(
	'name' => 'Joe',
	'example' => function ($container) {
		return $container->get('name');
	}
));

$factory = new Platter(array(
	'name' => 'Michael'
), $parent);

echo $factory->get('name'); // "Michael"
echo $factory->get('example'); // "Joe"

example 定义无法访问子容器中的 name 定义,因此将返回父容器中的 name 定义。

构建器接口

Platter 还提供了一个构建器接口,用于使用友好且表达式的构建器接口注册项目。构建后,Platter 是不可变的。

$builder = new Platter\Builder;
$parent = $builder
	->register('dbuser', 'xyz')
	->register('dbpassword', 'abc')
	->build();

$builder = new Platter\Builder;
$factory = $builder
	->register('DataSource', function ($container) {
		return new DataSource(
			$container->get('dbuser'),
			$container->get('dbpassword')
		);
	})
	->connect($parent)
	->build();

要显示 Platter 服务的所有可用项目

$factory->available(); // array('DataSource', 'dbpassword', 'dbuser');

要显示 Platter 实例本身定义的项目

$factory->defined(); // array('DataSource');

要创建单例,请使用 Singleton 定义对象

$builder
	->register('DataSource', new Platter\Definition\Singleton(function ($container) {
		return new DataSource(
			$container->get('dbuser'),
			$container->get('dbpassword')
		);
	}))
	->build();