【PHP】NETTE/NEONを使ってみた

PHP

PHPStanなどで使われているデータフォーマットのNEONをPHPで使ってみました。

NETTE/NEONとは何なのか

NEONとはNETTEプロジェクトが開発したデータフォーマットで、

NETTE Object Notation の略です。

NEON is a human-readable structured data format. It is used for structured data such as configuration files, settings, language translations, etc.

NEON stands for Nette Object Notation. It is less complex and ungainly than XML or JSON, but provides similar capabilities. It is very similar to YAML. The main advantage is that NEON has so-called entities, thanks to which the configuration of DI services is so sexy. And allowes tabs for indentation.

NEON is built from the ground up to be simple to use.

NEON sandbox

上の説明を自動翻訳した結果は次の通りです。

NEON は人間が判読できる構造化データ形式です。構成ファイル、設定、言語翻訳などの構造化データに使用されます。

NEON は Nette Object Notation の略です。 XML や JSON よりも複雑さや不格好さはありませんが、同様の機能を提供します。これは YAML に非常によく似ています。主な利点は、NEON にはいわゆるエンティティがあり、そのおかげで DI サービスの構成が非常に魅力的であることです。また、タブによるインデントも可能です。

NEON は使いやすいようにゼロから構築されています。

NETTE/NEONの特徴

「neon sandbox」というサイトで実際に画面左側のテキストエリア内のNEONをいじってみると

リアルタイムでPHPのvar_dump()とvar_export()を混ぜたような出力形式に変換して

画面右側のテキストエリア内に表示してくれます。

NEON sandbox
Human friendly data serialization standard for all programming languages.

特徴としては、YAMLに似ており、よりシンプルにしたような感じです。

YAML Ain’t Markup Language (YAML™) revision 1.2.2

YAMLは飽く迄も「YAML Ain’t Markup Language(YAMLはマークアップ言語ではありません)」

と宣言しており、定義としては「data language(データ言語)」であるとしています。

これに対し、NEONは「data format(データ書式)」であると説明しています。

サポート言語・ツール

この記事を書いている2023年12月24日時点では、

次の3言語でライブラリがサポートされています。

ツールのプラグインとしては次のものがサポートされています。

PHP用のNEONライブラリをインストール

前提:筆者はUbuntu上で作業しています。

作業用ディレクトリを作成して移動し、Composerでインストールしていきます。

composer require nette/neon

NEONデータファイルを用意してみる

PHPコード内で直接NEON形式のデータを定義して処理することも可能ですが、

メンテナンス性を考慮すると外部ファイルに切り出すのが妥当でしょう。

こんな感じで適当にNEON形式のデータファイルを作成して

「hoge.neon」というファイル名で、

新規作成した「config」フォルダ内に保存してみました。

name: Hoge

country: JP

hobby:
    - coding
    - sleeping
    - eating

lang: {
    php: geek,
    perl: monger,
    javascript: expert,
    python: beginner

favorite-words: '''
    a man
    a plan
    a canal
    panama
'''
}

今回、NEONの書式の説明は省きます。

詳細は「neon sandbox」に簡潔で分かりやすい英語の説明があります。

NEON sandbox
Human friendly data serialization standard for all programming languages.

NEONデータファイルの書式チェック

このライブラリには書式チェックツールの「neon-lint」が付属されています。

作業ディレクトリ内の「config」ディレクトリに保存した「hoge.neon」ファイルの

書式チェックをしてみましょう。

次のコマンドを実行します。

./vendor/bin/neon-lint ./config

「neon-lint」の内容は簡単なPHPコードなので、読んでみると良いでしょう。

GitHubリポジトリのREADMEにはコマンドの書式しか書かれていませんが、

「neon-lint」のコマンドライン引数はディレクトリ名でないといけません。

筆者は最初、ファイル名を指定してしまい、Exceptionスローされてしまいました(TT

仕組みとしては、指定したフォルダ内を再帰的にチェックしていきます。

見つけた各NEONファイルを読み込んで decode() メソッドに掛けて、

ExceptionスローされればchatchしてExceptionMessageを表示するという仕組みのようです。

ついでに、書式エラーがある場合の検証もしてみましょう。

「hoge.neon」の最後の波括弧の手前に不正書式を追記して保存してみます。

phpArray => ['a' => 1, 'b' => 2, ]

この状態で「neon-lint」を再実行してみます。

こんな感じに表示されました。

では、追記した行は削除して、「config/hoge.neon」を元の状態に戻して保存しておきましょう。

念のため、「neon-lint」を実行して書式エラーが出ないことを確認しておきましょう。

PHPコードで読み込んでみる

作業フォルダ内に「src」ディレクトリを作成し、

そのディレクトリ内に「loadConfig.php」なるファイルを作成し、

次のPHPコードを保存してみました。

<?php

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

use Nette\Neon\Neon;

$config = Neon::decodeFile('config/hoge.neon');
var_dump($config);

実行してみます。

php -f src/loadConfig.php

実行結果は次の通りです。

array(4) {
  ["name"]=>
  string(4) "Hoge"
  ["country"]=>
  string(2) "JP"
  ["hobby"]=>
  array(3) {
    [0]=>
    string(6) "coding"
    [1]=>
    string(8) "sleeping"
    [2]=>
    string(6) "eating"
  }
  ["lang"]=>
  array(5) {
    ["php"]=>
    string(4) "geek"
    ["perl"]=>
    string(6) "monger"
    ["javascript"]=>
    string(6) "expert"
    ["python"]=>
    string(8) "beginner"
    ["favorite-words"]=>
    string(27) "a man
a plan
a canal
panama"
  }
}

きっちりPHPの配列に変換されていますね。

コメント

タイトルとURLをコピーしました