Enum attribute casting laravel 10

  • October 14, 2023
  • 550

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.

Laravel Enum

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.

Using Enum in laravel

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()),
        ];
    }
}

Enum attribute casting

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

Tổng kết

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...