subcosm/hive-foundation

Hive容器组件基础

v1.1.0 2017-04-14 14:45 UTC

This package is not auto-updated.

Last update: 2024-09-29 02:40:54 UTC


README

Hive Foundation是一个容器组件基础,提供具有丰富功能的分层键值节点容器,并带有无处不在的查询接口。

通用状态
Build Status codecov SensioLabsInsight Code Climate Gittip

完整性和使用情况
Downloads Latest

依赖项

可选

  • 如果想要使用SplFileObject作为加载器,则需要ext/spl

什么是hive节点?

hive节点实现了层次结构中的一片叶子,您可以通过简单的命令设置节点的值,包括节点本身、子节点或根节点。

我如何...

以下示例解释了hive节点的一般工作方式。

... 创建根节点?

根节点是任何节点层次结构的最顶层节点,可以有多个子节点,但只能有一个根节点。根节点创建如下

use Subcosm\Hive\Container\HiveNode;

$root = new HiveNode();
... 添加子节点?

Hive节点是自我扩展的,您可以通过调用HiveNode::node($nodeName, true)来创建节点。

... 向节点添加值?

像这样

use Subcosm\Hive\Container\HiveNode;

$root = new HiveNode();

$root->set('foo', 'bar');
... 对值添加懒加载?

Hive节点将闭包视为懒加载值,只需将您想要懒加载的内容包装在闭包中即可。

use Subcosm\Hive\Container\HiveNode;

$root = new HiveNode();

$root->set('foo', function() {
    return 'Hello World';
});
... 从节点获取值?

像这样

use Subcosm\Hive\Container\HiveNode;

$root = new HiveNode();

$root->set('foo', function() {
    return 'Hello World';
});

echo $root->get('foo'); // = Hello World
... 以层次结构方式设置或获取值?

Hive节点实现了一个层次结构安全的查询机制,用于在层次结构中获取和存储值。

use Subcosm\Hive\Container\HiveNode;

$root = new HiveNode();

$root->set('router', function() use ($root) {
    return $root->get('router.factory')->factorize();
});

$root->set('router.factory', function() {
    return new RouterFactory();
});

$router = $root->get('router');

在第一条设置指令中,根节点的键router将接收闭包。第二条设置指令将(自动)创建节点'router'(不是值键),并在router-节点上的键factory将接收闭包。

您也可以从子节点访问根节点

use Subcosm\Hive\Container\HiveNode;

$root = new HiveNode();

$root->set('logger', function() {
    return new Monolog\Logger();
});

$routing = $root->node('router', true);

$root->set('router', function() use ($routing) {
    return $routing->get('factory')->factorize();
});

$routing->set('factory', function() use ($routing) {
    return new RouteFactory($routing->get('~logger'));
});

$router = $root->get('router');

// or

$router = $routing->get('~router');

是否有任何钩子或事件机制?

是也不是。您不能使用事件从hive结构外部操作值,但您可以使用Observatory的每个hive节点的实现来观察hive节点并在您选择的任何事件调度器中发出事件。

可在HiveInterfaceDeclarationAwareInterface中找到可用的观察者阶段,分别由*_STAGE常量表示。

Observatory-观察者在整个hive结构中共享,并且可以独立地从每个父节点更改以拥有自己的观察者队列。

我可以手动分配节点吗?

不。每次您将项目分配给容器时,它们都将保持分配时的状态(闭包是唯一的例外)。您必须使用HiveNode::node($name, true)来创建新的子节点,或者您可以让hive节点为您创建它们。无法手动设置节点是为了避免查询分隔符和根定义令牌在节点结构中的冲突。首先保证完整性。

关于值验证怎么办?

HiveNode本身不提供用于验证值的接口。DeclarativeHiveNode提供了一个接口,可以在每个项目级别或为所有项目及其子节点声明默认验证器。

提供的回调将值作为第一个参数接收,并需要返回要设置给hive节点的值,否则值将默认为null。

use Subcosm\Hive\Container\DeclarativeHiveNode;

$node = new DeclarativeHiveNode();

$node->entity('foo', function($value) {
    if ( ! is_string($value) ) {
        throw new InvalidArgumentException('Value must be string for foo');
    }
    
    return $value;
});

$node->set('foo', 12345); // throws the exception
$node->set('foo', '12345'); // sets the value
use Subcosm\Hive\Container\DeclarativeHiveNode;

$node = new DeclarativeHiveNode();

$node->defaultEntity(function($value) {
    return is_array($value) || is_object($value) ? json_encode($value) : (string) $value;
});

$node->set('foo', 12345); // foo => '12345'
$node->set('foo', ['foo' => 'bar']); // foo => {"foo":"bar"}

使用加载器导入节点数据

use Subcosm\Hive\{
    Container\HiveNode,
    Loader\ArrayLoader
};

$node = new HiveNode();
$loader = new ArrayLoader();
$loader->load([
    'foo.bar' => 'baz'
]);

$loader->injectInto($node);

echo $node->get('foo.bar'); // => "baz"

包稳定性和维护者

此包被认为是稳定的。此包的维护者是

许可证

此包根据MIT许可证授权。