12/08/2018, 14:28

Eloquent: Serialization

Ở bài trước, mình đã giới thiệu với các bạn về Eloquent:Mutators. Hôm nay mình xin giới thiệu với các bạn về Serialization. Giới thiệu Khi xây dựng các JSON API, bạn thường sẽ cần phải chuyển đổi các model và relationship của bạn thành array hoặc JSON.Eloquent có các phương thức tiện lợi cho ...

Ở bài trước, mình đã giới thiệu với các bạn về Eloquent:Mutators. Hôm nay mình xin giới thiệu với các bạn về Serialization.


Giới thiệu

Khi xây dựng các JSON API, bạn thường sẽ cần phải chuyển đổi các model và relationship của bạn thành array hoặc JSON.Eloquent có các phương thức tiện lợi cho việc thực hiện những chuyển đổi này, cũng như kiểm soát được các thuộc tính có trong serializations của bạn.


Serializing Models & Collections


Serializing To Arrays

Để chuyển đổi 1 model và các relationship đã được load thành 1 array, bạn có thể sử dụng phương thức toArray . Phương thức này là đệ quy, vì vậy tất cả các thuộc tính và tất cả các relationship (bao gồm các quan hệ của quan hệ) sẽ được chuyển đổi thành array:

$user = AppUser::with('roles')->first();

return $user->toArray();

Bạn cũng có thể chuyển đổi các collections của model thành array:

$users = AppUser::all();

return $users->toArray();

Serializing To JSON

Để chuyển đổi 1 model thành JSON, bạn có thể sử dụng phương thức toJson. Giống như toArray, toJson là đệ quy, vì vậy tất cả các thuộc tính và các relationship sẽ được chuyển thành JSON.

$user = AppUser::find(1);

return $user->toJson();

Ngoài ra, bạn có thể cast 1 model hoặc collection thành 1 string mà nó sẽ tự động gọi phương thức toJson trên model hoặc collection.

$user = AppUser::find(1);

return (string) $user;

Từ các model và các collection đã được chuyển đổi thành JSON khi cast vào 1 string, bạn có thể trả lại đối tượng của Eloquent trực tiếp từ routes hoặc controller.

Route::get('users', function () {
    return AppUser::all();
});

Hiding Attributes From JSON

Đôi khi, bạn có thể muốn giới hạn các thuộc tính, chẳng hạn như password, được chứa trong array của model của bạn hoặc JSON đại diện. Để làm như vậy, ta thêm 1 $hidden vào model của bạn.

<?php

namespace App;

use IlluminateDatabaseEloquentModel;

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

Ngoài ra, bạn có thể sử dụng các visible property để xác định 1 while-list của thuộc tính đó nên được chứa trong mảng của model và JSON đại diện. Tất cả các thuộc tính khác sẽ được ẩn khi model được chuyển sang array hoặc JSON.

<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
    /**
     * The attributes that should be visible in arrays.
     *
     * @var array
     */
    protected $visible = ['first_name', 'last_name'];
}

Temporarily Modifying Attribute Visibility

Nếu bạn muốn thực hiện một số kiểu thuộc tính hidden hiển thị trên 1 model instance. bạn có thể sử dụng phương thức makeVisible. Phương thức makeVisible trả về model instance cho phương pháp chaining thuận tiện.

return $user->makeVisible('attribute')->toArray();

Tương tự như vậy, nếu bạn muốn thực hiện visible ẩn trên model instance, bạn có thể sử dụng phương thức makeHidden:

return $user->makeHidden('attribute')->toArray();

Appending Values To JSON

Thỉnh thoảng, khi cast model thành array hoặc JSON, bạn có thể thêm các thuộc tính mà ko có 1 cột tương ứng trong cơ sở dữ liệu. Để làm như vậy, đầu tiên định nghĩa 1 accessor cho các giá trị:

<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
    /**
     * Get the administrator flag for the user.
     *
     * @return bool
     */
    public function getIsAdminAttribute()
    {
        return $this->attributes['admin'] == 'yes';
    }
}

Sau khi tạo các accessor, thêm tên thuộc tính cho property gắn thêm vào model. Lưu ý rằng thuộc tính tên thường có dạng "snake case", mặc dù các accessor được định nghĩa sử dụng "camel case":

<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
    /**
     * The accessors to append to the model's array form.
     *
     * @var array
     */
    protected $appends = ['is_admin'];
}

Một khi các thuộc tính đã được thêm vào danh sách appends, nó sẽ được đưa vào cả array và JSON đại diện của model. Các thuộc tính trong mảng appends cũng sẽ giữ nguyên các thiết lập nhìn visible và hidden cấu hình trên model.

0