mongodb / transistor
简单的 MongoDB 对象与文档映射器
0.1.0
2015-04-22 22:03 UTC
Requires
- ext-mongodb: >=0.5
This package is not auto-updated.
Last update: 2024-09-10 01:38:11 UTC
README
新的 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.php 和 Address.php -- 虽然就是这样。没有注解或其他内容。 implements MongoDB\BSON\Persistable
和 use 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 行简单的代码。
我确信会有龙,所以请谨慎使用。