+1

Apply enum in php 8 to laravel project with multi language

Hôm nay mình sẽ hướng dẫn các bạn áp dụng enum trong php8 vào dự án với FW Laravel cho đa ngôn ngữ.

Tạo các phương thức

Trong enum chúng ta có thể tạo các phương thức

<?php

enum Suit implements Colorful
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;

    // Fulfills the interface contract.
    public function color(): string
    {
        return match($this) {
            Suit::Hearts, Suit::Diamonds => 'Red',
            Suit::Clubs, Suit::Spades => 'Black',
        };
    }

    // Not part of an interface; that's fine.
    public function shape(): string
    {
        return "Rectangle";
    }
}

function paint(Colorful $c) { ... }

paint(Suit::Clubs);  // Works

print Suit::Diamonds->shape(); // prints "Rectangle"
?>

Đa ngôn ngữ

  1. Tạo các method
public static function asSelectArray() 
    {
        $array = [];
        foreach(self::cases() as $item){
            $array[$item->value] = $item->getDescription($item->value);
        }
        return $array;
    }

    public static function getLocalizationKey(): string
    {
        return 'enums.' . static::class;
    }

    protected static function getLocalizedDescription(mixed $value): ?string
    {
        $localizedStringKey = static::getLocalizationKey() . '.' . $value;

        if (Lang::has($localizedStringKey)) {
            return __($localizedStringKey);
        }

        return null;
    }
    protected static function getAttributeDescription($value){
        return self::from($value)->name;
    }
    public function description(){
        return self::getDescription($this->value);
    }

    public static function getDescription(mixed $value): string
    {
        return
            static::getLocalizedDescription($value) ??
            static::getAttributeDescription($value);
    }
  1. Tạo file enums.php trong folder lang/local
return [
    Status::class => [
        Status::Active->value => 'Hoạt động',
        Status::Deactive->value => 'Tạm ngưng'
    ],
];

Validate với enum

use App\Enums\Status;
use Illuminate\Validation\Rules\Enum;
 
$request->validate([
    'status' => [new Enum(Status::class)],
]);

Model với enum

<?php

namespace App\Models;

use App\Enums\Status;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Attribute extends Model
{
    use HasFactory;

    protected $guarded = [];

    protected $casts = [
        'status' => Status::class
    ];
}

Tối ưu

Trong enum hỗ trợ trait giúp chúng ta tái sử dụng các method hỗ trợ. Bây giờ chúng ta tạo file App\Support\Enum.php

<?php

namespace App\Support;
use Illuminate\Support\Facades\Lang;

trait Enum
{

    public static function getCases(): array
    {
       return array_column(self::cases(), 'name');
    }

    public static function getValues(): array
    {
       return array_column(self::cases(), 'value');
    }

    public static function asSelectArray() 
    {
        $array = [];
        foreach(self::cases() as $item){
            $array[$item->value] = $item->getDescription($item->value);
        }
        return $array;
    }

    public static function getLocalizationKey(): string
    {
        return 'enums.' . static::class;
    }

    protected static function getLocalizedDescription(mixed $value): ?string
    {
        $localizedStringKey = static::getLocalizationKey() . '.' . $value;

        if (Lang::has($localizedStringKey)) {
            return __($localizedStringKey);
        }

        return null;
    }
    protected static function getAttributeDescription($value){
        return self::from($value)->name;
    }
    public function description(){
        return self::getDescription($this->value);
    }

    public static function getDescription(mixed $value): string
    {
        return
            static::getLocalizedDescription($value) ??
            static::getAttributeDescription($value);
    }
}

Với cách này chúng ta có thể sử dụng bất cứ trong enum nào mà bạn cần mà không cần copy/paste. Và không bị lặp lại code, dễ dàng thay đổi đối với các method support cho enum Ở trên là ý tưởng của mình trong quá trình làm việc. Bạn nào có ý hay hơn thì cmt phía dưới nhé, đừng nén gạch 😃))


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.