💧

5分で分かる! PHP での Hydrator, Mapper, Serializer, Marshalという用語

2022/08/27に公開

この記事は筆者が調べ直してないものなので正確性に欠ける場合があります。

Hydratorパターン, hydrate メソッド

PHP に限らず Hydrator, Hydration, hydrate という概念があります。

The Hydrator pattern is a variation of the Data Transfer Object design pattern
https://www.oreilly.com/library/view/php-7-programming/9781785883446/ch11s02.html

※ 私は2022年の今日、オライリーにこんな解説があるのを知りました。。

これは用語としては、PHPにおいては Doctrine 2 が Java の hibernateを参照して作られたことから、用語として拝借したもので間違いないと思います。

Doctrine 2, Zend Framework 2 での Hydrate

Doctrine 2 では、ORM の一部として Hydration が登場しており、こちらはエンティティのメタデータなどと結合しているものです。

一方で、やや遅れてでの ZF2 では ZF2 の基本コンポーネントとして登場し、ZF 2で大幅に変更された Db コンポーネントや Form コンポーネントで利用されることになります。こちらは、オブジェクトと配列の相互変換に注力されています。

ZF2、のちの laminas-hydrator は特定のDBライブラリと結合していなかったので cycle/orm などでも利用されていました。

Mapper, Serializer, Marshal ??

一方で似た機能を提供するもの/概念で、Mapper, Serializer, Marshalなどがあげられます。

Mapper

Mapper パターンを指す場合もありますし、特定のORMライブラリを指す場合もあります。

Serializer

PHP には標準関数で、serialize()unserialize()がありスカラー値と配列に対する直列化という点でのシリアライズ・デシリアライズはよくworkします。
が、オブジェクトが絡んだ複雑な場合への対応が必要です。その観点からのライブラリが Serializer/Deserializer です。(※)

いわゆる Symfony界隈では、jms/serializer がかつてから有名なライブラリです。

Symfonyにも Serializerライブラリがありますが、登場はだいぶ後だったと思います。(追記:git log 見たらSymfony のが先でした。機能が豊富なのはJMSのほうだったと思いますが)

laminas-serializer のように、serialize()に近い単純な変換をするライブラリももちろんあるので、ややこしさのもとです。

Marshal

また、似たような機構を指す用語として、Marshal が挙げられます。

(SolarPHP にもあったかどうかよく分かんないので お近くの Paul M. Jones 好きに聞いてください。)

オブジェクトに対して行うか?クラスに対して行うか?

Hydrator, Mapper, Serializer, Marshaler という似たようなライブラリ・機構があるわけですが、各ライブラリのメソッドを見比べると、

public function hydrate(array $data, object $object);
$serializer->deserialize($data, Person::class, 'xml');

などと、オブジェクトに対して行うか?クラスに対して行うか?の違いが見受けられます。これは"Hydrator はオブジェクトを対象にするもの" ということではなく作者によりまちまちなインターフェイスです。そもそもそのライブラリが何を目的に作られたかの由来によるものと考えたほうがよいでしょう。

cuyz/valinor は Mapper? Hydrator?

最近注目のライブラリ valinor は見出しこそ"PHP object mapper with strong type support" とつけていますが、

"object", "tree", "mapper", "mapping", "hydrator", "array", "conversion", "json", "yaml"

としてタグ付けされているのは、前述の過程から納得できるものでしょう。

Discussion