YAML 这个货色,说实话,本人用得并不多。在学习自动化测试相干的内容时候,接触过应用这种配置文件来配置 Travis CI 的继续集成操作,当然,过后也是以学习性质为主的。虽说接触得不多,但也晓得的确这种配置格局的写法基本上曾经成为了当初的支流。所以对于具体的 YAML 相干的内容在这里就不多做解释了,还不是太理解的同学能够自行查阅一些相干的文档。
咱们明天来学习的次要是一个 PHP 中用来解析和转换 YAML 格局的扩大,装置过程并没有什么特地的能够阐明的中央,就和其它的扩大一样进行装置即可。不过这个扩大须要一个 libyaml-devel,在 CentOS 中间接通过 yum 或者 dnf 是无奈装置的,咱们能够在文末的链接中找到下载地址。
将 PHP 数据转换成 YAML
对于将 PHP 的数据转换成 YAML 来说,其实就和 JSON 相干的操作差不多,将数组转换成 YAML 格局的字符串。
$addr = array(
"given" => "Chris",
"family"=> "Dumars",
"address"=> array(
"lines"=> "458 Walkman Dr.
Suite #292","city"=>"Royal Oak","state"=>"MI","postal"=> 48046,
),
);
$invoice = array (
"invoice"=> 34843,
"date"=> 980208000,
"bill-to"=> $addr,
"ship-to"=> $addr,
"product"=> array(
array(
"sku"=> "BL394D",
"quantity"=> 4,
"description"=> "篮球",
"price"=> 450,
),
array(
"sku"=> "BL4438H",
"quantity"=> 1,
"description"=> "Super Hoop",
"price"=> 2392,
),
),
"tax"=> 251.42,
"total"=> 4443.52,
"comments"=> "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.",
);
$yamlString = yaml_emit($invoice);
var_dump($yamlString);
// string(624) "---
// invoice: 34843
// date: 980208000
// bill-to:
// given: Chris
// family: Dumars
// address:
// lines: |-
// 458 Walkman Dr.
// Suite #292
// city: Royal Oak
// state: MI
// postal: 48046
// ship-to:
// given: Chris
// family: Dumars
// address:
// lines: |-
// 458 Walkman Dr.
// Suite #292
// city: Royal Oak
// state: MI
// postal: 48046
// product:
// - sku: BL394D
// quantity: 4
// description: "\u7BEE\u7403"
// price: 450
// - sku: BL4438H
// quantity: 1
// description: Super Hoop
// price: 2392
// tax: 251.42
// total: 4443.52
// comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
// ...
// "
能够看到 yaml_emit() 函数转换的后果是十分规范的 YAML 格局。结尾有 —,结尾有 …。但你会发现有很多教程或者框架中的 .yml 文件中是没有这些符号的,从官网文档中得悉这些符号是倡议写得,而咱们的扩大则是十分地恪守倡议,也就是转换的后果十分地规范。
此外,在测试代码中咱们退出了中文的内容。能够看到间接转换的时候中文被编码了。就像 JSON 操作一样,在 YAML 这个扩大的函数中,咱们也能够指定编码格局让中文原样显示。
var_dump(yaml_emit($invoice, YAML_UTF8_ENCODING));
// string(616) "---
// ………………
// description: 篮球
// ………………
// ...
// "
将 YAML 转为 PHP 数组
没错,也是相似于 JSON 操作的,将 YAML 格局的字符串格局内容反转回 PHP 数据内容。
var_dump(yaml_parse($yamlString));
// array(8) {// ["invoice"]=>
// int(34843)
// ["date"]=>
// int(980208000)
// ["bill-to"]=>
// array(3) {// ["given"]=>
// string(5) "Chris"
// ["family"]=>
// string(6) "Dumars"
// ………………
// ………………
同样非常简单地一个 yaml_parse() 函数。除了间接操作字符串之外,咱们还能够间接提取文件内容来进行转换,包含下面的 yaml_emit() 函数也是有相似的间接将后果写入到文件中的。
var_dump(yaml_parse_file('styleci.yml'));
// array(3) {// ["php"]=>
// array(3) {// ["preset"]=>
// string(7) "laravel"
// ["disabled"]=>
// array(1) {// [0]=>
// string(10) "unused_use"
// }
// ["finder"]=>
// array(1) {// ["not-name"]=>
// array(2) {// [0]=>
// string(9) "index.php"
// [1]=>
// string(10) "server.php"
// }
// }
// }
// ["js"]=>
// array(1) {// ["finder"]=>
// array(1) {// ["not-name"]=>
// array(1) {// [0]=>
// string(14) "webpack.mix.js"
// }
// }
// }
// ["css"]=>
// bool(true)
// }
咱们测试的这个文件就是 Laravel 中自带的那个 .styleci.yml 文件。在 Laravel 框架中并没有要求咱们装置这个 YAML 扩大,仿佛在框架中自身就有解决读取转换这种 YAML 格局的工具,这个咱们最初再说。和 yaml_parse_file() 相似地,yaml_emit_file() 是间接将 PHP 数据转换为 YAML 格局之后间接写入到一个文件中,大家能够本人测试一下。
回调函数解决标签
不论是 yaml_emit() 还是 yaml_parse() 都是反对一个回调参数操作的。咱们先来看看例子。
// php:
// preset: !laravel laravel
// disabled:
// ………………
// ………………
function callback($value){return str_replace('laravel', 'new version laravel8', $value);
}
$ndocs = 0;
var_dump(yaml_parse_file('styleci.yml', 0, $ndocs, ['!laravel'=>'callback']));
// array(3) {// ["php"]=>
// array(3) {// ["preset"]=>
// string(20) "new version laravel8"
// ["disabled"]=>
// array(1) {
// ……………………
// ……………………
这是什么意思呢?!laravel 这种写法能够看做是 YAML 中的一种标签格局的写法。而这个回调的作用就是在遇到相似的这类标签的时候,应用什么回调函数来进行解决。比方咱们的原文档中的 !laravel 前面的内容是 laravel。在回调函数中咱们将内容替换成了 new version laravel8,于是,最初输入的后果就是 preset 字段的内容变成了 new version laravel8。当然,更加具体的内容以及更多地语法还是须要咱们深刻地理解 YAML 格局的语法才可能更加分明,所以这里也就不多说了,毕竟本人也接触得不多。
总结
对于这个扩大的内容不多,而且即便是实在的业务环境中须要操作 YAML 格局的配置文件的话预计我也不会用它。为什么呢?当然是因为 Composer 外面曾经有很多解决 YAML 的组件能够供咱们应用啦。齐全不须要通过扩大编译装置的形式来对服务器上的 PHP 环境进行扭转。如果是本人应用的话,在 packagist.org 中能找到很多组件,而如果是应用 Laravel 的话,它的底层应用的其实是 symfony 框架中 yaml 解决组件。间接应用 composer require symfony/yaml 就能够为本人的小我的项目增加这个组件咯。具体内容能够参考这个文档:
https://symfony.com/doc/current/components/yaml.html
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/01/source/10. 学习 PHP 中 YAML 操作扩大的应用.php
参考文档:
https://www.php.net/manual/zh/book.yaml.php
http://www.rpmfind.net/linux/rpm2html/search.php?query=libyaml-devel(x86-64))
http://bd808.com/pecl-file_formats-yaml/