문서 메뉴

문서 홈PHP 라이브러리 매뉴얼

사용자 지정 데이터 유형

참고

이 튜토리얼에서는 MongoDB\BSON\Persistable 을 사용하여 사용자 지정 데이터 유형을 구현하는 방법을 설명합니다. MongoDB 확장에 있는 인터페이스입니다. 대신 코덱을 사용하여 비즈니스 로직에서 MongoDB 지속성 로직을 분리하는 것이 좋습니다. 예제는 코덱 튜토리얼 을 참조하세요.

MongoDB PHP 확장 및 라이브러리는 직렬화 및 역직렬화하는 동안 사용자 지정 클래스를 지원합니다. 이 기능이 유용할 수 있는 경우의 예로는 PHP의 DateTimeImmutable 속성 이 설정된 시간대 정보를 유지한 날짜/시간 정보를 저장하려는 경우가 있습니다. 특정 시점의 클래스 저장소.

드라이버는 서버와 통신할 때 객체를 포함한 PHP 변수를 BSON으로 직렬화하고, 서버에서 데이터를 받을 때 BSON을 PHP 변수로 다시 역직렬화합니다.

MongoDB\BSON\Persistable 을 구현하여 동작에 영향을 줄 수 있습니다. 인터페이스. 클래스가 이 인터페이스를 구현하는 경우 직렬화 시 bsonSerialize 메서드가 호출됩니다. 이 메서드는 BSON으로 변환하고 데이터베이스에 저장할 배열 또는 stdClass 객체를 반환하는 역할을 합니다. 해당 데이터는 나중에 데이터베이스에서 읽을 때 객체를 재구성하는 데 사용됩니다.

예를 들어 LocalDateTime 클래스를 소개합니다. 이 클래스는 MongoDB\BSON\UTCDateTime 데이터 유형 및 시간대.

<?php
/* 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\Persistable 인터페이스에서 bsonSerialize 를 구현하려면 클래스가 필요합니다. 및 bsonUnserialize 메서드. bsonSerialize 에서 메서드를 사용하면 유지해야 하는 두 값이 포함된 배열 을 반환합니다. 객체와 Olson 표준 시간대 식별자가 포함된 문자열입니다.

<?php
public function bsonSerialize()
{
return [
'utc' => $this->utc,
'tz' => $this->tz->getName(),
];
}
?>

드라이버는 문서에 __pclass 필드를 추가로 추가하고 해당 필드도 데이터베이스에 저장합니다. 이 필드에는 역직렬화 시 드라이버가 저장된 객체를 다시 만드는 데 사용할 클래스를 알 수 있도록 PHP 클래스 이름이 포함됩니다.

데이터베이스에서 문서를 읽을 때 드라이버는 __pclass 필드가 있는지 감지한 다음 MongoDB\BSON\Persistable::bsonUnserialize 를 실행합니다. 메서드는 객체의 원래 상태를 복원하는 역할을 합니다.

아래 코드에서는 utctz 필드의 데이터가 올바른 시간인지 확인한 다음 두 비공개 속성에 해당 값을 할당합니다.

<?php
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 의 두 가지 비생성자 메서드를 정의합니다. 클래스.

기존 BSON 클래스를 감싸는 래퍼는 해당 인터페이스를 구현하는 것이 좋습니다(예: MongoDB\BSON\UTCDateTimeInterface) 래퍼 객체를 원래 래핑되지 않은 버전과 동일한 컨텍스트에서 사용할 수 있습니다. 또한 항상 인터페이스(예: MongoDB\BSON\UTCDateTimeInterface), 구체적인 클래스(예: MongoDB\BSON\UTCDateTime), 래핑된 객체가 메서드에 허용되지 않기 때문입니다.

새로운 toDateTime 메서드에서는 DateTime 을 반환합니다. MongoDB\BSON\UTCDateTime 이 설정한 UTC 시간대 대신 현지 시간대가 설정된 객체 일반적으로 반환 값에 을(를) 사용합니다.

<?php
public function toDateTime()
{
return $this->utc->toDateTime()->setTimezone($this->tz);
}
public function __toString()
{
return (string) $this->utc;
}
}
?>

클래스가 정의되었으므로 이제 문서에서 사용할 수 있습니다. 아래 스니펫은 LocalDateTime 객체에서 BSON으로, 그리고 다시 LocalDateTime 로 왕복 이동하는 것을 보여줍니다.

<?php
$bson = MongoDB\BSON\fromPHP(['date' => new LocalDateTime]);
$document = MongoDB\BSON\toPHP($bson);
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의 애그리게이션 프레임워크 에서도 잘 작동합니다.

← 데이터베이스 명령 실행