如何在Lithium中为数据库查询结果添加处理程序

时间:2018-03-13 16:55:05

标签: php mongodb lithium

我在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(...)方法?

1 个答案:

答案 0 :(得分:1)

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

Connections::add([
    /* ... */,
    'classes' => [
        'entity' => 'my\data\Document'
        // -- or --
        'schema' => 'my\data\Schema'
    ]
]);

从那里,您可以实现扩展相应核心类的自定义类,并根据需要添加额外的处理程序。此外,我们将非常感激地接受为Li3核心添加MongoInt64支持的PR。 : - )