mongodb/transistor

简单的 MongoDB 对象与文档映射器

0.1.0 2015-04-22 22:03 UTC

This package is not auto-updated.

Last update: 2024-09-10 01:38:11 UTC


README

Build Status

新的 MongoDB PHP 驱动程序 提供了一个 MongoDB\BSON\Persistable 接口,该接口声明了两个方法,一个用于存储对象时调用,另一个用于重建对象时调用。

transistor 特性添加了这两个方法的示例实现,并引入了轻量级变更跟踪。这也允许对象无缝更新。

示例类

<?php
class Person implements MongoDB\BSON\Persistable {
    use MongoDB\Transistor;
    protected $_id;
    protected $username;
    protected $email;
    protected $name;
    protected $addresses = array();
    protected $_lastModified;
    protected $_created;
}

class Address implements MongoDB\BSON\Persistable {
    use MongoDB\Transistor;
    protected $_id;
    protected $streetAddress;
    protected $city;
    protected $postalCode;
}
?>

有关这些示例类的完整实现,请参阅 Person.phpAddress.php -- 虽然就是这样。没有注解或其他内容。 implements MongoDB\BSON\Persistableuse MongoDB\Transistor 就是魔法。

简单用法

<?php
/* Construct a new person */
$person = new Person("bjori", "bjori@php.net", "Hannes Magnusson");

/* Insert it */
insert($person);

/* Find a person based on its username */
$person = findOne(array("username" => "bjori"));

/* Get an instance of the Person object again */
var_dump($person);
?>

上面的示例将输出类似的内容

object(Person)#8 (7) {
  ["_id"]=>
  object(MongoDB\BSON\ObjectID)#4 (1) {
    ["oid"]=>
    string(24) "553586e2bd21b971774b7da1"
  }
  ["username"]=>
  string(5) "bjori"
  ["email"]=>
  string(13) "bjori@php.net"
  ["name"]=>
  string(16) "Hannes Magnusson"
  ["addresses"]=>
  array(0) {
  }
  ["_lastModified"]=>
  NULL
  ["_created"]=>
  object(MongoDB\BSON\UTCDatetime)#7 (0) {
  }
}

更新对象

<?php
/* Continuing from previous example, $person is instanceof Person */
$person->setName("Dr. " . $person->getName());

/* Update the document */
update(array("username" => "bjori"), $person);

/* Retrieve it again */
$person = findOne(array("username" => "bjori"));

/* Get an instance of the Person object again */
var_dump($person);
?>

上面的示例将输出类似的内容

object(Person)#9 (7) {
  ["_id"]=>
  object(MongoDB\BSON\ObjectID)#4 (1) {
    ["oid"]=>
    string(24) "553586e2bd21b971774b7da1"
  }
  ["username"]=>
  string(5) "bjori"
  ["email"]=>
  string(13) "bjori@php.net"
  ["name"]=>
  string(16) "Dr. Hannes Magnusson"
  ["addresses"]=>
  array(0) {
  }
  ["_lastModified"]=>
  NULL
  ["_created"]=>
  object(MongoDB\BSON\UTCDatetime)#7 (0) {
  }
}

添加嵌入对象

<?php
/* Continuing from previous example, $person is instanceof Person */

/* Construct a new Address object */
$address = new Address("Manabraut 4", "Kopavogur", 200);
$person->addAddress($address);

/* Update the object with a new Address embedded object */
update(array("username" => "bjori"), $person);

$person = findOne(array("username" => "bjori"));
var_dump($person);
?>

上面的示例将输出类似的内容

object(Person)#10 (7) {
  ["_id"]=>
  object(MongoDB\BSON\ObjectID)#4 (1) {
    ["oid"]=>
    string(24) "553586e2bd21b971774b7da1"
  }
  ["username"]=>
  string(5) "bjori"
  ["email"]=>
  string(13) "bjori@php.net"
  ["name"]=>
  string(16) "Dr. Hannes Magnusson"
  ["addresses"]=>
  array(1) {
    [0]=>
    object(Address)#%d (%d) {
      ["_id"]=>
      object(MongoDB\BSON\ObjectID)#%d (%d) {
        ["oid"]=>
        string(24) "%s"
      }
      ["streetAddress"]=>
      string(11) "Manabraut 4"
      ["city"]=>
      string(9) "Kopavogur"
      ["postalCode"]=>
      int(200)
      ["_created"]=>
      object(MongoDB\BSON\UTCDatetime)#%d (0) {
      }
    }
  }
  ["_lastModified"]=>
  NULL
  ["_created"]=>
  object(MongoDB\BSON\UTCDatetime)#7 (0) {
  }
}

辅助工具

上述示例中的 insert()update()findOne() 辅助工具除了包装在 MongoDB\Driver\Manager 上的相应方法并设置 TypeMap 之外,没有做其他任何事情,只存在于减少示例中所需的错误检查。

性能

由于实际的(反)序列化由扩展本身完成,PHP 没有要做的事情 -- 特性本身不到 200 行简单的代码。

我确信会有龙,所以请谨慎使用。