項目屬於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 }