我在PHP 5.6中使用带有MongoDB的Lithium框架版本1.1.1。我已经将MongoDB从3.4更新到3.6,这最终要求将PHP ini变量mongo.long_as_object
设置为true
,以使aggregateCursor()
方法在PHP的遗留MongoDB驱动程序中正常工作。此版本的Lithium尚不支持较新的MongoDB PHP模块。这会导致在Lithium中处理NumberLong
值的方式出现问题,因为它们在PHP中转换为MongoInt64
。
例如:在$results->data()
上呼叫DocumentSet
时,{ 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; }
];
但是,直接编辑Lithium库可能不是最好的方法,尤其是在将库升级到更新版本时。有没有正确的方法在其他地方添加此处理程序?比如在connections.php bootstrap文件中的Connections::add(...)
方法?
答案 0 :(得分:1)
不幸的是,处理程序不是可直接配置的,但是,它们并不太难以覆盖。您可以将classes
密钥传递给Connections:add()
,这允许您扩展指定处理程序的两个类中的一个,即:
Connections::add([
/* ... */,
'classes' => [
'entity' => 'my\data\Document'
// -- or --
'schema' => 'my\data\Schema'
]
]);
从那里,您可以实现扩展相应核心类的自定义类,并根据需要添加额外的处理程序。此外,我们将非常感激地接受为Li3核心添加MongoInt64
支持的PR。 : - )