52
JSON SchemaとPHP 第72回 PHP勉強会@東京

JSON SchemaとPHP

Embed Size (px)

DESCRIPTION

第72回 PHP勉強会@Engine Yard で発表した資料です。

Citation preview

Page 1: JSON SchemaとPHP

JSON SchemaとPHP第72回 PHP勉強会@東京

Page 2: JSON SchemaとPHP

自己紹介

•中野拓

• https://twitter.com/Hiraku

• http://blog.tojiru.net/

• PHP歴6年ぐらい• 最近使ってるフレームワークはYafとPhalconです

• WebAPI関係のお仕事

• 最近コード書いてない。。

Page 3: JSON SchemaとPHP

第一部

Page 4: JSON SchemaとPHP

JSON

Schema

Page 5: JSON SchemaとPHP
Page 6: JSON SchemaとPHP

JSON Schema

• JSONの構造をバリデーションするための仕様

• http://json-schema.org/

• http://json-schema.org/latest/json-schema-core.html

Page 7: JSON SchemaとPHP
Page 8: JSON SchemaとPHP

JSONの例

{

“id”: 12345,

“name”: “Hiraku NAKANO”,

“tags”: [“PHP”,”JavaScript”]

}

Page 9: JSON SchemaとPHP

JSON Schema

{

“id”: 12345,

“name”: “Hiraku NAKANO”,

“tags”: [“PHP”,”JavaScript”]

}

integer

string

string[]

id, name, tags というプロパティを持ったオブジェクト

{“type”:”object”,“properties”: {“id”: {“type”:”integer”},“name”: {“type”:”string”},“tags”: {

“type”:”array”,“items”:{“type”:”string”}

}}}

Page 10: JSON SchemaとPHP

もし型が違ったら、判定できる

{

“id”: 12345,

“name”: “Hiraku NAKANO”,

“tags”: “PHP,JavaScript”

}

integer

string

string[]

id, name, tags というプロパティを持ったオブジェクト

{“type”:”object”,“properties”: {“id”: {“type”:”integer”},“name”: {“type”:”string”},“tags”: {

“type”:”array”,“items”:{“type”:”string”}

}}}

Page 11: JSON SchemaとPHP

JSON Schema

バリデーション仕様書

• JSONで記述する

バリデーター実装

• 仕様書を読み取ってバリデーションを実行する

• 言語ごとに存在

• PHP,JavaScript,Ruby,...

Page 12: JSON SchemaとPHP

PHPでの実装

• JSON Schema for PHP がオススメhttps://github.com/justinrainbow/json-schema

• composerの内部で使われている

Page 13: JSON SchemaとPHP

<?phprequire ‘vendor/autoload.php’;

$json = ‘{“a”:1, “b”:2}’;$schema = ‘{“type”:”object”,“properties”:{“a”: {“type”:”integer”},“b”: {“type”:”integer”}

}}’;

$v = new JsonSchema¥Validator;$v->check(json_decode($json), json_decode($schema));

var_dump($v->getErrors()); エラーがあれば指摘してくれる

Page 14: JSON SchemaとPHP
Page 15: JSON SchemaとPHP

超単純な例

JSON

{}

“abc”

123

[1,2,3]

スキーマ

{“type”:”object”}

{“type”:”string”}

{“type”:”integer”}

{“type”:”array”}

Page 16: JSON SchemaとPHP

数値なら上限下限指定できる

JSON

3

スキーマ

{

“type”:”integer”,

“minimum”:2,

“maximum”:5

}

Page 17: JSON SchemaとPHP

文字列なら正規表現が使える

JSON

“abcdef”

スキーマ

{

“type”:”string”,

“pattern”:”^a.*f$”

}

Page 18: JSON SchemaとPHP

よく使うパターンはformatで

JSON

[email protected]

スキーマ

{

“type”:”string”,

“format”:”email”

}

date, time, date-time,uri, host-name, email,ipv6, ip-address,color, style,

Page 19: JSON SchemaとPHP

型固定の配列

JSON

[1,2,3]

スキーマ

{

“type”:”array”,

“items”:{

“type”:”integer”

}

}

Page 20: JSON SchemaとPHP

配列要素数の制約

JSON

[1,2,3]

スキーマ

{

“type”:”array”,

“minItems”:1,

“maxItems”:5

}

Page 21: JSON SchemaとPHP

入れ子のオブジェクト

JSON

{

“alice”: 123,

“bob”: {

“charlie”: 223

}

}

スキーマ{“type”:”object”,“properties”:{

“alice”: ...“bob”: {“type”:”object”

}}

}

無限に入れ子可能

Page 22: JSON SchemaとPHP

未定義のプロパティ拒否

JSON

{

“alice”: 123,

“bob”: 223,

“charlie”: 323

}

スキーマ{“type”:”object”,“properties”: {

“alice”: ...“bob”: ...

},“additionalProperties”:

false}

Page 23: JSON SchemaとPHP

一通りそろってる感じがする

•詳しくはJSON Schema for PHPのテストを参照!

•入れ子など、構造のバリデーションが得意なのがJSON Schemaの特徴

Page 24: JSON SchemaとPHP

まとめ

• JSON Schemaを使うと、JSONをチェックして、期待通りの構造になっているか調べることができます。

• PHPにもJSON Schemaの実装があります。

Page 25: JSON SchemaとPHP

第一部完

Page 26: JSON SchemaとPHP

...

Page 27: JSON SchemaとPHP
Page 28: JSON SchemaとPHP

「JSONの構造をバリデーションして何が嬉しいのか?」についてこれから解説します

Page 29: JSON SchemaとPHP

第二部

Page 30: JSON SchemaとPHP

PHPとJSON

Page 31: JSON SchemaとPHP

突然ですが

Page 32: JSON SchemaとPHP

PHPはJSONで出来ています

Page 33: JSON SchemaとPHP

...

Page 34: JSON SchemaとPHP

って思われそうなのでもう少し丁寧に言うと

Page 35: JSON SchemaとPHP

PHPのデータ構造はJSON互換です

Page 36: JSON SchemaとPHP

JSONと言えば

• boolean, number, stringなどの基本的な型

• array, object を多段に入れ子にした構造

Page 37: JSON SchemaとPHP
Page 38: JSON SchemaとPHP

$_GET例1

Page 39: JSON SchemaとPHP

?a[]=1&a[]=2&a[]=3&b=hogehoge

$_GET === [‘a’ => [‘1’,’2’,’3’],‘b’ => ‘hogehoge’

]

JSONだよね!

Page 40: JSON SchemaとPHP

{“type”:”object”,“properties”:{

“a”:{“type”:”array”,“maxItems”:3

},“b”:{“type”:”string”}

}}

Page 41: JSON SchemaとPHP

<?php//...$v = new JsonSchema¥Validator;$get = json_decode(json_encode($_GET));

$v->check($get, $schema);

var_dump($v->getErrors());

Page 42: JSON SchemaとPHP

普通に$_GETをバリデーションすると結構面倒くさい

<?phpif (isset($_GET[‘a’], $_GET[‘b’]) &&is_array($_GET[‘a’]) &&count($_GET[‘a’]) <= 3 &&is_string($_GET[‘b’])

) {//...

}

issetの嵐

これだと何が原因で駄目だったのか分か

らない

もっと入れ子になっていると更に厄介

Page 43: JSON SchemaとPHP

関数の引数

例2

Page 44: JSON SchemaとPHP

<?php/*** @param int $a* @param string $b* @param array $config*/function hoge($a, $b, array $config) {//...

}

Page 45: JSON SchemaとPHP

<?phpfunction hoge($a, $b, array $config) {$args = get_defined_vars();$args === [‘a’ => ...,‘b’ => ...,‘config’ => ...

];}

Page 46: JSON SchemaとPHP

{“type”:”object”,“properties”:{

“a”:{“type”:”integer”},“b”:{“type”:”string”},“config”:{“type”:”object”,...

}}

}

Page 47: JSON SchemaとPHP

以下省略

Page 48: JSON SchemaとPHP

つまり

Page 49: JSON SchemaとPHP

JSON Schemaとは、JSON相当のデータ構造なら何でもバリデーションできる応用範囲の超広いライブラリなのです

Page 50: JSON SchemaとPHP
Page 51: JSON SchemaとPHP

まとめ

•PHP=だいたいJSON

•ゆえに、JSON SchemaはPHPのデータ構造ならだいたい何でもバリデーションできる

•手持ちのバリデーションライブラリの1つとして、覚えておくといいと思います

Page 52: JSON SchemaとPHP

$ composer require justinrainbow/json-schema(依存パッケージもないので割と使いやすいと思う)