• 技术文章 >后端开发 >php教程

    什么是TOML?PHP中怎么配置使用TOML

    青灯夜游青灯夜游2022-09-21 20:35:19转载190
    本篇文章带大家聊聊PHP中的TOML配置,介绍一下在 PHP 中如何使用 TOML 配置文件格式语言,希望对大家有所帮助!

    php入门到就业线上直播课:进入学习

    TOML 是一个配置格式化语言,特色是简洁易读。 全称为 "Tom's Obvious, Minimal Language" 其中的 Tom 为创建者 —— Tom Preston-Werner (译者注:Github CEO)。

    来自其 Github Reopo,TOML 的目的如下:

    TOML 是一门简洁易用的配置信息格式化语言,高可读性来自于其优雅的语法。 TOML 为哈希表数据结构量身定制的,在各种编程语言里皆可以轻松地将 TOML 解析为各自的数据结构。

    TOML 和 PHP 在一起

    各种语言的 TOML 解析器可以 在其项目 WIKI 中找到

    我们将利用 yosymfony/toml: 一个 PHP 的 TOML 解析器 来尝试下 TOML 语言,在你的 PHP 7.1+ 项目里使用 Composer:

    composer require yosymfony/toml

    TOML 的项目 Readme 里有一个示例配置信息,我们可以试着用起来:

    ## This is a TOML document.
    
    title = "TOML Example"
    
    [owner]
    name = "Tom Preston-Werner"
    dob = 1979-05-27T07:32:00-08:00 # First class dates
    
    [database]
    server = "192.168.1.1"
    ports = [ 8001, 8001, 8002 ]
    connection_max = 5000
    enabled = true
    
    [servers]
    
      # Indentation (tabs and/or spaces) is allowed but not required
      [servers.alpha]
      ip = "10.0.0.1"
      dc = "eqdc10"
    
      [servers.beta]
      ip = "10.0.0.2"
      dc = "eqdc10"
    
    [clients]
    data = [ ["gamma", "delta"], [1, 2] ]
    
    # Line breaks are OK when inside arrays
    hosts = [
      "alpha",
      "omega"
    ]

    下面是 PHP 的解析和输出:

    <?php
    
    use Yosymfony\Toml\Toml;
    
    require __DIR__ . '/vendor/autoload.php';
    
    $data = Toml::ParseFile(__DIR__.'/example.toml');
    
    var_dump($data);
    
    // output
    php index.php
    string(10) "1979-05-27"
    toml-demo|⇒ php index.php
    array(5) {
      ["title"]=>
      string(12) "TOML Example"
      ["owner"]=>
      array(2) {
        ["name"]=>
        string(18) "Tom Preston-Werner"
        ["dob"]=>
        object(DateTime)#243 (3) {
          ["date"]=>
          string(26) "1979-05-27 07:32:00.000000"
          ["timezone_type"]=>
          int(1)
          ["timezone"]=>
          string(6) "-08:00"
        }
      }
      ["database"]=>
      array(4) {
        ["server"]=>
        string(11) "192.168.1.1"
        ["ports"]=>
        array(3) {
          [0]=>
          int(8001)
          [1]=>
          int(8001)
          [2]=>
          int(8002)
        }
        ["connection_max"]=>
        int(5000)
        ["enabled"]=>
        bool(true)
      }
      ["servers"]=>
      array(2) {
        ["alpha"]=>
        array(2) {
          ["ip"]=>
          string(8) "10.0.0.1"
          ["dc"]=>
          string(6) "eqdc10"
        }
        ["beta"]=>
        array(2) {
          ["ip"]=>
          string(8) "10.0.0.2"
          ["dc"]=>
          string(6) "eqdc10"
        }
      }
      ["clients"]=>
      array(2) {
        ["data"]=>
        array(2) {
          [0]=>
          array(2) {
            [0]=>
            string(5) "gamma"
            [1]=>
            string(5) "delta"
          }
          [1]=>
          array(2) {
            [0]=>
            int(1)
            [1]=>
            int(2)
          }
        }
        ["hosts"]=>
        array(2) {
          [0]=>
          string(5) "alpha"
          [1]=>
          string(5) "omega"
        }
      }
    }

    配置信息示例

    接下来我们试着将 Laravel 的配置信息 config/database.php 解析为 TOML ,做个对比。

    需要注意的是,这只是一个示范,Laravel 的配置系统要比 TOML 高级很多,这里这样做的目的只是想在我们熟悉的配置信息里去理解 TOML:

    [database]
        default = "mysql"
        migrations = "migrations"
    
        [database.connections.sqlite]
            driver = "sqlite"
            database = "path/to/database.sqlite"
            prefix = ""
    
        [database.connections.mysql]
            driver = "mysql"
            host = "127.0.0.1"
            port = "3306"
            database = "forge"
            username = "forge"
            password = ""
            unix_socket = ""
            charset = "utf8mb4"
            collation = "utf8mb4_unicode_ci"
            prefix = ""
            strict = true
    
        [database.redis]
            client = "predis"
    
            [database.redis.default]
                host = "127.0.0.1"
                password = ""
                port = 6379
                database = 0

    目前来讲,TOML 并不允许 nilnull 值,这在一些使用 null 作为默认值的场景下会变得很不方便。

    缩进是允许的,但是不强求,上面的文件使用以下写法也不会有问题:

    [database]
    default = "mysql"
    migrations = "migrations"
    
    [database.connections.sqlite]
    driver = "sqlite"
    database = "path/to/database.sqlite"
    prefix = ""
    
    # ...

    构建一个 TOML 配置文件

    扩展包 yosymfony/toml 除了提供解析 TOML 文件和字串外,还提供了一个 TomlBuilder 类,用来实时构建 TOML 配置信息,接下来我们还是使用 Laravel 的 config/services.php 来作为例子讲解:

    <?php
    
    use Yosymfony\Toml\TomlBuilder;
    
    require __DIR__.'/vendor/autoload.php';
    
    $builder = new TomlBuilder();
    
    $services = $builder
        ->addComment('Third Party Services')
        ->addComment('Mailgun')
        ->addTable('services.mailgun')
            ->addValue('domain', 'mg.example.com')
            ->addValue('secret', 'mailgun-secret')
        ->addComment('Stripe')
        ->addTable('services.stripe')
            ->addValue('model', 'App\User')
            ->addValue('key', 'stripe-key')
            ->addValue('secret', 'stripe-secret')
    ;
    
    file_put_contents(__DIR__.'/services.toml', $services->getTomlString());

    生成的内容如下:

    #Third Party Services
    #Mailgun
    
    [services.mailgun]
    domain = "mg.example.com"
    secret = "mailgun-secret"
    #Stripe
    
    [services.stripe]
    model = "App\\User"
    key = "stripe-key"
    secret = "stripe-secret"

    日期

    TOML 支持 RFC 3339 制定的日期格式:

    # Offset Date-Time
    odt1 = 1979-05-27T07:32:00Z
    odt2 = 1979-05-27T00:32:00-07:00
    odt3 = 1979-05-27T00:32:00.999999-07:00
    # space permitted per the RFC 3339 spec
    odt4 = 1979-05-27 07:32:00Z
    
    # Local Date-Time
    ldt1 = 1979-05-27T07:32:00
    
    # Local Date
    ld1 = 1979-05-27
    
    # Local Time
    lt1 = 07:32:00
    lt2 = 00:32:00.999999

    在此篇文章编写时,上面大部分的格式都出现了错误,除了下面这一行:

    dob = 1979-05-27T07:32:00-08:00

    PHP 解析器会将解析成功输出为 DateTime 实例:

    array(1) {
      ["dob"]=>
      object(DateTime)#128 (3) {
        ["date"]=>
        string(26) "1979-05-27 07:32:00.000000"
        ["timezone_type"]=>
        int(1)
        ["timezone"]=>
        string(6) "-08:00"
      }
    }

    阅读更多

    前往官方项目页了解更多信息 —— GitHub -- toml-lang/toml: Tom's Obvious, Minimal Language

    项目 Wiki 里可以找到各种语言的解析器: toml-lang/toml Wiki

    英文原文地址:https://laravel-news.com/toml-configuration-in-php

    推荐学习:《PHP视频教程

    以上就是什么是TOML?PHP中怎么配置使用TOML的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:TOML php
    上一篇:曝一段十多年前的“情史”:PHP和Facebook的感情经历 下一篇:聊聊怎么利用PHP读取大文件(教程分享)
    VIP课程(WEB全栈开发)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• php中数组的值可以重复吗• php数组键可以用数字或者什么• php怎么用一个值替换数组元素• php二维数组中怎么检测子数组元素是否存在• php数组是不是引用类型• php怎么判断数组元素是否都为null
    1/1

    PHP中文网