配列の加工をしたい時に便利なPHPライブラリ「fractalistic」の紹介です。
fractalistic は PHPライブラリ ' Fractal
' のラッパーで、アウトプットする配列の構造を 自由に並べ替えたり、キー名の変更、 値を新たなオブジェクト名にまるめたりなど、配列を簡単に加工できます。
また、fractalisticは本家のFractal より短いコードで記述することが出来るように作られています。
例えば、DBからの取得でよくありそうな 下の配列を ...
// 加工前
[
"id" => 1,
"username" => "user1",
"email" => "user1@example.mail",
"first_name" => "太郎",
"last_name" => "田中",
"first_name_reading" => "たろう",
"last_name_reading" => "たなか",
],[ /* .. goes on .. */ ]
値にアクセスし易そうな配列に加工することが、簡単に出来るようになります。
// 加工後
[
"id" => 1,
"username" => "user1",
"email" => "user1@example.mail",
"name" => [
"first" => "太郎",
"last" => "田中"
],
"reading" => [
"fist" => "たろう",
"last" => "たなか"
]
],[ /* .. goes on .. */ ]
fractalistic のインストールは コマンドライン上から ' composer
' コマンドを使って行います。なお、PHPのバージョンは " 5.6以上
"、又は " 7.0以上
"がサポートされています。
( * 本家 Flactal は " 5.4.0
" から動作します )
# プロジェクトルートから composer コマンドを使ってインストール
composer require spatie/fractalistic
fractalistic の使い方は簡単で 以下の4ステップで配列の構造を加工することができます。
* fractalisticのworkflow
1. ' Fractal::create()
' でFractalクラスの初期化
2. ' collection($arr)
' メソッドで、ベースとなるデータ( 配列 ) の指定
3. ' transformWith( callback )
' メソッドで配列の構造 ( スキーマ ) を指定
4. ' toArray()
' メソッドで加工したデータ( オブジェクトになっています ) を 配列に変換
( * ' toJson()
' メソッドを使えば加工した配列を JSONオブジェクトに変換できます )
以上をチェーンメソッドでおこなえます。
また、ベースとなる配列が Laravelフレームワークの Eloquent の Model であっても問題ありません。
require "vendor/autoload.php";
use Spatie\Fractalistic\Fractal;
// ベースとなる配列
$users = [
[
"id" => 1,
"username" => "user1",
"email" => "user1@example.mail",
"first_name" => "太郎",
"last_name" => "田中",
"first_name_reading" => "たろう",
"last_name_reading" => "たなか",
],
[ /* some arrays */ ]
];
// Fractalisticで配列を加工
$test = Fractal::create()
->collection($users) // 加工する配列の指定
->transformWith(function ($user) {
// transformWith内でアウトプットするスキーマを定義
return [
'id' => $user->id,
'username' => $user->username,
'name' => [
'first' => $user->first_name,
'last' => $user->last_name,
],
'reading' => [
'first' => $user->first_name_reading,
'last' => $user->last_name_reading
]
];
})->toArray();
/** 加工後 * var_dump($test['data'])
[
"id" => 1,
"username" => "user1",
"email" => "user1@example.mail",
"name" => [
"first" => "太郎",
"last" => "田中"
],
"reading" => [
"fist" => "たろう",
"last" => "たなか"
]
]
*/

' collection()
' メソッドの 第二引数で コールバック使うことで、 ' transformWith()
'メソッドを省略することも出来ます。
// 配列の構造を定義
// * 実際に定義する時は、trait や class にまとめたほうが綺麗に書けそうです
$arraySchema = function($user) {
return [
'id' => $user->id,
'username' => $user->username,
'name' => [
'first' => $user->first_name,
'last' => $user->last_name,
],
'reading' => [
'first' => $user->first_name_reading,
'last' => $user->last_name_reading
]
];
};
// transformWith()メソッドを省略
Fractal::create()
->collection($users, $arraySchema)
// これでもOK
/* ->collection($users, function($user) {
return [
'id' => $user->id,
'username' => $user->username,
'name' => [
'first' => $user->first_name,
'last' => $user->last_name,
],
'reading' => [
'first' => $user->first_name_reading,
'last' => $user->last_name_reading
]
];
}) */
->toJson(); // JSONに変換
加工した配列に データを追加する ' addMeta()
' も用意されています。配列1つ1つにデータを追加するのではなく、オブジェクトに ' meta
' 配列が追加されます。
Fractal::create()
->collection($users, $arraySchema)
// metaデータを追加
->addMeta(['key1' => 'value1'], ['key2' => 'value2'])
->toArray();
/* output
array:2 [▼
"data" => array:2 [▶]
"meta" => array:2 [▼
"key1" => "value1"
"key2" => "value2"
]
]
*/
以上が fractalisticの紹介でした。今回は紹介していませんが pagination用のメソッドや、 また、同じ開発者の元、Laravelフレームワーク用のfractalisticプラグイン「laravel-fractal
」もリリースされています。
DBのカラム名がクドい場合でも、 ' AS
' クエリを使わず配列のキー名を変更できたり、AJAX用にわかりやすいオブジェクトにしたりなど、プロジェクトの種類を問わず 様々な場面で約に立ちそうなライブラリです。
GitHub : spatie/fractalistic