j7mbo / config-loader
很棒。
Requires
- php: >=5.4.0
- symfony/yaml: ~2.3
Requires (Dev)
This package is not auto-updated.
Last update: 2024-09-14 15:05:59 UTC
README
提供面向对象的公共接口来读取配置文件,并在需要时检索配置值的依赖注入对象。
目前仅包含Yaml,并使用 Symfony\Yaml
。
该服务提供以下功能
- 必需的键。 如果配置不包含所有必需的键,将抛出异常。
- 环境配置。 环境可以由位于
environment
键下的global.yml
文件解析,也可以通过简单的setter在运行时设置。其他在required_environments
键中的环境配置文件将被忽略。
安装
安装通过 Composer 完成。将以下内容添加到您的 composer.json
文件中
"require": {
"j7mbo/config-loader": "dev-master"
}
用法
- 在引导程序中创建
YamlConfigLoader
对象。 - 设置您的配置文件,并选择使用带有
environment
和required_environments
键的global.yml
文件,或者通过setter在运行时设置这些值。 - 使用setter设置应用程序 必须 具有的任何必需键。
- 在
try/catch
中运行YamlConfigLoader::load()
方法,并准备好处理任何异常,如InvalidDirectoryException
。相应地处理这些异常,通常是通过记录异常(例如,通过Monolog\Logger
)并向用户提供友好的消息。 - 如果一切顺利,然后通过您的应用程序传递
YamlConfigLoader
,并调用YamlConfigLoader::getConfiguration()
来检索配置数组。
示例
首先,创建一个包含您的 YAML
文件的配置目录。这些可能是 dev.yml
、sandbox.yml
、staging.yml
和 live.yml
。
在以下代码中,我们需要将所需的(可能的)环境设置为与上述环境文件相同的名称,并将我们的实际环境作为要使用的环境。
// bootstrap.php
require_once __DIR__ . "/vendor/autoload.php"; // You'll need the composer autoloader included
$parser = new Symfony\Component\Yaml\Yaml; // The Symfony YAML parser
$iteratorFactory = new ConfigLoader\FileSystemIteratorFactory; // Factory for a directory iterator
$configLoader = new ConfigLoader\YamlConfigLoader($parser, $iteratorFactory);
$configLoader->setEnvironment("dev");
$configLoader->setPossibleEnvironments(["dev", "sandbox", "staging", "live"]);
// sandbox.yml, staging.yml and live.yml will be ignored, whilst dev.yml will be parsed
// Usually, these files have identical keys, but different values (db settings etc)
try
{
$configLoader->setDirectory( __DIR__ . "/config"); // Set the directory for our config files
$configLoader->load(); // Parse the data into the class configuration member
var_dump($configLoader->getConfiguration()); // This is the method you can use when you pass this configuration object around your application.
}
catch (ConfigLoader\Exception\InvalidDirectoryException $e)
{
echo "You have a permissions exception, or the directory doesn't exist";
// The config directory doesn't exist or isn't readable
// Log the error message
// Show a nice message to the user
}
更多信息
构造函数目录参数
您可以将目录作为 YamlConfigLoader::__construct()
方法的第三个参数传递。但是,您也需要在这里捕获 InvalidDirectoryExecption
,因为目录setter执行验证并抛出异常,而构造函数使用此setter而不是直接设置成员变量。
非运行时环境设置
如果您不想每次更改环境时都更改代码,您不必使用 YamlConfigLoader::setEnvironment()
和 YamlConfigLoader::setPossibleEnvironments()
方法。相反,创建一个包含 environment
键(包含单个值字符串)和 required_environments
键(包含多个值的子键)的 global.yml
文件。
如果省略运行时方法调用,如果找不到 environment
和 required_environments
键,或者找不到 global.yml
文件,将抛出以下异常
ConfigLoader\Exception\GlobalConfigFileNotFoundException
ConfigLoader\Exception\NonExistentEnvironmentKeyException
ConfigLoader\Exception\NonExistentRequiredConfigKeyException
确保有效的配置集
您还可以通过使用YamlConfigLoader::setRequiredKeys()
确保配置始终有效,只需将一个数组作为它的唯一参数。如果在执行load()
调用后找不到这些键中的任何一个,则抛出NonExistentRequiredConfigKeyException
。
通过键获取特定配置集
您不需要请求整个配置集。有时通过特定的键请求配置细节更为清晰。配置的getter允许通过参数执行此操作
`YamlConfigLoader::getConfiguration($key = "database");`
这返回一个包含您配置中“database”键的数组,或者如果键不存在,则返回一个空数组。这里不会抛出异常。
getConfiguration() -> getConfig()
您可以使用YamlConfigLoader::getConfig()
作为YamlConfigLoader::getConfiguration()
的快捷方式。
扩展
您可以通过实现ConfigurationInterface
并遵循YamlConfigLoader
的方式添加自己的配置加载类。请确保在test/
目录中添加对此的测试。
附加说明
这个类集合几乎像您的配置的服务定位器,但又不完全一样。它只是传递键和值的配置数组的面向对象方式。如果您有一个大型应用程序,那么这可能不是最佳方法,但对于小型应用程序来说,调用$this->config->getConfiguration("database");
并不是问题。
根据您如何设置代码,您可以将特定的配置类注入到您的服务中 - 但这不是这个类的目标。