• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

PHP 中高效的读取和写入生成 yaml 配置文件

武飞扬头像
csdn
帮助906

前言

PHP 读取YAML文件和生成YAML文件的简单操作方法,PHP 把 yaml 转换成数组有两种方式, 一种用 yaml 扩展, 另一种使用 别人开发好的 PHP_yaml 扩展。

一、使用 composer require symfony/yaml 来操作yaml

1、安装,前提配置好了 composer

composer require symfony/yaml 

2、代码中引入

<?php

// Yaml
use Symfony\Component\Yaml\Yaml;
3、基本使用
<?php

// Yaml
use Symfony\Component\Yaml\Yaml;

// 解析 YAML 为数组
$value = Yaml::parse("foo: bar");

// 读取 YAML 文件
$value = Yaml::parseFile('/path/to/file.yaml');

// 定义数组
$array = [
    'foo' => 'bar',
    'bar' => ['foo' => 'bar', 'bar' => 'baz'],
];

// 把 PHP 数组 转换成 YAML 配置
$yaml = Yaml::dump($array);

// 存储到指定文件中
file_put_contents('/path/to/file.yaml', $yaml);

二、使用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 laravel9 ,

最后输出的结果就是 preset 字段的内容变成了 new version laravel8 。

更加详细的内容以及更多地语法还是需要我们深入地了解 YAML 格式的语法才能够更加清楚。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanehee
系列文章
更多 icon
同类精品
更多 icon
继续加载