Laravel 10 sử dụng php 8.2 đã hỗ trợ sử dụng enum giờ chúng ta hãy sử dụng enum cho các dự án thôi nào.
Tạo file app/Enums/PostStatus.php
định nghĩa các trạng thái của bảng posts
theo enum.
<?php
namespace App\Enums\Posts;
enum PostStatus: string
{
case DRAFT = 'draft';
case PUBLISHED = 'published';
case ARCHIVED = 'archived';
public function label(): string
{
return match($this)
{
PostStatus::DRAFT => 'Draft',
PostStatus::PUBLISHED => 'Published',
PostStatus::ARCHIVED => 'Archived',
};
}
public static function valueArray(): array
{
return array_column(self::cases(), 'value');
}
}
Bảng post có bao nhiêu trạng thái chúng ta sẽ khai báo hết trong enum, ngoài ra viết thêm hàm valueArray()
để lấy các trạng thái lưu trong db, hàm label()
Trả về lable theo trạng thái.
Sử dụng enum trong form request. Thêm enum vào storePostRequest
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use App\Enums\Posts\PostStatus;
class StorePostRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
*/
public function rules(): array
{
return [
'title' => 'required|string',
'body' => 'required|string',
'status' => 'required|string|in:'.implode(',', PostStatus::valueArray()),
];
}
}
Giờ chúng lấy label trạng thái của bài viết sử attribue và cast trong laravel
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Enums\Posts\PostStatus;
use Illuminate\Database\Eloquent\Casts\Attribute;
class Post extends Model
{
use HasFactory;
protected $appends = ['status_label'];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'title',
'body',
'status',
];
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'status' => PostStatus::class,
];
public function statusLabel(): Attribute
{
return Attribute::make(
get: fn () => $this->status->label()
);
}
}
Thêm cast
status có kiểu dữ liệu là PostStatus
enum. Cast giúp convert kiểu dữ liêu của status thành enum.
Thêm statusLabel
attribute để lấy label của trạng thái bài viết.
Thêm status_label
vào thuộc tính $appends
của model để khi trả về dữ liệu có thêm trường status_label
Như vậy là chúng ta đã sử dụng được enum với laravel 10 mà không cần cài package. Thank for reading...