梦入琼楼寒有月,行过石树冻无烟

Laravel Eloquent 序列化

在构建 JSON API 的时候,我们需要通过使用 Eloquent 所提供的一些简便方法来进行实现。需要注意的是我们可以通过设置返回的 header来进行返回 具有人类可读 的输出。

在官方文档中我们可以看到,我们可以序列化为数组或者字符串形式,但实际上,并不是这样 直接返回 return $data 即可返回出 json。因此官方文档所提供的 toJson \ toArray都输出的是Json格式内容。

且返回的数据中文均不是人类具有可读性的 \x000 格式,即 Unicode16 格式,无论你在返回中添加 JSON_UNESCAPED_UNICODE 都无济于事。

序列化

1
2
3
4
5
6
7
public function index()
{
$issue = IssuesModel::all();
return response()->json($issue,200,['Content-Type'=>'application/json;charset=UTF-8',
'Charset'=>'utf-8'],
JSON_UNESCAPED_UNICODE);
}

因此他返回的是一个 具有人类可读 的 JSON 类型文本,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[
{
"id": 1,
"titles": "……",
"datetimes": "2021-05-17 03:27:00",
"names": "……",
"……": "……",
"……": "……",
"……": "……",
"……": "……",
"……": "2021-05-17 03:27:42",
"……": "2021-05-17 03:27:42",
"……": "……",
"……": null,
"……": null,
"……": "……",
"……": null,
"……": null,
"……": "……",
"……": "……",
"……": "……",
"……": "……",
"……": null
}
]

黑名单与白名单

黑名单

在官方的文档中,黑名单被称之为更具直观的 “ 隐藏输出 ”,即从字面意思上理解不输出当前属性的值,我们可以在需要输出的 Eloquent ORM 模型 中保护属性中添加一个 $hidden 属性即可。

1
2
3
4
5
6
7
8
9
10
11
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class TestModel extends Model
{
……
protected $hidden = ['titles','datetimes','names'];
}

因此相应的 json 对象也不会进行输出,如原先的 ['titles','datetimes','names'] 都不会在下述的返回响应中不会输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
{
"id": 1,
"……": "……",
"……": "……",
"……": "……",
"……": "……",
"……": "2021-05-17 03:27:42",
"……": "2021-05-17 03:27:42",
"……": "……",
"……": null,
"……": null,
"……": "……",
"……": null,
"……": null,
"……": "……",
"……": "……",
"……": "……",
"……": "……",
"……": null
}
]

白名单

白名单在官方文档中也被称之为 “白名单”,因此在本文中我们可以使用一种更为直观的方法来以 “ 需要输出的对象 ” 来更加直观的理解。白名单的输出也非常简单,和上述步骤一样在 Eloquent ORM 模型中添加一个$visible

1
protected $visible = ['titles','datetimes','names'];

因此输出的也是只有相应的 json 对象:

1
2
3
4
5
6
7
8
[
{
"id": 1,
"titles": "……",
"datetimes": "2021-05-17 03:27:00",
"names": "……",
}
]
⬅️ Go back