fi1a / config
PHP 处理配置文件。支持 PHP 和 JSON 文件。
Requires
- php: ^7.3 || ^8
- fi1a/collection: ^2.0
- fi1a/filesystem: ^1.0
- fi1a/tokenizer: ^1.1
Requires (Dev)
- captainhook/captainhook: ^5.4
- phpunit/phpunit: ^9.3
- slevomat/coding-standard: ^6.3
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^4.3
Suggests
- ext-json: *
README
该包是一个配置文件加载器,支持 PHP 和 JSON 格式。
安装
可以使用 Composer 将此包作为依赖项安装。
composer require fi1a/config
配置文件加载和保存示例
可以通过使用 Fi1a\Config\ConfigValuesInterface
对象,该对象可以使用 load() 工厂方法创建,该方法需要传入 Fi1a\Config\Readers\ReaderInterface
对象以从文件中读取,以及 Fi1a\Config\Parsers\ParserInterface
对象以进行解析。
use Fi1a\Config\Config; use Fi1a\Config\Parsers\PHPParser; use Fi1a\Config\Readers\FileReader; use Fi1a\Config\Writers\FileWriter; use Fi1a\Filesystem\Adapters\LocalAdapter; use Fi1a\Filesystem\Filesystem; $filesystem = new Filesystem(new LocalAdapter(__DIR__)); $file = $filesystem->factoryFile('./config.php'); $reader = new FileReader($file); $writer = new FileWriter($file); $parser = new PHPParser(); $config = Config::load($reader, $parser); // Fi1a\Config\ConfigValuesInterface $config->get('path:to:value', true); $config->set('path:to:value', 'value'); Config::write($config, $writer, $parser); // true
配置文件加载示例
可以通过使用 Fi1a\Config\Config::batchLoad
方法从多个文件中获取值,并传递一个包含 Fi1a\Config\Readers\ReaderInterface
对象的数组以进行文件读取和 Fi1a\Config\Parsers\ParserInterface
对象以进行解析的数组。
use Fi1a\Config\Config; use Fi1a\Config\Parsers\PHPParser; use Fi1a\Config\Readers\FileReader; use Fi1a\Filesystem\Adapters\LocalAdapter; use Fi1a\Filesystem\Filesystem; $parser = new PHPParser(); $filesystem = new Filesystem(new LocalAdapter(__DIR__)); $config = Config::batchLoad([ [ new FileReader($filesystem->factoryFile('./config1.php')), $parser, ], [ new FileReader($filesystem->factoryFile('./config2.php')), $parser, ], [ new FileReader($filesystem->factoryFile('./config3.php')), $parser, ], ]); // Fi1a\Config\ConfigValuesInterface $config->get('path:to:value', true);
值类
Fi1a\Config\Config::load
和 Fi1a\Config\Config::batchLoad
方法返回实现 Fi1a\Collection\DataType\PathAccessInterface
接口(来自包 fi1a/collection)的 Fi1a\Config\ConfigValues
对象。
该类允许通过路径(foo:bar:baz)访问数组键。
可以使用 Fi1a\Config\Config::create
方法创建新的值对象。
use Fi1a\Config\Config; $register = Config::create(['foo' => ['bar' => ['baz' => 1], 'qux' => 2,],]); $register->get('foo:bar:baz'); // 1 $register->get('foo:qux'); // 2 $register->get('foo:bar:baz:bat'); // null $register->get('foo:bar:baz:bat', false); // false $register->has('foo:bar'); // true $register->has('foo:bar:baz'); // true $register->has('foo:bar:baz:bat'); // false
读取
负责读取配置的类实现了 Fi1a\Config\Readers\ReaderInterface
接口。
读取配置文件
Fi1a\Config\Readers\FileReader
类从文件中读取编码字符串。
use Fi1a\Config\Config; use Fi1a\Config\Parsers\PHPParser; use Fi1a\Config\Readers\FileReader; use Fi1a\Filesystem\Adapters\LocalAdapter; use Fi1a\Filesystem\Filesystem; $filesystem = new Filesystem(new LocalAdapter(__DIR__)); $reader = new FileReader($filesystem->factoryFile('./config.php')); $parser = new PHPParser(); $config = Config::load($reader, $parser); // Fi1a\Config\ConfigValuesInterface $config->get('path:to:value', true); $config->set('path:to:value', 'value');
从目录中读取配置文件
Fi1a\Config\Readers\DirectoryReader
类根据提供的掩码从传入的目录中读取配置文件。构造函数参数
use Fi1a\Config\Config; use Fi1a\Config\Parsers\PHPParser; use Fi1a\Config\Readers\DirectoryReader; use Fi1a\Filesystem\Adapters\LocalAdapter; use Fi1a\Filesystem\Filesystem; $filesystem = new Filesystem(new LocalAdapter(__DIR__)); $reader = new DirectoryReader($filesystem->factoryFolder('.'), '/^(.+)\.config\.php$/'); $parser = new PHPParser(); $config = Config::load($reader, $parser); // Fi1a\Config\ConfigValuesInterface $config->get('path:to:value', true); $config->set('path:to:value', 'value');
写入
负责写入配置的类实现了 Fi1a\Config\Writers\WriterInterface
接口。
写入配置文件
Fi1a\Config\Writers\FileWriter
类将编码字符串写入文件。
use Fi1a\Config\Config; use Fi1a\Config\Parsers\PHPParser; use Fi1a\Config\Writers\FileWriter; use Fi1a\Filesystem\Adapters\LocalAdapter; use Fi1a\Filesystem\Filesystem; $filesystem = new Filesystem(new LocalAdapter(__DIR__)); $writer = new FileWriter($filesystem->factoryFile('./config.php')); $parser = new PHPParser(); $config = Config::create(['foo' => 'bar', 'baz' => [1, 2, 3]]); Config::write($config, $writer, $parser); // true
编码
负责编码配置的类实现了 Fi1a\Config\Parsers\ParserInterface
接口。
基于文件类型创建解析器对象
可以使用 Fi1a\Config\Parsers\Factory::byFileType
工厂方法根据文件扩展名获取解析器对象。
use Fi1a\Config\Config; use Fi1a\Config\Parsers\Factory; use Fi1a\Config\Readers\FileReader; use Fi1a\Filesystem\Adapters\LocalAdapter; use Fi1a\Filesystem\Filesystem; $filesystem = new Filesystem(new LocalAdapter(__DIR__)); $file = $filesystem->factoryFile('./config.json'); $reader = new FileReader($file); $parser = Factory::byFileType($file->getPath()); // Fi1a\Config\Parsers\JSONParser $config = Config::load($reader, $parser); // Fi1a\Config\ConfigValuesInterface $config->get('path:to:value', true);
PHP 格式编码
要使用 PHP 格式进行编码,请使用 Fi1a\Config\Parsers\PHPParser
类。可以在构造函数中传递以下参数
示例
use Fi1a\Config\Config; use Fi1a\Config\Parsers\PHPParser; use Fi1a\Config\Readers\FileReader; use Fi1a\Config\Writers\FileWriter; use Fi1a\Filesystem\Adapters\LocalAdapter; use Fi1a\Filesystem\Filesystem; $filesystem = new Filesystem(new LocalAdapter(__DIR__)); $file = $filesystem->factoryFile('./config.php'); $reader = new FileReader($file); $writer = new FileWriter($file); $parser = new PHPParser('UTF-8', false, '1tab'); $config = Config::load($reader, $parser); // Fi1a\Config\ConfigValuesInterface $config->get('path:to:value', true); $config->set('path:to:value', 'value'); Config::write($config, $writer, $parser); // true
JSON 格式编码
要使用 JSON 格式进行编码,请使用 Fi1a\Config\Parsers\JSONParser
类。可以在构造函数中传递以下参数
示例
use Fi1a\Config\Config; use Fi1a\Config\Parsers\JSONParser; use Fi1a\Config\Readers\FileReader; use Fi1a\Filesystem\Adapters\LocalAdapter; use Fi1a\Filesystem\Filesystem; $filesystem = new Filesystem(new LocalAdapter(__DIR__)); $reader = new FileReader($filesystem->factoryFile('./config.json')); $parser = new JSONParser(64, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR); $config = Config::load($reader, $parser); // Fi1a\Config\ConfigValuesInterface $config->get('path:to:value', true); $config->set('path:to:value', 'value');