محمد دولابی
محمد دولابی
خواندن ۲ دقیقه·۲ سال پیش

راهی جدید برای اعتبار سنجی لیست ها در لاراول با enum rule


سلام
امروز با این مطلب مواجه شدم گفتم تو ویرگول بنویسم شاید به کار یه نفر دیگه هم امد
اسم این قابلیت Enum rule هست که برام جالب بود

توضیح مختصری در مورد enum ها

معمولا تا الان برای تعریف کردن enum در PHP دست به دامن کلاس ها و کانستنت ها (constant) می‌شویم، اما پی اچ پی قرار هستش که از این تایپ به صورت مستقل تری در ورژن 8.1 پشتیبانی کنه.

خودم زمانی که می‌خوام توی پی اچ پی enum تعریف کنم معمولا از این روش استفاده میکنم :

حالا ببینید که خود پی اچ پی قراره که چطور این کار رو انجام بده‌ :

این یه توضیح مختصری از enum بود
حالا اگر بخوایم از این enum ها استفاده کنیم و اعتبار سنجی کنیم چی؟

بیایید یه مثال بزنیم‌:
فرض کنید یه مدل پست داریم که ۳ تا وضعیت داره :

<?php namespace App\Enums; enum PostStatus: string { case Draft = &quotdraft&quot case InReview = &quotin_review&quot case Published = &quotpublished&quot

یه پرانتز کوچیک باز کنم یه قابلیت جذابی که در ورژن 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 فعاله.

امیدوارم مفید بوده باشه.



منابع:
لینک یک&lt;br/&gt;

اعتبار سنجیenum rulelaravel enumenumphp enum
شاید از این پست‌ها خوشتان بیاید