trismegiste/mikromongo

此包已废弃,不再维护。未建议替代包。

将对象冻结到零开尔文

dev-master 2013-11-19 14:18 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:28:08 UTC


README

另一个对象序列化器,除了这个可以处理递归

什么是

它是一个对象序列化/反序列化器。有很多,但这个可以

  • 处理内部PHP对象
  • 处理递归(我的意思是对象的指针,嵌套在另一个地方)
  • 提取父类的私有属性
  • 创建一个对象,无论构造函数是什么
  • 对对象的设计绝对没有约束

示例

对象到数组

$transform = new \Trismegiste\ZeroKelvin\Transformer(new \Trismegiste\ZeroKelvin\UuidFactory());
$product = new LightSaber('red');
$product->setOwner(new Owner('vader'));
$dump = $transform->toArray($product);
print_r($dump);
// ouputs 
[
    [
        '@classname' => 'tests\\functional\\LightSaber',
        'owner' => [ '@ref' => 'dc969571-bf05-420f-a466-1d971dbd9c7b'],
        '@uuid' => '5b0294f7-65dd-4b17-bcbf-cd1923983649',
        'color' => 'red'
    ],
    [
        '@classname' => 'tests\\functional\\Owner',
        '@uuid' => 'dc969571-bf05-420f-a466-1d971dbd9c7b',
        'name' => 'vader'
    ]
]

数组到对象

$transform = new \Trismegiste\ZeroKelvin\Transformer(new \Trismegiste\ZeroKelvin\UuidFactory());
$dump = [
    [
        '@classname' => 'tests\\functional\\LightSaber',
        'owner' => [ '@ref' => 'dc969571-bf05-420f-a466-1d971dbd9c7b'],
        '@uuid' => '5b0294f7-65dd-4b17-bcbf-cd1923983649',
        'color' => 'red'
    ],
    [
        '@classname' => 'tests\\functional\\Owner',
        '@uuid' => 'dc969571-bf05-420f-a466-1d971dbd9c7b',
        'name' => 'vader'
    ]
];
$product = $transform->fromArray($dump);
print_r($product);
// ouputs
tests\functional\LightSaber Object
(
    [color:protected] => red
    [owner:protected] => tests\functional\Owner Object
        (
            [name:protected] => vader
        )
)

查看完整测试

如何

基于PHP序列化。serialize()和unserialize()是唯一能够处理递归并且将父类中声明为private的隐藏属性的方法。var_dump无法处理递归,var_export无法导出SplObjectStorage,而使用反射递归地检查对象的父类是非常痛苦的。

因此我编写了这个库。后来,我添加了一个存储库服务,可以将这些导出存储到MongoDb中。

为什么

这是一次愚蠢的尝试,想为MongoDb创建一个ODM,但我认为这样做是不明智的

  • 对象中噪声太多
  • 这太慢了
  • 如果对象在数据库中更新,则没有真正的错误处理
  • 查询应该是可怕的
  • 无法更新

无论如何,这个库对于测试和调试、快速原型设计、简单的CLI应用程序或某些特定用例(如异步事件队列)可能很有用。我必须提到,即使具有高度深度的复杂树结构,从MongoDb加载实体也只需要两次遍历。

扩展此库

您可以通过实现UniqueGenerator接口轻松更改字段名称和主键的生成。

您还可以通过实现RepositoryInterface添加自己的存储库(用于XML文件、CouchDB...)

此库不能做什么?

此库无法处理标量和数组上的引用。虽然应该可以,但导出的数组会携带太多噪声(索引、外键...),以至于没有太大用处。

此库也无法正确存储自定义序列化(实现Serializable php接口)。无论如何,那些对象是“原样”存储的,因此您可以无问题地恢复它们。