前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微服务系列 | 简洁强大的YAML解析库读取Yaml配置文件

微服务系列 | 简洁强大的YAML解析库读取Yaml配置文件

作者头像
Tinywan
发布2024-06-18 15:37:09
1000
发布2024-06-18 15:37:09
举报
文章被收录于专栏:开源技术小栈开源技术小栈

什么是 YAML?

YAML(YAML Ain't Markup Language)是一种数据序列化语言,它的设计目标是为了使人类可读性更高,同时也易于编写程序进行解析。YAML 的语法简洁明了,适合用于配置文件、数据交换等方面。

Symfony YAML组件

Symfony YAML组件是一个强大的PHP库,用于处理YAML配置文件。该组件可以轻松地将YAML数据转换为PHP数组,并且可以方便地对PHP数组进行序列化。

使用场景

使用 Symfony Yaml,你可以轻松地将 YAML 数据解析为 PHP 数组,也可以将 PHP 数组转换为 YAML 字符串。这使得它在以下场景中非常有用。

  • 配置文件:YAML 文件是一种理想的配置文件格式,因为它们既清晰又易于阅读。
  • 数据交换:如果你需要与别的系统交换数据,YAML 提供了一种简洁且易于理解的方式来表示结构化的数据。
  • 设置对象属性:通过将 YAML 数据映射到 PHP 对象的属性,可以使对象更容易配置。

特点

  • 易用性:Symfony Yaml 提供了一个简单直接的 API,使得操作 YAML 数据变得非常容易。
  • 灵活性:Symfony Yaml 支持多种不同的 YAML 样式和特性,包括锚点、别名、标签等。
  • 强大性:Symfony Yaml 具有强大的错误处理能力,能够捕获并报告各种类型的解析错误。
  • 兼容性:Symfony Yaml 可以在 PHP 5.6+ 版本上运行,并且与大部分现代 PHP 框架兼容。

基础使用

安装

通过 Composer 来安装

代码语言:javascript
复制
composer require symfony/yaml

config.yaml 配置文件

代码语言:javascript
复制
# Redis配置
redis:
  master:
    host: '127.0.0.1'
    port: 6379
    password: '123456'

加载 YAML 文件

代码语言:javascript
复制
<?php
/**
 * @desc 加载 YAML 文件
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/6/15 10:09
 */
declare(strict_types=1);

require_once '../vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;

$yamlContent = Yaml::parseFile('../config.yaml');
var_dump($yamlContent);

打印输出

代码语言:javascript
复制
array(1) {
  ["redis"]=>
  array(1) {
    ["master"]=>
    array(3) {
      ["host"]=>
      string(10) "127.0.0.1"
      ["port"]=>
      int(6379)
      ["password"]=>
      string(6) "123456"
    }
  }
}

解析 YAML 字符串

代码语言:javascript
复制
use Symfony\Component\Yaml\Yaml;

$yamlString = 'name: Tinywan';
$parsedData = Yaml::parse($yamlString);
var_dump($parsedData);

打印输出

代码语言:javascript
复制
array(1) {
  ["name"]=>
  string(7) "Tinywan"
}

将数据转换为 YAML 并写入文件

代码语言:javascript
复制
$data = [
    'name' => 'Tinywan',
    'age' => 24
];
$yamlString = Yaml::dump($data, 3, 2); // 第二个参数是缩进级别,第三个参数是换行符数量
$yamlPath = '../tinywan.yaml';
file_put_contents(base_path() . $yamlPath, $yamlString, LOCK_EX);

在这里,我们首先使用use导入Symfony YAML组件,然后使用Yaml::parseFile方法将YAML文件解析为PHP数组。接下来,我们使用Yaml::dump方法将PHP数组序列化为YAML格式。

高级用法

高级用法主要是结合项目框架使用,不忘初衷的webman,那就是你了!!!

用法:这里尝试使用config.yaml文件替换config/redis.php 配置文件,通过修改config.yaml文件而变相的修改config/redis.php 配置文件。

config.yaml文件内容

代码语言:javascript
复制
# Redis配置
redis:
  master:
    host: '127.0.0.1'
    port: 6379
    password: '123456'

config/redis.php 配置文件

代码语言:javascript
复制
<?php
/**
 * @desc Redis配置
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/6/15 0:09
 */
declare(strict_types=1);

return [
    'default' => [
        'host' => yaml('redis.master.host', '127.0.0.1'),
        'port' => yaml('redis.master.port', '6379'),
        'password' => yaml('redis.master.password', null),
        'database' => 0,
    ],
];

自定义 yaml() 助手函数。助手函数位置很重要,该助手函数需要放在support/helpers.php文件里,或者在support目录下新建一个自定的函数,如support/resty.php,然后需改composer.json文件的autoload自定加载文件即可

代码语言:javascript
复制
  "autoload": {

    "files": [
      "./support/helpers.php",
      "./support/resty.php"
    ]
  }

yaml()助手函数文件

代码语言:javascript
复制
/**
 * @desc 自定义 yaml 助手函数
 * @param string|null $key
 * @param mixed|null $default
 * @param string|null $path
 * @param bool $static
 * @return mixed
 * @author Tinywan(ShaoBo Wan)
 */
function yaml(?string $key = null, ?string $default = null, ?string $path = null, bool $static = false)
{
    if (!file_exists(($path = $path ?? base_path() . DIRECTORY_SEPARATOR . 'config.yaml'))) {
        return $default;
    }
    if ($static) {
        global $yaml;
        if (!$yaml) {
            $yaml = \Symfony\Component\Yaml\Yaml::parseFile($path);
        }
        $data = $yaml;
    } else {
        $data = \Symfony\Component\Yaml\Yaml::parseFile($path);
    }
    $keys = \explode('.', $key);
    if ($key !== null) {
        foreach ($keys as $k) {
            if (!is_array($data)) {
                $data = $default;
                break;
            }
            $data = $data[$k] ?? $default;
        }
    }
    return $data;
}

注意区别:每次安装workerman/webman-framework或者升级workerman/webman-framework时会自动覆盖start.phphelpers.php。所以这里推荐新建一个support/resty.php文件。

composer.json里将此文件加入到自动加载中,类似

代码语言:javascript
复制
    "files": [
      "./support/helpers.php",
      "./support/resty.php"
    ]

执行composer dumpautoload这样你的项目就可以在启动时加载support/check.php了。不需要更改start.phphelpers.php啦!!!

测试校验读取Redis默认配置文件

代码语言:javascript
复制
$config = \config('redis.default');
var_dump($config);

打印输出

代码语言:javascript
复制
array(4) {
  'host' =>
  string(9) "127.0.0.1"
  'port' =>
  int(6379)
  'password' =>
  string(6) "123456"
  'database' =>
  int(0)
}

尝试修改config.yaml 文件内容

代码语言:javascript
复制
# Redis配置
redis:
  master:
    host: 'dnmp-redis'
    port: 6379
    password: '123456'

再次打印输出,可以看到默认redis配置已经发生变化了,自动从config.yaml文件读取了

代码语言:javascript
复制
array(4) {
  'host' =>
  string(10) "dnmp-redis"
  'port' =>
  int(6379)
  'password' =>
  string(6) "123456"
  'database' =>
  int(0)
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 YAML?
  • Symfony YAML组件
    • 使用场景
      • 特点
      • 基础使用
        • 安装
        • 高级用法
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档