📜  laravel 隐藏属性 JSON - PHP (1)

📅  最后修改于: 2023-12-03 15:17:16.906000             🧑  作者: Mango

Laravel 隐藏属性 JSON

在 Laravel 中,我们可以使用隐藏属性来确保在查询模型的时候不会暴露一些敏感信息,而 JSON 转换是 Laravel 模型提供的一个很重要的特性,允许我们将模型数据转换成易于使用的 JSON 格式。在本文中,我们将介绍如何在 JSON 转换中隐藏模型中指定的属性。

隐藏属性

首先,让我们来了解下 Laravel 中隐藏属性的概念:

通过 $hidden 属性,我们可以指定我们不希望在 JSON 转换中暴露的属性列表,例如,下面的 User 模型将隐藏密码和 token 两个属性:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be hidden for arrays and JSON output.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'token',
    ];
}

在查询 User 模型并将其转换为 JSON 时,密码和 token 属性将不会在 JSON 中显示。

显式公开属性

有时候,我们可能只想针对一些特定的请求显示某些属性。为了实现这个目标,Laravel 将 $hidden 属性细化为两个更专用的选项: $visible$appends

visible

通过 $visible 属性,我们可以指定我们希望在 JSON 格式中公开的属性列表,任何未在此列表中列出的属性将不会出现在转换后的 JSON 中。例如,下面的 User 模型将只显示 name 属性:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that are visible for arrays and JSON output.
     *
     * @var array
     */
    protected $visible = [
        'name',
    ];
}

在查询 User 模型并将其转换为 JSON 时,只有 name 属性会出现在 JSON 中。

appends

添加到模型中的访问器默认情况下不会包含在转换后的 JSON 中。如果希望包括这些属性,则可以使用 $appends 属性以及访问器名称来指定这些属性。例如,如果我们想在 User 模型中添加一个访问器以计算用户的年龄,我们可以这样编写:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;

class User extends Model
{
    /**
     * Append the age attribute to the model's array and JSON output.
     */
    protected $appends = ['age'];

    /**
     * Get the user's age.
     *
     * @return int
     */
    public function getAgeAttribute()
    {
        return Carbon::parse($this->birthdate)->age;
    }
}

在此示例中,我们添加了一个 $appends 属性,并向其传递了我们想公开的访问器名称。 在我们查询 User 模型并将其转换为 JSON 字符串时,我们会看到第二个 age 属性:

{
    "name": "Taylor Otwell",
    "email": "taylor@laravel.com",
    "age": 35
}
总结

在本文中,我们介绍了如何在 Laravel 模型的 JSON 转换中隐藏属性。 使用 $hidden 属性我们可以指定模型中不想公开的敏感信息,而通过 $visible$appends 属性我们可以控制哪些属性在转换后的 JSON 中可见,以及添加新的属性。 如有需要,请查阅官方文档以了解更多关于 JSON 转换的信息。