鍍金池/ 教程/ PHP/ 序列化
門面
Laravel Homestead
安裝及配置
測試
HTTP 中間件
加密
升級(jí)指南
幫助函數(shù)
應(yīng)用目錄結(jié)構(gòu)
集合
新手入門指南-簡單任務(wù)管理系統(tǒng)
任務(wù)調(diào)度
查詢構(gòu)建器
視圖
驗(yàn)證
Laravel Cashier(訂購&支付&發(fā)票)
本地化
隊(duì)列
調(diào)整器
分頁
文件系統(tǒng)/云存儲(chǔ)
貢獻(xiàn)代碼
哈希
HTTP 控制器
緩存
遷移
HTTP 請求
Laravel Elixir
發(fā)行版本說明
Envoy 任務(wù)運(yùn)行器(SSH任務(wù))
序列化
Session
起步
帶用戶功能的任務(wù)管理系統(tǒng)
起步
用戶授權(quán)
郵件
事件
填充數(shù)據(jù)
HTTP 路由
服務(wù)提供者
Blade 模板引擎
包開發(fā)
用戶認(rèn)證
Artisan 控制臺(tái)
HTTP 響應(yīng)
集合
服務(wù)容器
關(guān)聯(lián)關(guān)系
一次請求的生命周期
契約
Redis
錯(cuò)誤&日志

序列化

1、簡介

當(dāng)構(gòu)建 JSON API 時(shí),經(jīng)常需要轉(zhuǎn)化模型和關(guān)聯(lián)關(guān)系為數(shù)組或 JSON。Eloquent 包含便捷方法實(shí)現(xiàn)這些轉(zhuǎn)換,以及控制哪些屬性被包含到序列化中。

2、基本使用

2.1 轉(zhuǎn)化模型為數(shù)組

要轉(zhuǎn)化模型及其加載的關(guān)聯(lián)關(guān)系為數(shù)組,可以使用 toArray 方法。這個(gè)方法是遞歸的,所以所有屬性及其關(guān)聯(lián)對象屬性(包括關(guān)聯(lián)的關(guān)聯(lián))都會(huì)被轉(zhuǎn)化為數(shù)組:

$user = App\User::with('roles')->first();
return $user->toArray();

還可以轉(zhuǎn)化集合為數(shù)組:

$users = App\User::all();
return $users->toArray();

2.2 轉(zhuǎn)化模型為 JSON

要轉(zhuǎn)化模型為 JSON,可以使用 toJson 方法,和 toArray 一樣,toJson 方法也是遞歸的,所有屬性及其關(guān)聯(lián)屬性都會(huì)被轉(zhuǎn)化為 JSON:

$user = App\User::find(1);
return $user->toJson();

你還可以轉(zhuǎn)化模型或集合為字符串,這將會(huì)自動(dòng)調(diào)用 toJson 方法:

$user = App\User::find(1);
return (string) $user;

由于模型和集合在轉(zhuǎn)化為字符串的時(shí)候會(huì)被轉(zhuǎn)化為 JSON,你可以從應(yīng)用的路由或控制器中直接返回 Eloquent 對象:

Route::get('users', function () {
    return App\User::all();
});

3、在 JSON 中隱藏屬性顯示

有時(shí)候你希望在模型數(shù)組或 JSON 顯示中限制某些屬性,比如密碼,要實(shí)現(xiàn)這個(gè),在定義模型的時(shí)候添加一個(gè)$hidden 屬性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 在數(shù)組中隱藏的屬性
     *
     * @var array
     */
    protected $hidden = ['password'];
}

注意:如果要隱藏關(guān)聯(lián)關(guān)系,使用關(guān)聯(lián)關(guān)系的方法名,而不是動(dòng)態(tài)屬性名。 此外,可以使用 visible 屬性定義屬性顯示的白名單:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 在數(shù)組中顯示的屬性
     *
     * @var array
     */
    protected $visible = ['first_name', 'last_name'];
}

4、追加值到 JSON

有時(shí)候,需要添加數(shù)據(jù)庫中沒有相應(yīng)的字段到數(shù)組中,要實(shí)現(xiàn)這個(gè),首先要定義一個(gè)訪問器:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 為用戶獲取管理員標(biāo)識(shí)
     *
     * @return bool
     */
    public function getIsAdminAttribute()
    {
        return $this->attributes['admin'] == 'yes';
    }
}

定義好訪問器后,添加字段名到模型的 appends 屬性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model{
    /**
     * 追加到模型數(shù)組表單的訪問器
     *
     * @var array
     */
    protected $appends = ['is_admin'];
}

字段被添加到 appends 列表之后,將會(huì)被包含到模型數(shù)組和 JSON 表單中,appends 數(shù)組中的字段還會(huì)遵循模型中的visiblehidden 設(shè)置配置。

上一篇:用戶認(rèn)證下一篇:HTTP 中間件