配列の加工をしたい時に便利なPHPライブラリ「fractalistic」の紹介です。

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 のインストール

 fractalistic のインストールは コマンドライン上から ' composer ' コマンドを使って行います。なお、PHPのバージョンは " 5.6以上 "、又は " 7.0以上 "がサポートされています。
( * 本家 Flactal は " 5.4.0 " から動作します )

# プロジェクトルートから composer コマンドを使ってインストール
composer require spatie/fractalistic


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" => "たなか"
  ]
]
*/

* fractalisticを使った場合との、配列の比較


 ' 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"
  ]
]
*/


Summary

 以上が fractalisticの紹介でした。今回は紹介していませんが pagination用のメソッドや、 また、同じ開発者の元、Laravelフレームワーク用のfractalisticプラグイン「laravel-fractal」もリリースされています。

 DBのカラム名がクドい場合でも、 ' AS ' クエリを使わず配列のキー名を変更できたり、AJAX用にわかりやすいオブジェクトにしたりなど、プロジェクトの種類を問わず 様々な場面で約に立ちそうなライブラリです。

GitHub : spatie/fractalistic

 

 

この記事のカテゴリ

プログラミング

この記事のタグ

PHP , 効率化 , Laravel

Socialシェアボタン

スポンサーリンク