Tóm Tắt
Ở 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 visible
và hidden
cấu hình trên model.