## 什么是 YAML?
YAML(YAML Ain't Markup Language)是一种[数据序列化](https://so.csdn.net/so/search?q=%E6%95%B0%E6%8D%AE%E5%BA%8F%E5%88%97%E5%8C%96&spm=1001.2101.3001.7020)语言,它的设计目标是为了使人类可读性更高,同时也易于编写程序进行解析。YAML 的语法简洁明了,适合用于配置文件、数据交换等方面。
## Symfony YAML组件
Symfony YAML组件是一个强大的PHP库,用于处理YAML配置文件。该组件可以轻松地将YAML数据转换为PHP数组,并且可以方便地对PHP数组进行序列化。
### 能做什么?
使用 Symfony Yaml,你可以轻松地将 YAML 数据解析为 PHP 数组,也可以将 PHP 数组转换为 YAML 字符串。这使得它在以下场景中非常有用。
* **配置文件**:YAML 文件是一种理想的配置文件格式,因为它们既清晰又易于阅读。
* **数据交换**: 如果你需要与别的系统交换数据,YAML 提供了一种简洁且易于理解的方式来表示结构化的数据。
* **设置对象属性**:通过将 YAML 数据映射到 PHP 对象的属性,可以使对象更容易配置。
### Symfony Yaml 的特点
* **易用性**:Symfony Yaml 提供了一个简单直接的 API,使得操作 YAML 数据变得非常容易。
* **灵活性**:Symfony Yaml 支持多种不同的 YAML 样式和特性,包括锚点、别名、标签等。
* **强大性**:Symfony Yaml 具有强大的错误处理能力,能够捕获并报告各种类型的解析错误。
* **兼容性**:Symfony Yaml 可以在 PHP 5.6+ 版本上运行,并且与大部分现代 PHP 框架兼容。
## 基础使用
### 安装
通过 Composer 来安装
```php
composer require symfony/yaml
```
**`config.yaml` 配置文件**
```
# Redis配置
redis:
master:
host: '127.0.0.1'
port: 6379
password: '123456'
```
**加载 YAML 文件**
```
<?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);
```
打印输出
```
array(1) {
["redis"]=>
array(1) {
["master"]=>
array(3) {
["host"]=>
string(10) "127.0.0.1"
["port"]=>
int(6379)
["password"]=>
string(6) "123456"
}
}
}
```
**解析 YAML 字符串**
```
use Symfony\Component\Yaml\Yaml;
$yamlString = 'name: Tinywan';
$parsedData = Yaml::parse($yamlString);
var_dump($parsedData);
```
打印输出
```
array(1) {
["name"]=>
string(7) "Tinywan"
}
```
**将数据转换为 YAML 并写入文件**
```
$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`文件内容**
```
# Redis配置
redis:
master:
host: '127.0.0.1'
port: 6379
password: '123456'
```
**`config/redis.php` 配置文件**
```
<?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`自定加载文件即可
```json
"autoload": {
"files": [
"./support/helpers.php",
"./support/resty.php"
]
}
```
**` yaml() `助手函数文件**
```php
/**
* @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.php` 和 `helpers.php`。所以这里推荐新建一个`support/resty.php`文件。
composer.json里将此文件加入到自动加载中,类似
```
"files": [
"./support/helpers.php",
"./support/resty.php"
]
```
执行`composer dumpautoload`这样你的项目就可以在启动时加载`support/check.php`了。不需要更改·`start.php`和 `helpers.php`啦!!!
**测试校验**
读取Redis默认配置文件
```
$config = \config('redis.default');
var_dump($config);
```
打印输出
```
array(4) {
'host' =>
string(9) "127.0.0.1"
'port' =>
int(6379)
'password' =>
string(6) "123456"
'database' =>
int(0)
}
```
> 尝试修改`config.yaml` 文件内容
```
# Redis配置
redis:
master:
host: 'dnmp-redis'
port: 6379
password: '123456'
```
再次打印输出,可以看到默认redis配置已经发生变化了,自动从`config.yaml`文件读取了
```
array(4) {
'host' =>
string(10) "dnmp-redis"
'port' =>
int(6379)
'password' =>
string(6) "123456"
'database' =>
int(0)
}
```
- 设计模式系列
- 工厂方法模式
- 序言
- Windows程序注册为服务的工具WinSW
- 基础
- 安装
- 开发规范
- 目录结构
- 配置
- 快速入门
- 架构
- 请求流程
- 架构总览
- URL访问
- 容器和依赖注入
- 中间件
- 事件
- 代码层结构
- 四个层次
- 路由
- 控制器
- 请求
- 响应
- 数据库
- MySQL实时同步数据到ES解决方案
- 阿里云DTS数据MySQL同步至Elasticsearch实战
- PHP中的MySQL连接池
- PHP异步非阻塞MySQL客户端连接池
- 模型
- 视图
- 注解
- @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})
- @EnableFeignClients(basePackages = "com.wotu.feign")
- @EnableAspectJAutoProxy
- @EnableDiscoveryClient
- 错误和日志
- 异常处理
- 日志处理
- 调试
- 验证
- 验证器
- 验证规则
- 扩展库
- 附录
- Spring框架知识体系详解
- Maven
- Maven和Composer
- 构建Maven项目
- 实操课程
- 01.初识SpringBoot
- 第1章 Java Web发展史与学习Java的方法
- 第2章 环境与常见问题踩坑
- 第3章 springboot的路由与控制器
- 02.Java编程思想深度理论知识
- 第1章 Java编程思想总体
- 第2章 英雄联盟的小案例理解Java中最为抽象的概念
- 第3章 彻底理解IOC、DI与DIP
- 03.Spring与SpringBoot理论篇
- 第1章 Spring与SpringBoot导学
- 第2章 Spring IOC的核心机制:实例化与注入
- 第3章 SpringBoot基本配置原理
- 04.SprinBoot的条件注解与配置
- 第1章 conditonal 条件注解
- 第2章 SpringBoot自动装配解析
- 05.Java异常深度剖析
- 第1章 Java异常分类剖析与自定义异常
- 第2章 自动配置Url前缀
- 06.参数校验机制与LomBok工具集的使用
- 第1章 LomBok工具集的使用
- 第2章 参数校验机制以及自定义校验
- 07.项目分层设计与JPA技术
- 第1章 项目分层原则与层与层的松耦合原则
- 第2章 数据库设计、实体关系与查询方案探讨
- 第3章 JPA的关联关系与规则查询
- 08.ORM的概念与思维
- 第1章 ORM的概念与思维
- 第2章 Banner等相关业务
- 第3章 再谈数据库设计技巧与VO层对象的技巧
- 09.JPA的多种查询规则
- 第1章 DozerBeanMapper的使用
- 第2章 详解SKU的规格设计
- 第3章 通用泛型Converter
- 10.令牌与权限
- 第1章 通用泛型类与java泛型的思考
- 常见问题
- 微服务
- demo
- PHP中Self、Static和parent的区别
- Swoole-Cli
- 为什么要使用现代化PHP框架?
- 公众号
- 一键部署微信公众号Markdown编辑器(支持适配和主题设计)
- Autodesigner 2.0发布
- Luya 一个现代化PHP开发框架
- PHPZip - 创建、读取和管理 ZIP 文件的简单库
- 吊打Golang的PHP界天花板webman压测对比
- 简洁而强大的 YAML 解析库
- 推荐一个革命性的PHP测试框架:Kahlan
- ServBay下一代Web开发环境
- 基于Websocket和Canvas实现多人协作实时共享白板
- Apipost预执行脚本如何调用外部PHP语言
- 认证和授权的安全令牌 Bearer Token
- Laradock PHP 的 Docker 完整本地开发环境
- 高效接口防抖策略,确保数据安全,避免重复提交的终极解决方案!
- TIOBE 6月榜单:PHP稳步前行,编程语言生态的微妙变化
- Aho-Corasick字符串匹配算法的实现
- Redis键空间通知 Keyspace Notification 事件订阅
- ServBay如何启用并运行Webman项目
- 使用mpdf实现导出pdf文件功能
- Medoo 轻量级PHP数据库框架
- 在PHP中编写和运行单元测试
- 9 PHP运行时基准性能测试
- QR码生成器在PHP中的源代码
- 使用Gogs极易搭建的自助Git服务
- Gitea
- webman如何记录SQL到日志?
- Sentry PHP: 实时监测并处理PHP应用程序中的错误
- Swoole v6 Alpha 版本已发布
- Proxypin
- Rust实现的Redis内存数据库发布
- PHP 8.4.0 Alpha 1 测试版本发布
- 121
- Golang + Vue 开发的开源轻量 Linux 服务器运维管理面板
- 内网穿透 FRP VS Tailscale
- 新一代开源代码托管平台Gitea
- 微服务系列
- Nacos云原生配置中心介绍与使用
- 轻量级的开源高性能事件库libevent
- 国密算法
- 国密算法(商用密码)
- GmSSL 支持国密SM2/SM3/SM4/SM9/SSL 密码工具箱
- GmSSL PHP 使用
- 数据库
- SQLite数据库的Web管理工具
- 阿里巴巴MySQL数据库强制规范
- PHP
- PHP安全测试秘密武器 PHPGGC
- 使用declare(strict_types=1)来获得更健壮的PHP代码
- PHP中的魔术常量
- OSS 直传阿里腾讯示例
- PHP源码编译安装APCu扩展实现数据缓存
- BI性能DuckDB数据管理系统
- 为什么别人可以是架构师!而我却不是?
- 密码还在用 MD5 加盐?不如试试 password_hash
- Elasticsearch 在电商领域的应用与实践
- Cron 定时任务入门
- 如何动态设置定时任务!而不是写死在Linux Crontab
- Elasticsearch的四种查询方式,你知道多少?
- Meilisearch vs Elasticsearch
- OpenSearch vs Elasticsearch
- Emlog 轻量级开源博客及建站系统
- 现代化PHP原生协程引擎 PRipple
- 使用Zephir编写C扩展将PHP源代码编译加密
- 如何将PHP源代码编译加密,同时保证代码能正常的运行
- 为什么选择Zephir给PHP编写动态扩展库?
- 使用 PHP + XlsWriter实现百万级数据导入导出
- Rust编写PHP扩展
- 阿里云盘开放平台对接进行文件同步
- 如何构建自己的PHP静态可执行文件
- IM后端架构
- RESTful设计方法和规范
- PHP编译器BPC 7.3 发布,成功编译ThinkPHP8
- 高性能的配置管理扩展 Yaconf
- PHP实现雪花算法库 Snowflake
- PHP官方现代化核心加密库Sodium
- pie
- 现代化、精简、非阻塞PHP标准库PSL
- PHP泛型和集合
- 手把手教你正确使用 Composer包管理
- JWT双令牌认证实现无感Token自动续期
- 最先进PHP大模型深度学习库TransformersPHP
- PHP如何启用 FFI 扩展
- PHP超集语言PXP
- 低延迟双向实时事件通信 Socket.IO
- PHP OOP中的继承和多态
- 强大的现代PHP高级调试工具Kint
- PHP基金会
- 基于webman+vue3高质量中后台框架SaiAdmin
- 开源免费的定时任务管理系统:Gocron
- 简单强大OCR工具EasyOCR在PHP中使用
- PHP代码抽象语法树工具PHP AST Viewer
- MySQL数据库管理工具PHPMyAdmin
- Rust编写的一款高性能多人代码编辑器Zed
- 超高性能PHP框架Workerman v5.0.0-beta.8 发布
- 高并发系列
- 入门介绍及安装
- Lua脚本开发 Hello World
- 执行流程与阶段详解
- Nginx Lua API 接口开发
- Lua模块开发
- OpenResty 高性能的正式原因
- 记一次查找 lua-resty-mysql 库 insert_id 的 bug
- 包管理工具OPM和LuaRocks使用
- 异步非阻塞HTTP客户端库 lua-resty-http
- Nginx 内置绑定变量
- Redis协程网络库 lua-resty-redis
- 动态HTML渲染库 lua-testy-template
- 单独的
- StackBlitz在线开发环境
- AI
- 基础概念
- 12312
- 基础镜像的坑
- 利用phpy实现 PHP 编写 Vision Transformer (ViT) 模型
- 语义化版本 2.0.0