trismegiste / strangelove-bundle
我是如何学会不再担心ORM并爱上MongoDb BSON的
Requires
- php: >7.4
- ext-mongodb: >1.7
- psr/log: ^1.1
- symfony/config: ^5.4|6.*
- symfony/dependency-injection: ^5.4|6.*
- symfony/form: ^5.4|6.*
- symfony/http-kernel: ^5.4|6.*
Requires (Dev)
- phpunit/phpunit: ^9.5
- symfony/console: ^5.4|6.*
- symfony/web-profiler-bundle: ^5.4|6.*
- symfony/yaml: ^5.4|6.*
README
这是一个symfony扩展包,用于停止追逐神话中的对象-数据库,或者它的虚假近似,即Doctrine。
MongoDb
一个几乎零配置的对象数据映射器(ODM)用于MongoDB。它是一个微数据库层,具有自动映射,依赖于BSON类型。它旨在为MongoDB的**高级用户**提供,这些用户了解并在无模式数据库上理解模型的增长。
当我提到“微”,我的意思是NCLOC总和大约为一百。因此,它非常快。
安装
包含扩展包
$ composer require trismegiste/strangelove-bundle
由于配置文件 strangelove.yaml
尚不存在,您可能在清除缓存时遇到错误。
配置扩展包
只需运行向导并回答问题即可
$ vendor/bin/strangelove-wizard.php
在集合上创建存储库
创建 Trismegiste\Strangelove\MongoDb\DefaultRepository
的子类,并扩展其业务功能。
注册服务
要将名为 MyMovies 的存储库类注册到 'movies' 集合中,只需在 services.yaml
配置文件中添加以下内容:
services: # ... some services App\Repository\MyMovies: $collectionName: movies
如何
由于MongoDB中对一个文档具有原子性,因此必须存储复杂的树形对象。如果您避免了循环引用,此ODM会将您的对象以综合结构存储到MongoDB集合中。
每个对象都必须实现一个接口并使用一个特性
class MyEntity implements \MongoDB\BSON\Persistable { use \Trismegiste\Strangelove\MongoDb\PersistableImpl; }
“顶级文档”或“根文档”,即拥有主键(即MongoDB中的字段“_id”),必须实现Root接口并使用RootImpl特性。
class MyDocument implements \Trismegiste\Strangelove\MongoDb\Root { use \Trismegiste\Strangelove\MongoDb\RootImpl; }
存储库
有一个针对集合的默认存储库: DefaultRepository
。
加载
$record = $myRepository->load($primaryKey);
持久化
$myRepository->save($oneObjectInheritingFromRoot); $rimaryKey = $oneObjectInheritingFromRoot->getPk();
搜索
$iter = $myRepository->search(['price' => ['$ne' => null]]); foreach($iter as $record) { var_dump($record); }
此类实现了Repository接口。请阅读有关它的phpdoc。
类型
- 在您的模型中不要使用DateTime,请使用BsonDateTime,您有一个用于将DateTime转换为BsonDateTime的AbstractType,以替换Symfony DateType。
- 在您的模型中不要使用SplObjectStorage,请使用BsonObjectStorage。
- 在您的模型中不要使用SplFixedArray,请使用BsonFixedArray。
请阅读有关MongoDB中BSON序列化的文档以了解更多信息: MongoDB\BSON\Persistable接口
性能
包含约一千个嵌入对象的复杂对象需要2.5秒在廉价的笔记本电脑上存储。加载和填充需要约1.8秒。
内部结构
此ODM完全依赖于MongoDB的BSON API。您的对象可以是您想要的任何东西:没有注解,没有对构造函数或扩展某些强制具体类的约束。序列化和反序列化是在用C编写的驱动程序中进行的,而不是PHP,这就是它为什么这么快的原因。
测试
此库使用PHPUnit进行了全面测试。只需运行
$ vendor/bin/phpunit
在 DefaultRepositoryTest.php 中可以找到完整功能测试。
迭代器
目前,有一个用于Iterator对象的装饰器: ClosureDecorator
。它用于装饰MongoDB存储库(如上所述)创建的光标上的迭代器。
代码覆盖率
代码覆盖率配置包含在 phpunit.xml
中。只需运行
$ phpdbg -qrr vendor/bin/phpunit
HTML结果存储在 ./docs/coverage。