如何将处理程序添加到 Lithium 中的数据库查询结果
How can I add handler to database query results in 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 模块。这会导致 NumberLong
值在 Lithium 中的处理方式出现问题,因为它们在 PHP.
中被转换为 MongoInt64
例如:当在 DocumentSet
上调用 $results->data()
时,BSON 结果如 { viewers: NumberLong(12345) }
将解码为 [ '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.phpbootstrap文件中的Connections::add(...)
方法中?
不幸的是,处理程序不能直接配置,但是,它们并不难覆盖。您可以将 classes
键传递给 Connections:add()
,这允许您扩展指定处理程序的两个 classes 之一,即:
Connections::add([
/* ... */,
'classes' => [
'entity' => 'my\data\Document'
// -- or --
'schema' => 'my\data\Schema'
]
]);
从那里,您可以实现您的自定义 class 以扩展适当的核心 class,并根据需要添加额外的处理程序。此外,将不胜感激地接受为 Li3 核心添加 MongoInt64
支持的 PR。 :-)
我在 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 模块。这会导致 NumberLong
值在 Lithium 中的处理方式出现问题,因为它们在 PHP.
MongoInt64
例如:当在 DocumentSet
上调用 $results->data()
时,BSON 结果如 { viewers: NumberLong(12345) }
将解码为 [ '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.phpbootstrap文件中的Connections::add(...)
方法中?
不幸的是,处理程序不能直接配置,但是,它们并不难覆盖。您可以将 classes
键传递给 Connections:add()
,这允许您扩展指定处理程序的两个 classes 之一,即:
Connections::add([
/* ... */,
'classes' => [
'entity' => 'my\data\Document'
// -- or --
'schema' => 'my\data\Schema'
]
]);
从那里,您可以实现您的自定义 class 以扩展适当的核心 class,并根据需要添加额外的处理程序。此外,将不胜感激地接受为 Li3 核心添加 MongoInt64
支持的 PR。 :-)