jimbojsb/configulator

一个极其轻量级的配置和服务管理器

v0.3 2013-07-21 15:32 UTC

This package is auto-updated.

Last update: 2024-09-18 04:40:33 UTC


README

Build Status

Code Climate

Configulator 是一个非常轻量级的 PHP 项目的配置管理器和服务定位器。它设计成一种穷人的依赖注入容器,服务工厂始终传递管理的配置选项以及服务工厂本身,这样就可以实现简单的依赖解析和配置常见的服务需求,例如数据库连接。

获取 Configulator

Configulator 需要 Composer,并且不提供自己的自动加载器。它可在 Packagist 此处 获取。你需要在项目的 composer.json 文件中添加类似以下内容

"require": {
    "jimbojsb/configulator": "dev-master"
}

使用方法

Configulator 可以有两种使用方式。你可以直接创建 Configulator\Manager 的新实例,并按照适合和必要的程度在现有的应用程序代码中传递对象。

// assume here you've at some point require composer's autoloader

use Configulator\Manager;
$configulator = new Configulator\Manager;

或者,Configulator 提供了一个全局命名空间的单例管理器,在整个项目中都可用。这是通过 Configulator() 函数暴露的,该函数将返回单例 Configulator\Manager 实例;

$configulator = Configulator();

所有剩余的示例都使用这种语法,尽管如果你自己使用原始管理器实例,功能是相同的。

加载配置选项

Configulator 支持以下四种方式填充其内部存储的配置数据。你可以直接传递一个选项数组,也可以从以下文件格式之一加载选项

当从文件加载时,你可以使用“配置配置文件”,这通常与环境相关联,例如“生产”或“开发”。所有配置文件类型都支持文件内部定义的其他配置文件的继承。

Configulator()->setOptions(['configItem1' => 'configValue1']);

// or

Configulator()->loadFile("/path/to/myconfig.yml", "production");

当使用 Configulator()->loadFile() 时,第二个参数是配置配置文件,它是可选的。你可能会使用它,如果你选择将配置文件结构化为利用继承。如果你在配置文件中确实有配置文件,并且没有传递配置文件参数,你将返回文件中包含的整个选项集,不包括解析继承。

访问配置选项

Configulator\Manager 实现 ArrayAccess,所有配置选项都通过数组表示法提供。然而,一旦加载,所有配置选项都是不可变的,因此尝试使用数组表示法将值设置回 Configulator 的代码将抛出 RuntimeException

$value = Configulator()["configItem1"];

服务工厂

Configulator 还管理和定位应用程序中的服务。将此与配置管理结合的主要原因是,创建和配置具有对配置选项的即时访问权限的服务变得非常简单。

服务工厂可以是对象的实例(实际上不是一个工厂,因为这假设你已经预先引导了这个实例),或者是一个返回服务的可调用对象。这通常是一个匿名函数。如果工厂是可调用的,则将 Configulator\Manager 作为可调用的最后一个(通常是唯一的)参数传递,这样你就有权访问整个配置以及轻松解析服务依赖项。

此外,Configulator 有共享和非共享服务概念。共享服务是服务对象的单例实例,首次请求时会延迟实例化,并缓存以供后续调用。非共享服务在每次请求时都从工厂返回一个新的实例。如果您将预制的实例而不是可调用对象注册为非共享服务,您将接收到该实例的副本。服务默认为共享。

服务首先通过 register() 方法注册,然后通过调用对应其名称的方法创建和检索。

Configulator()->register('mongodb', function() {
    return new MongoClient;
});

$mongo = Configulator()->mongodb();

Configulator()->register('mailer', function($configulator) {
    $transport = Swift_SmtpTransport::newInstance($configulator["smtp_host"], $configulator["smtp_port"]);
    return Swif_Mailer::newInstance($transport);
}, false);

$mailer = Configulator()->mailer();

本地覆盖文件

很多时候,可能需要使用未提交到源控制的本地文件来覆盖核心文件中的一些现有值。使用本地文件将覆盖任何位置的匹配值,无论环境如何。此覆盖在继承和环境设置解析之前进行处理。

使用 Configulator()->loadFile() 的可选第三个参数传递本地文件路径。

Configulator()->loadFile('/path/to/myconfig.yml', 'development', '/path/to/local_myconfig.yml');

贡献

欢迎提交拉取请求,但不应实质性扩大项目范围。