Uploaded image for project: 'PHP Driver: Extension'
  1. PHP Driver: Extension
  2. PHPC-640

Implement interfaces for userland BSON type classes

    XMLWordPrintableJSON

Details

    • Task
    • Status: Closed
    • Major - P3
    • Resolution: Fixed
    • 1.1.5
    • 1.3.0-beta1, 1.3.0
    • None
    • None

    Description

      Interfaces for our BSON types will allow users to wrap them in objects, which can then be used interchangeably (provided they typehint against the interface). For example, this could allow for custom wrappers around the UTCDateTime, as demonstrated in this gist:

      <?php
      /* Custom document class that stores a UTCDateTime and timezone 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;
          }
          public function bsonSerialize()
          {
              return [
                  'utc' => $this->utc,
                  'tz' => $this->tz->getName(),
              ];
          }
          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']);
          }
          public function toDateTime()
          {
              return $this->utc->toDateTime()->setTimezone($this->tz);
          }
          public function __toString()
          {
              return (string) $this->utc;
          }
      }
      $bson = MongoDB\BSON\fromPHP(['date' => new LocalDateTime]);
      $document = MongoDB\BSON\toPHP($bson);
      var_dump($document);
      var_dump($document->date->toDateTime());
      

      Attachments

        Issue Links

          Activity

            People

              jmikola@mongodb.com Jeremy Mikola
              jmikola@mongodb.com Jeremy Mikola
              Votes:
              1 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: