samsonos / php_config
SamsonPHP 配置系统
Requires
- samsonos/php_event: 1.*
Requires (Dev)
- phpunit/phpunit: 4.*
This package is not auto-updated.
Last update: 2024-09-14 17:05:59 UTC
README
基于面向对象的配置系统。这种方法使用 PHP 面向对象的全部能力来创建基于类的配置。
配置方案
您的项目可以有任意数量的可能配置,这通常用于不同的环境,例如 开发、测试、部署、生产 阶段,为此目的,我们创建了 samsonos\config\Scheme
,每个都对应于特定环境。在实际应用中,您应该有一个 基本配置文件夹,默认位于 app/config
文件夹。
全局配置
在您的 app/config
文件夹的根目录下,您应该创建默认的 实体配置类。如果没有指定当前配置环境,将自动使用这些实体配置类。
重要!如果您已指定某些配置环境(例如
production
),但其中没有某些模块/对象的实体配置类 - 如果存在,将使用全局配置实体来替代。
创建配置环境
要创建新的配置环境,您需要在 基本配置文件夹(默认位于 app/config
)中创建新文件夹,例如,我们想创建 production
环境,新文件夹路径将是: app/config/production/
。并且那里的所有实体配置类都将对应于您的 production
配置方案,这将自动创建。
实体配置
要配置您的项目模块\对象,您应该使用类,为了正确地在其他类中找到这些类,我们要求您扩展我们的基本实体配置类 samsonos\config\Entity
namespace project; class entityIDConfig extends samsonos\config\Entity { }
您的实体配置类名称应遵循以下逻辑: [EntityIdentifier]Config
EntityIdentifier
- 配置的模块/对象标识符- 所有实体配置类的名称必须以
Config
结尾
您的实体配置类命名空间应遵循以下逻辑
- 每个类都必须定义任何命名空间(默认为您的项目名称)
- 全局实体配置类(位于 基本配置文件夹),应具有以下列表项中定义的命名空间。
- 其他环境的实体配置类(位于 其他内部文件夹),应具有命名空间:
[ParentNamespace]\[EnvironmentName]
,如果我们扩展先前的实体配置示例,但现在为production
环境
namespace project\production; class entityIDConfig extends samsonos\config\Entity { public $parameter = 'value'; }
重要!由于我们使用 PSR-* 标准 - 类名必须与文件名匹配
可能的配置参数
面向对象配置方法的主要优点是您可以指定任何可能的 PHP 值作为预定义类字段值,主要限制是它们必须是 public
可访问的
namespace project; class entityIDConfig extends samsonos\config\Entity { public $stringParameter = 'I am a string'; public $integerParameter = 1123; public $arrayParameter = array('1', 123); }
禁止的操作
不幸的是,您不能在类字段值中预定义计算和字符串连接(以及其他操作),但您可以在 __construct
方法中始终执行它。当 配置方案 创建时,为每个环境创建所有 实体配置 实例 - 因此执行它们的 __construct
方法,在那里您可以进行任何可能的操作。
namespace project; class entityIDConfig extends samsonos\config\Entity { public $stringParameter = 'I am a string'; public $integerParameter = 1123; public $arrayParameter = array('1', 123); public $complicatedParameter; public function __construct() { // Fill your parameter with what you want $this->complicatedParameter = $this->stringParameter . dirname(__DIR__); } }
扩展现有配置
还可以扩展父实体配置,如果我们只想对某些实体配置进行一些小的更改,我们只需扩展它即可
// Mention - class name is the same, only namespace is different namespace project\other; // We are extending global configuration from previous example class entityIDConfig extends project\entityIDConfig { // We overload only this parameter, as we want all to be the same as parent public $integerParameter = 2222; }
配置管理器
所有项目模块/对象的配置都通过配置管理器 samsonos\config\Manager
处理,你必须创建其实例,你必须指定只有一个参数 基本配置文件夹路径
,初始化管理器时应该使用 init()
方法,这些方法特别分开以提供按需加载实体配置类的能力。
$manager = new \samsonos\config\Manager('.../path/to/base/folder'); $manager->init();
加载实体配置类
我们为加载实体配置创建了专门的静态方法 samsonos\config\Manager::import($path)
,此方法在创建或加载配置方案时内部使用,对于这些任务你应该使用 init(path)
。
$manager = new \samsonos\config\Manager(); $manager->init('.../path/to/base/folder');
切换配置
如果你想更改当前活动的管理器配置,应该使用 change($identifier)
方法。
$identifier
- 环境标识符(配置方案标识符)
从不同位置加载方案
如果你有带有不同配置的单独基本配置文件夹,例如一个项目在另一个项目内部,内部项目想从父对象获取一些配置,你可以从其他位置加载配置。
$manager = new \samsonos\config\Manager(); $manager->init('.../path/to/base/folder'); $manager->init('.../path/to/OTHER/folder');
重要!不同位置的同一环境的实体配置会被覆盖。
事件系统
此模块只有一个外部依赖 - 事件系统,并且与外部世界的所有互操作性都必须使用此方法。目前该模块不触发任何事件,但有 2 个订阅
core.environment.change
- 当外部环境正在更改时core.module.configure
- 当某个对象正在配置时