Php 如何向Limition中的数据库查询结果添加处理程序

Php 如何向Limition中的数据库查询结果添加处理程序,php,mongodb,lithium,Php,Mongodb,Lithium,我在MongoDB中使用PHP5.6中的Limition框架版本1.1.1。我已经将MongoDB从3.4更新到了3.6,这最终要求PHP ini变量mongo.long_as_object设置为true,以便aggregateCursor()方法在传统的PHP MongoDB驱动程序中正常工作。此版本的Lili尚不支持较新的MongoDB PHP模块。这会导致锂离子电池中处理NumberLong值的方式出现问题,因为它们在PHP中转换为MongoInt64 例如:在文档集上调用$results

我在MongoDB中使用PHP5.6中的Limition框架版本1.1.1。我已经将MongoDB从3.4更新到了3.6,这最终要求PHP ini变量
mongo.long_as_object
设置为
true
,以便
aggregateCursor()
方法在传统的PHP MongoDB驱动程序中正常工作。此版本的Lili尚不支持较新的MongoDB PHP模块。这会导致锂离子电池中处理
NumberLong
值的方式出现问题,因为它们在PHP中转换为
MongoInt64

例如:在
文档集上调用
$results->data()
时,诸如
{viewers:NumberLong(12345)}
之类的BSON结果将解码为
['viewers'=>['value'=>'12345']
。相反,我需要PHP数组是
['viewers'=>12345]

如果我直接在
lithium\data\entity\Document::_init
方法中添加一个适当的处理程序,那么一切都会按照我的预期工作。例如:

$this->_handlers += [
    'MongoId' => function($value) { return (string) $value; },
    'MongoDate' => function($value) { return $value->sec; },
    'MongoInt64' => function($value) { return (int) $value->value; }
];

然而,直接编辑Lili库可能不是最好的方法,尤其是在库发布后升级到新版本时。是否有适当的方法将此处理程序添加到其他位置?例如在Connections.php引导文件中的
Connections::add(…)
方法中?

不幸的是,处理程序不是直接可配置的,但是,它们不太难重写。您可以将
classes
键传递给
Connections:add()
,这允许您在指定处理程序的两个类中扩展一个,即:

Connections::add([
    /* ... */,
    'classes' => [
        'entity' => 'my\data\Document'
        // -- or --
        'schema' => 'my\data\Schema'
    ]
]);
从那里,您可以实现扩展适当核心类的自定义类,并根据需要添加额外的处理程序。此外,我们将非常感谢您接受向Li3 core添加
MongoInt64
支持的PR.:-)