我在项目中使用日历,我希望将Event
模型中的数据传递到以JSON
格式查看文件。我试过跟随,但它不起作用,无法正确显示数据
$events = Event::find()->where(1)->all();
$data = [];
foreach ($events AS $model){
//Testing
$data['title'] = $time->title;
$data['date'] = $model->start_date;
$data['description'] = $time->description;
}
\Yii::$app->response->format = 'json';
echo \yii\helpers\Json::encode($data);
但它只返回$data
数组中的一个模型,最终数据应采用以下格式:
[
{"date": "2013-03-19 17:30:00", "type": "meeting", "title": "Test Last Year" },
{ "date": "2013-03-23 17:30:00", "type": "meeting", "title": "Test Next Year" }
]
答案 0 :(得分:4)
当你这样写:
\Yii::$app->response->format = 'json';
在渲染数据之前,不需要进行任何额外的操作来将数组转换为JSON。
您只需要return
(而不是echo
)数组:
return $data;
数组将自动转换为JSON。
最好使用yii\web\Response::FORMAT_JSON
常量而不是硬编码字符串。
另一种处理方式是使用ContentNegotiator过滤器,它有更多选项,允许设置多个动作等。控制器示例:
use yii\web\Response;
...
/**
* @inheritdoc
*/
public function behaviors()
{
return [
[
'class' => 'yii\filters\ContentNegotiator',
'only' => ['view', 'index'], // in a controller
// if in a module, use the following IDs for user actions
// 'only' => ['user/view', 'user/index']
'formats' => [
'application/json' => Response::FORMAT_JSON,
],
],
];
}
它也可以配置为整个应用程序。
更新:如果您在控制器之外使用它,请不要设置响应格式。使用Json
助手和encode()
方法就足够了。但是你的代码中也有一个错误,你应该像这样创建一个新的数组元素:
$data = [];
foreach ($events as $model) {
$data[] = [
'title' => $time->title,
'date' => $model->start_date,
'description' => $time->description,
];
}
答案 1 :(得分:2)
您可以尝试这样:
$events = Event::find()->select('title,date,description')->where(1)->all()
yii::$app->response->format = yii\web\Response::FORMAT_JSON; // Change response format on the fly
return $events; // return events it will automatically be converted in JSON because of the response format.
顺便说一下,你应该在$data
循环中覆盖foreach
变量:
$data = [];
foreach ($events AS $model){
//Make a multidimensional array
$data[] = ['time' => $time->title,'date' => $model->start_date,'description' => $time->description];
}
echo \yii\helpers\Json::encode($data);