Đây là một tính năng tuyệt vời để custom các thuộc tính trước khi Response về phía Client. Trong Laravel khi ta trả về phía Client một data, chúng ta cần custom nó trước khi trả về, thông thường ta viết các điều kiện trong Controller hoặc Resource, Collection,...bắt cứ đâu
Nhưng nay mình tìm hiểu được cách ta custom nó trong Model luôn, rất thuận tiện cho việc fix bugs và quản lý việc custom của các trường field trong Model
use Illuminate\Database\Eloquent\Model;
use DateTimeInterface;
use Illuminate\Database\Eloquent\Casts\Attribute;
class Category extends Model
{
protected $fillable = ['name', 'keyword', 'des', 'parent_id','slug','image','publish'];
protected $casts = [
'created_at' => 'datetime:Y-m-d H:i:s',
'updated_at' => 'datetime:Y-m-d H:i:s',
];
protected function serializeDate(DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
protected function updatedAtFormatted(): Attribute
{
return Attribute::make(
get: fn () => $this->updated_at->format('l, F j, Y')
);
}
public function toArray()
{
return array_merge(parent::toArray(), [
'updated_at_formatted' => $this->updatedAtFormatted,
]);
}
}
Trong đoạn code trên mình có custom date mặt định là theo kiểu định dạng "Y-m-d H:i:s" , Nhưng sau đó mình lại custom thêm thuộc tính updated_at về dạng $this->updated_at->format('l, F j, Y')
Mình tạo một function updatedAtFormatted() để xử lý việc format cho thuộc tính updated_at
Hàm toArray() trong Model nó sẽ tạo thêm một thuộc tính "updated_at_formatted" trong mảng array bạn trả về phía Client
VD:
"dataCategory": [
{
"id": 1,
"name": "Html/Css",
"keyword": "Html,Css",
"des": "Html,Css",
"parent_id": 0,
"slug": "html-css",
"image": "https://cdn-icons-png.flaticon.com/512/174/174854.png",
"publish": 1,
"created_at": "2019-09-03 12:32:44",
"updated_at": "2019-09-03 12:32:44",
"updated_at_formatted": "Tuesday, September 3, 2019"
},
{
"id": 2,
"name": "Javascript/jquery",
"keyword": "Javascript,jquery",
"des": "Javascript,jquery",
"parent_id": 0,
"slug": "javascript-jquery",
"image": "https://w1.pngwing.com/pngs/136/126/png-transparent-javascript-logo-angularjs-nodejs-computer-programming-web-development-computer-software-jquery-yellow.png",
"publish": 1,
"created_at": "2019-09-03 12:34:02",
"updated_at": "2019-09-03 12:34:02",
"updated_at_formatted": "Tuesday, September 3, 2019"
}
]
# Chú ý: kiểm soát cách định dạng ngày tháng khi các mô hình được tuần tự hóa thành Array hoặc JSON. Ở đây mình đang sử dùng API Resource để trả về một array nên nó sẽ có tác dụng việc format date
Còn nếu mình chỉ hiện thị trong blade bình thường như $category->created_at thì nó không có format nha
Có nghĩa là trả dữ liệu về phía Client(array & json) nó sẽ có định dạng như bên trên
public function index()
{
$dataCategory = CategoryResource::collection(Category::all());
$category = Category::where('parent_id',0)->with('childrenCategories')->get()->toArray();
//return Response()->json($category);
// or
return Response()->json(array("dataCategory"=>$dataCategory,"multiple"=>$category));
}