Skip to content

ja Entity helpers

USAMI Kenta edited this page May 5, 2017 · 1 revision

Entity\helpers

あなたに手続きを…

Entity\helpersとは何か

Entityの構築とシリアライズのために汎用的に利用される処理を集めたファイル。

この手の共通処理を書く場所として、まあだいたい以下のようなパターンがある。(ざっと挙げただけで全然網羅的ではないです)

  • a) abstract クラスの実装として持たせて、全クラスに継承させる
  • b) 実装を trait に分割して、利用する全クラスに use させる
  • c) ユーティリティクラスの静的メソッドとして実装する
  • d) 完全に独立したクラスのインスタンスメソッドとして実装する
  • e) 函数として実装する

で、今回は e にしてみました。それぞれのメリットデメリットはいろいろあるけど、 a, b はあまりやりたくなかった。

とは言っても名前空間入りの函数で、ほかのEntityクラスと同じBaguette\Mastodon\Entity名前空間に置かれてるので、ユーザーはあまり意識しなくても名前空間修飾なしで呼べることになるので、ちょっとべんり。

Entity\helpersの実装

この名前空間にある二つの函数は、対になってるように見えても、実は実装上の共通点は全然ない。

Entity\map() の実装

この函数は以下のように利用する

<?php

use Baguette\Mastodon\Entity as e;

$array = [
    'name' => 'たっどさんあぷり',
    'website' => 'https://github.com/BaguettePHP/mastodon-api'
];

/** @var e\Application */
$obj = e\map(e\Application::class, $array);

これは以下のコードと同じ意味だ。

$obj = new e\Application($array);

あれ、短くなった… (わざわざmapしない方が)

<?php

use Baguette\Mastodon\Entity as e;

$array = [
    [
        'name' => 'たっどさんあぷり 1',
        'website' => 'https://github.com/BaguettePHP/mastodon-api',
    ],
    [
        'name' => 'たっどさんあぷり 2',
        'website' => 'https://github.com/BaguettePHP/mastodon-api',
    ],
    [
        'name' => 'たっどさんあぷり 3',
        'website' => 'https://github.com/BaguettePHP/mastodon-api',
    ],
];

/** @var e\Application[] */
$obj = e\map([e\Application::class], $array);

これは、以下のようになるかな。

/** @var e\Application[] */
$obj = [];
foreach ($array as $a) {
    $obj[] = new e\Application($array);
}

こんどはmapを使った方が文の数が減らせましたね。

Entity\toArrayValue() の実装

特に語るところがない気が… \Teto\Object\Helper::toArray()に横流ししてるだけです。

ちなみになんですけど、\Teto\Object\Helper::toArray()の方は、先述の例だと c に相当するユーティリティクラスが選択されてますね。