dotink/affinity

一个热爱你的启动器

1.3.1 2016-11-18 22:57 UTC

This package is auto-updated.

Last update: 2024-08-29 03:55:22 UTC


README

Affinity 是一个为 PHP 项目提供的启动器,它允许你创建模块化的配置和操作,可以直接添加到项目中以增加功能,而无需额外的工作。

它提供了运行启动操作和逻辑的机制,以及创建和访问组织良好的配置数据的机制。

Affinity 是 inKWell 框架的关键组件,你可以在以下链接中了解更多关于其集成的信息:

http://inkwell.dotink.org/docs/basics/02-nano-core#Bootstrapping

或者...继续阅读以下部分以了解独立使用。

基本用法

$engine = new Affinity\Engine(
	new Affinity\NativeDriver('/path/to/configs'),
	new Affinity\NativeDriver('/path/to/actions')
);

$engine->start('production', ['app' => $app, 'di' => $di]);

此示例显示了 affinity 的最基本设置。使用本地驱动程序,我们可以递归地扫描目录以查找配置或操作,然后调用 start() 来执行启动操作。

配置/操作目录结构

本地驱动程序假设你的配置和操作目录结构如下所示

--- config_root [this is what you pass to the __construct() call]
 |
 |- default
 |
 |- environment1
 |
 |- environment2
 |
 |- ...

无论什么情况,都会包括来自 default 的所有配置和操作,并将基于传递给 start() 调用的环境进行扩展。

你可以通过传递逗号分隔的列表来扩展多个环境

$engine->start('production, europe', $context);

这允许你只为特定环境的需求覆盖必要的配置数据或逻辑,无论这些需求是执行模式、部署稳定性、位置等。

每个环境文件夹内的目录结构由你决定,尽管建议你使用额外的子目录进行命名空间。

Affinity 将给定配置文件或操作的相对路径用作识别配置或操作的手段。例如,config/default/core.php 被简单地标识为 'core',而类似 include/default/routes/main.php 的文件则被标识为 'routes/main'

配置

你可以在环境目录中的任何 PHP 文件中创建配置,并通过返回它来创建配置。例如,让我们想象向 config/default/test.php 中添加以下内容

return Affinity\Config::create([

	'key' => 'value',

	'parent' => [
		'child' => 'value'
	]
]);

访问配置数据

创建配置后,你可以通过在 affinity 引擎上使用 fetch() 方法来访问配置数据。

$engine->fetch('test', 'key', 'default');

fetch() 方法的参数分别是配置 ID、配置内的参数以及未找到时的默认值。你可以使用 JavaScript 风格的对象表示法来访问嵌套数据作为第二个参数

$engine->fetch('test', 'parent.child', 'default');

聚合 ID

除了标识从特定配置中获取数据外,还可以通过聚合 ID 指定可能由多个配置提供的信息类型。所有聚合 ID 必须以 @ 开头

$engine->fetch('@providers', 'mapping', array());

为了为聚合 ID 获取信息提供数据,你需要将包含你提供的聚合列表的可选第一个参数传递给 Affinity\Config::create() 方法。然后,数据最初在配置本身中以聚合 ID 为键进行索引。

return Affinity\Config::create(['providers'], [
	'@providers' => [
		'mapping' => [
			'Dotink\Package\UsefulInterface' => 'My\Concrete\ProviderClass'
		]
	]
]);

从聚合 ID 获取信息时,返回的数组包含为每个提供该聚合数据的配置文件创建的条目,并按特定配置 ID 进行键控。在上面的映射中,这意味着我们首先必须遍历单个配置数据,然后 遍历映射本身。

您可以通过只获取聚合ID来获取提供聚合数据的特定ID列表,无需指定参数

foreach ($engine->fetch('@providers') as $id) {
	$provider_mapping = $engine->fetch($id, '@providers.mapping', []);
	$provider_params  = $engine->fetch($id, '@providers.params',  []);

	foreach ($provider_mapping as $interface => $provider) {
		$injector->alias($interface, $provider);
	}

	foreach ($provider_params as $provider => $params) {
		$injector->define($provider, $params);
	}
}

操作

操作是模块化和可插拔的逻辑组件,它使用配置数据来准备您的应用程序运行。它们的主要功能包括

  • 设置依赖关系
  • 运行用于配置的静态类方法或为配置设置静态类属性
  • 在应用程序容器中注册提供者

与只是信息数组的配置不同,操作代表可调用的逻辑。

创建操作

将文件添加到适当的环境,并返回 Affinity\Action::create()

return Affinity\Action::create(function($app, $di) {
	//
	// Your bootstrap logic here
	//
});

操作排序(依赖关系)

如果您需要确保操作按顺序运行,可以将依赖关系的数组作为可选的第一个参数添加。以下操作将不会运行,直到标识为 core 的操作运行

return Affinity\Action::create(['core'], function($app, $di) {
	//
	// Your bootstrap logic here
	//
});

上下文

在我们的第一个示例中,您可能已经注意到向引擎的 start() 方法传递了一个数组

$engine->start('production', ['app' => $app, 'di' => $di]);

这是上下文。如果您之前没有注意到,它提供给操作操作,也可以在配置中作为正常变量使用。上下文可以是您想要的任何内容,但通常用于提供应用程序实例和依赖注入器,分别用于配置和操作。