yii2处理json表单提交需前后端协同:前端用fetch/axios发请求时设content-type为application/json并json.stringify数据;后端在配置中启用jsonparser,模型定义safe及自定义验证规则,控制器用bodyparams加载并返回json响应。

Yii2 表单提交 JSON 数据时,前端需确保数据格式正确、能被后端识别并触发验证逻辑;后端需配置好模型规则与验证行为。关键在于:请求头设为 application/json、数据序列化得当、模型启用 JSON 验证支持。
前端发送 JSON 数据的正确方式
使用 fetch 或 axios 提交时,必须设置请求头,并将 JavaScript 对象转为字符串:
- 设置
Content-Type: application/json - 用
JSON.stringify()序列化整个表单数据(不是 FormData) - Yii2 默认只从
$_POST或$_GET解析,若发 JSON,需在控制器中手动解析或启用JsonParser
示例(fetch):
fetch('/site/create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
title: '测试文章',
tags: ['yii2', 'json'],
config: { layout: 'main', debug: true }
})
})
后端启用 JSON 请求解析
在应用配置(如 web.php)中注册 JsonParser,让 Yii2 自动解析 JSON 请求体:
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
],
这样 $request->bodyParams 就会自动包含解析后的数组,模型验证可直接使用。
模型中定义 JSON 字段验证规则
对 JSON 字段(如 config),可用内置验证器或自定义逻辑:
- 用
safe允许赋值(因 JSON 字段通常不映射到数据库字段) - 用
filter+Json::decode确保是合法 JSON 字符串(如果存为 TEXT) - 用
each验证数组元素(如tags是字符串数组) - 自定义验证方法检查嵌套结构(如
config.layout必须为字符串)
示例规则:
public function rules()
{
return [
[['title'], 'required'],
[['tags'], 'each', 'rule' => ['string']],
[['config'], 'safe'], // 允许接收
[['config'], 'validateConfig'], // 自定义验证
];
}
public function validateConfig($attribute)
{
$config = $this->$attribute;
if (!is_array($config)) {
$this->addError($attribute, 'config 必须是有效的 JSON 对象');
return;
}
if (!isset($config['layout']) || !is_string($config['layout'])) {
$this->addError($attribute, 'config.layout 必须是字符串');
}
}
控制器中接收与响应处理
控制器动作应主动调用验证,并返回结构化 JSON 响应(尤其 AJAX 场景):
- 用
$model->load(Yii::$app->request->bodyParams, '')加载(空前缀适配 JSON 根级字段) - 验证失败时,返回含
errors的 JSON,前端可直接渲染提示 - 成功时返回
200+ 数据,避免重定向
示例动作片段:
public function actionCreate()
{
$model = new Article();
if ($model->load(Yii::$app->request->bodyParams, '') && $model->validate()) {
$model->save();
return $this->asJson(['success' => true, 'id' => $model->id]);
}
return $this->asJson([
'success' => false,
'errors' => $model->getErrors()
]);
}
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











