Tìm kiếm bài viết

Eloquent: Serialization trong laravel là gì 

21.09.2020

0/5 (0 Reviews)

Hôm nay mình xin giới thiệu với các bạn về Serialization để áp dụng vào thiết kế website làm sao cho hiệu quả.

    Ở bài trước, mình đã giới thiệu với các bạn về . Hôm nay mình xin giới thiệu với các bạn về Serialization để áp dụng vào thiết kế website làm sao cho hiệu quả.

    Giới thiệu về Serialization trong laravel

    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 và Collections trong laravel

    Để 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:

    Serializing To Arrays

    $user = App\User::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 = App\User::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 = App\User::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 = App\User::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 App\User::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 Illuminate\Database\Eloquent\Model;
    
    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 Illuminate\Database\Eloquent\Model;
    
    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 Illuminate\Database\Eloquent\Model;
    
    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 Illuminate\Database\Eloquent\Model;
    
    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 visiblehidden cấu hình trên model.

    CÓ THỂ BẠN QUAN TÂM

    Bài Viết Cùng Chuyên Mục

    XEM THÊM
    thumbnail

    Kubernetes bài 6 - Vận hành k8s Day-Two Operations và Quản trị bằng GitOps

    22.05.2026

    Khi cụm Kubernetes của bạn đã được bảo mật cấu hình, tối ưu tài nguyên và thiết lập tự phục hồi, câu hỏi đặt ra là làm sao để duy trì sự ổn định đó trong nhiều năm tiếp theo mà không bị phụ thuộc

    thumbnail

    Kubernetes bài 5 - bảo mật Cloud Native và chuẩn DevSecOps cho K8s

    22.05.2026

    Việc siết chặt an ninh (Hardening) không phải là cấu hình một vài thông số rồi bỏ đó, mà là một tư duy phòng thủ chiều sâu.

    thumbnail

    Kubernetes bài 4 - Tối ưu Resource Auto-Healing và Scale Zero-Downtime

    22.05.2026

    Bài viết này sẽ đi sâu vào các cơ chế ở tầng Kernel giúp hệ thống tự phục hồi, chống lại các đợt tấn công cạn kiệt tài nguyên và cập nhật phiên bản mới mà người dùng không hề hay biết.

    thumbnail

    Kubernetes bài 3 - Bảo mật cấu hình k8s và config Security trên Production

    22.05.2026

    Kubernetes giải quyết bài toán này bằng hai đối tượng chuyên biệt nhưng nếu không hiểu rõ bản chất bảo mật ở tầng dưới, bạn đang tự tay dâng toàn bộ chìa khóa hệ thống cho hacker.

    thumbnail

    Kubernetes bài 2 - Mạng lưới k8s và luồng Traffic ở Packet Level

    22.05.2026

    Pod không chỉ là một container: Rất nhiều người nhầm lẫn Pod 1-1 với Container. Thực chất, Pod là đơn vị triển khai nhỏ nhất, có thể chứa một hoặc nhiều container

    Mục lục bài viết