سلام
امروز با این مطلب مواجه شدم گفتم تو ویرگول بنویسم شاید به کار یه نفر دیگه هم امد
اسم این قابلیت Enum rule هست که برام جالب بود
معمولا تا الان برای تعریف کردن enum در PHP دست به دامن کلاس ها و کانستنت ها (constant) میشویم، اما پی اچ پی قرار هستش که از این تایپ به صورت مستقل تری در ورژن 8.1 پشتیبانی کنه.
خودم زمانی که میخوام توی پی اچ پی enum تعریف کنم معمولا از این روش استفاده میکنم :
حالا ببینید که خود پی اچ پی قراره که چطور این کار رو انجام بده :
این یه توضیح مختصری از enum بود
حالا اگر بخوایم از این enum ها استفاده کنیم و اعتبار سنجی کنیم چی؟
بیایید یه مثال بزنیم:
فرض کنید یه مدل پست داریم که ۳ تا وضعیت داره :
<?php namespace App\Enums; enum PostStatus: string { case Draft = "draft" case InReview = "in_review" case Published = "published"
یه پرانتز کوچیک باز کنم یه قابلیت جذابی که در ورژن 8.69 اضافه شده اینه که به ما اجازه میده تا بتونیم enum ها رو cast کنیم
یعنی اینطوری:
<?php namespace App\Models; use App\Enums\PostStatus; use Illuminate\Database\Eloquent\Model; class Post extends Model { protected $casts = [ 'status' => PostStatus::class ]; }
خب حالا رسیدیم به اصل ماجرا یعنی ولیدیشن کردن enum ها
اگر بخوایم بگیم که فیلد status فقط میتونه مقدار هایی که در enum ها براش تعیین کردیم رو داشته باشه با به این صورت بگیم :
use App\Enums\PostStatus; use Illuminate\Validation\Rules\Enum; $request->validate([ 'status' => [new Enum(PostStatus::class)], ]);
حالا اگر بگیم که این پست رو با یه مقداری که وجود نداره اپدیت کن با خطا مواجه میشیم :
$post->update(['status' => 'xyz']);
/* Fatal Error: "xyz" is not a valid backing value for enum ... */
قبل از اینکه این قابلیت به لاراول اضافه بشه مجبور بودیم به صورت زیر عمل کنیم :
$validate = $request->validate(['status' => ['required', Rule::in(['draft','in_review','published']) ]);
باید بگم که این قابلیت فقط در php +8.1 فعاله.
امیدوارم مفید بوده باشه.
منابع:
لینک یک<br/>