カスタムデータ型
注意
このチュートリアルでは、 MongoDB\BSON\Persistable を使用してカスタム データ型を実装する説明を説明します インターフェース(MongoDB 拡張機能)。MongoDB 永続化ロジックをビジネス ロジックから分離するには、代わりにコーデックの使用を検討してください。 例については、 コーデックのチュートリアルを参照してください。
MongoDB PHP 拡張機能とライブラリは、直列化と逆直列化中にカスタム クラスをサポートします。 PHP の DateTimeIn Mutable の クラスは特定の時点で保存されます。
拡張機能は、サーバーと通信するときにオブジェクトを含む PHP 変数を BSON に直列化し、サーバーからデータを受信するときに BSON を PHP 変数に逆直列化します。
MongoDB\BSON\Persistable を実装することで動作に影響を与えることができます インターフェースを使用します。クラスがこのインターフェースを実装すると、直列化時に bsonSerialize メソッドが呼び出されます。このメソッドは、BSON に変換してデータベースに保存する配列または stdClass オブジェクトを返すのを担当します。 そのデータは、後でデータベースから読み取りを行う際にオブジェクトを再構築するために使用されます。
例として、 LocalDateTime
クラスを示します。 このクラスは MongoDB\BSON\UTCDateTime をラップします データ型とタイムゾーン。
/* Custom document class that stores a UTCDateTime and time zone and also * implements the UTCDateTime interface for portability. */ class LocalDateTime implements \MongoDB\BSON\Persistable, \MongoDB\BSON\UTCDateTimeInterface { private $utc; private $tz; public function __construct($milliseconds = null, \DateTimeZone $timezone = null) { $this->utc = new \MongoDB\BSON\UTCDateTime($milliseconds); if ($timezone === null) { $timezone = new \DateTimeZone(date_default_timezone_get()); } $this->tz = $timezone; }
MongoDB\BSON\Perstable インターフェースに設定されている場合、 bsonSerialize を実装するには クラスが必要です。 bsonUnserialize 使用して複数のドキュメントを挿入できます。bsonSerialize 内 メソッドとして、永続化する必要がある 2 つの値である配列が返されます。これは、 MongoDB\BSON\UTCDateTime で表される、UNIXエポックからのミリ秒単位の点です。 オブジェクトと、 Olson タイムゾーン識別子を含む string 。
public function bsonSerialize() { return [ 'utc' => $this->utc, 'tz' => $this->tz->getName(), ]; }
この拡張機能により、ドキュメントに__pclass
フィールドが追加され、それもデータベースに保存されます。 このフィールドには PHP クラス名が含まれているため、逆直列化時に拡張機能は保存されたオブジェクトの再作成に使用するクラスを認識できます。
ドキュメントがデータベースから読み取られると、拡張機能は フィールドの有無を検出し、__pclass
MongoDB\BSON\Persistable::bsonUnserialize を実行します オブジェクトの元の状態を復元する役割を持つ メソッド。
以下のコードでは、 フィールドとutc
tz
フィールドのデータが正しいタイミングであることを確認し、その値を 2 つのプライベートプロパティに割り当てます。
public function bsonUnserialize(array $data) { if ( ! isset($data['utc']) || ! $data['utc'] instanceof \MongoDB\BSON\UTCDateTime) { throw new Exception('Expected "utc" field to be a UTCDateTime'); } if ( ! isset($data['tz']) || ! is_string($data['tz'])) { throw new Exception('Expected "tz" field to be a string'); } $this->utc = $data['utc']; $this->tz = new \DateTimeZone($data['tz']); }
クラスが MongoDB\BSON\UTCDateTimeInterface も実装していることに注意してください。 インターフェースを使用します。このインターフェースは、 MongoDB\BSON\UTCDateTime の 2 つの非コンストラクター メソッドを定義します。 クラス。
既存の BSON クラスを囲むラッパーは、それぞれのインターフェース( MongoDB\BSON\UTCDateTimeInterface )。これにより、ラッパー オブジェクトは元のラップされていないバージョンと同じコンテキストで使用できます。また、インターフェースに対して常に型ヒント( MongoDB\BSON\UTCDateTimeInterface )で、具象クラス(MongoDB\BSON\UTCDateTime )、ラップされたオブジェクトがメソッドに受け入れられなくなるためです。
新しいtoDateTime
メソッドでは、 DateTime が返されます MongoDB\BSON\UTCDateTime に関する UTC タイムゾーンではなく、ローカル タイムゾーンが設定されたオブジェクト は通常、戻り値で を使用します。
public function toDateTime() { return $this->utc->toDateTime()->setTimezone($this->tz); } public function __toString() { return (string) $this->utc; } }
クラスが定義されたため、ドキュメント内で使用できるようになりました。 以下のスニペットは、 LocalDateTime
オブジェクトから BSON に、 LocalDateTime
に戻るラウンドトリップを示しています。
$bson = MongoDB\BSON\Document::fromPHP(['date' => new LocalDateTime]); $document = $bson->toPHP(); var_dump($document); var_dump($document->date->toDateTime());
その出力は次のとおりです。
object(stdClass)#1 (1) { ["date"]=> object(LocalDateTime)#2 (2) { ["utc":"LocalDateTime":private]=> object(MongoDB\BSON\UTCDateTime)#3 (1) { ["milliseconds"]=> string(13) "1533042443716" } ["tz":"LocalDateTime":private]=> object(DateTimeZone)#4 (2) { ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/London" } } } object(DateTime)#5 (3) { ["date"]=> string(26) "2018-07-31 14:07:23.716000" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/London" }
Olson タイムゾーン識別子を別の フィールドに保存することも MongoDB の集計フレームワークと連携し、特定のタイムゾーンに応じて日付操作、形式、 クエリ が可能になります。