如何将Laravel数据库数据转为适配Vue.js的JSON格式并解决命名冲突?
Laravel 蛇形命名属性转驼峰适配Vue.js的解决方案
方案1:使用API资源类(推荐)
Laravel官方提供的API资源类可以自定义返回字段的格式,是粒度最灵活的适配方案。
首先生成资源类:php artisan make:resource UserResource
然后在app/Http/Resources/UserResource.php的toArray方法中定义驼峰字段:public function toArray($request) { return [ 'firstName' => $this->first_name, 'lastName' => $this->last_name, 'createdAt' => $this->created_at, ]; }在控制器中返回时调用资源类即可:
return new UserResource(User::find(1));
如果字段较多,可以自己封装蛇形转驼峰的辅助函数,批量处理模型属性,无需逐个手动定义。方案2:模型添加访问器+追加属性
适合少量模型、少量字段的场景,不需要修改控制器逻辑。
在对应模型中添加访问器,并且将驼峰字段追加到JSON输出中:// 定义访问器 public function getFirstNameAttribute() { return $this->attributes['first_name']; } // 追加驼峰字段到JSON输出 protected $appends = ['firstName']; // 可选:隐藏原蛇形字段 protected $hidden = ['first_name'];方案3:全局响应中间件统一转换
适合全项目统一输出驼峰字段的场景,无需修改单个模型或资源类。
首先创建响应中间件:php artisan make:middleware ConvertResponseKeysToCamelCase
在中间件的handle方法中递归转换所有响应键为驼峰:public function handle(Request $request, Closure $next) { $response = $next($request); $content = json_decode($response->getContent(), true); // 递归转换键为驼峰的逻辑 $camelContent = $this->arrayKeysToCamel($content); $response->setContent(json_encode($camelContent)); return $response; }然后将中间件注册到
app/Http/Kernel.php的API中间件组中即可全局生效。方案4:前端侧接收后转换
如果后端改造难度大,可以在前端封装响应拦截器,统一将接口返回的蛇形键转为驼峰:
以Axios拦截器+lodash为例:import { camelCase, isObject, isArray } from 'lodash' // 递归转换对象键为驼峰 function keysToCamel(obj) { if (isObject(obj) && !isArray(obj)) { const n = {} Object.keys(obj).forEach(k => n[camelCase(k)] = keysToCamel(obj[k])) return n } else if (isArray(obj)) { return obj.map(i => keysToCamel(i)) } return obj } // 添加响应拦截器 axios.interceptors.response.use(response => { response.data = keysToCamel(response.data) return response })
可根据自己的项目规模、改造工作量选择对应的方案,中小型项目推荐用API资源类,大型全栈项目推荐用全局中间件统一处理。
内容的提问来源于stack exchange,提问作者mathnabit
相关产品推荐
相关产品推荐

