dotink / affinity
一个热爱你的启动器
Requires
- php: >=5.4.0
- dotink/flourish-core: ^1.0.0
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]);
这是上下文。如果您之前没有注意到,它提供给操作操作,也可以在配置中作为正常变量使用。上下文可以是您想要的任何内容,但通常用于提供应用程序实例和依赖注入器,分别用于配置和操作。