PHPでオブジェクトをシリアライズする

serializeを使ってSerialization of 'Closure' is not allowedになった場合はOpis Closureを使ってみると良さそう。

super_closureというのもある。


Opis Closure

composer require --dev opis/closure

use function Opis\Closure\{serialize as opisSerialize, unserialize as opisUnserialize};

$path = 'tests/fixtures/serialize/objectName';

// 保存
$file = new \SplFileObject(base_path($path), 'w');
$file->fwrite(encrypt(opisSerialize($objectName))));// encrypt、base_pathはlaravelのもの

// 復元

$object = opisUnserialize(decrypt(file_get_contents(base_path($path))));// decrypt、base_pathはlaravelのもの

シリアライズされた文字列はセキュリティ的な意味で気を付けたいので、ものによっては暗号化

使いどころの例


  • 複雑なオブジェクトを返すメソッドを持つ外部APIの公式ライブラリがある。

  • このオブジェクトを引数とするアプリ内のメソッドを作ってみたのでテストをしたい。

  • テストではテストのAPIでも叩きたくないが、ライブラリ使用しないで自力でオブジェクトを作るのが難しい。

上記のとき、開発用のAPIを叩いた際に取得できたオブジェクトをシリアライズしてテスト時にデシリアライズして使うようにしてみたり。