exception 'DOMException' with message 'Invalid Character Error' Php + Mongodb

問題描述:

項目屬於MVC設計模式,技術和框架採用了php5.6 + Yii2.0 + MongoDB。
在我從Controller中調用Model 的 findAll([]) 方法獲取數據打印到屏幕上時,報錯:php

exception 'DOMException' with message 'Invalid Character Error' in /home/user/YiiProject/src/vendor/yiisoft/yii2/web/XmlResponseFormatter.php:94
Stack trace:
#0 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/XmlResponseFormatter.php(94): DOMElement->__construct('$id')
#1 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/XmlResponseFormatter.php(83): yii\web\XmlResponseFormatter->buildXml(Object(DOMElement), Array)
#2 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/XmlResponseFormatter.php(63): yii\web\XmlResponseFormatter->buildXml(Object(DOMElement), Object(MongoId))
#3 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/Response.php(925): yii\web\XmlResponseFormatter->format(Object(yii\web\Response))
#4 /home/user/YiiProject/src/vendor/yiisoft/yii2/web/Response.php(312): yii\web\Response->prepare()
#5 /home/user/YiiProject/src/vendor/yiisoft/yii2/base/Application.php(381): yii\web\Response->send()
#6 /home/user/YiiProject/src/backend/web/index.php(18): yii\base\Application->run()
#7 {main}
--------------------------------------------------------

 

解決思路:

Controller的路由正確,能夠訪問到正確的action;Model 類collectionName, attrabutes, fields包羅萬象,而且Mongo數據庫中有格式正確的2條數據,打log 顯示 findAll([]) 的長度爲2,findAll([]) 的結果集是兩條空數據 [{}, {}] 。好納悶啊!!!web

 

想到昨天向大神請教了一個關於fields()的問題,數據是空的,會不會是被fields()給過濾掉了?排查field()發現並無刪除數據而是直接返回數據庫中的數據。由於Model是繼承了PlainModel.php, 而後又找了一下Model的父類PlainModel.php, 發現PlainModel.php在處理'_id'(主鍵,mongoId類型)時,並非直接將數據庫裏的'_id'返回,而是轉成了string型返回。恍然大悟!我本身寫的Model裏的fields 返回的也是MongoId類型的,致使DOM在解析XML時認爲是非法字符,引起異常。數據庫

MongoDB裏的數據格式以下:設計模式

{
    "_id" : ObjectId("577325cfb58c1c90788b456b"),
    "memberId" : ObjectId("5761f44fb58c1c4a438b4567"),
    "cardId" : ObjectId("576bc973b58c1cec3a8b4567"),
    "createdAt" : ISODate("2016-06-29T01:35:11.793Z")
}

 

解決方法:

在 fields() 方法裏將 MongoId 類型轉爲 string 類型yii2

 1     public function fields()
 2     {
 3         return array_merge(
 4             parent::fields(),
 5             [
 6                 'memberId' => function($model) {
 7                     return $model->memberId . '';
 8                 },
 9                 'cardId' => function($model) {
10                     return $model->cardId . '';
11                 }
12             ]
13         );
14     }
相關文章
相關標籤/搜索