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ữ
- 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);
}
- Tạo file
enums.php
trong folderlang/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