لم يعد استخدام هذه المكتبة موصى به، خاصة للمشاريع الجديدة. PHP 8.1 يدعم التعدادات أصلاً.
انظر رقم 332.
تنفيذ تعداد بسيط وقابل للتوسيع وقوي لـ Laravel.
تعداد أزواج القيمة الرئيسية كثوابت فئة
مجموعة كاملة المواصفات من الأساليب
إنشاء مثيل التعداد
التعدادات ذات العلامة/Bitwise
نوع التلميح
صب السمات
التعداد الحرفي المولد
قواعد التحقق من الصحة لتمرير مفتاح التعداد أو القيم كمعلمات إدخال
دعم الترجمة
قابلة للتمديد عبر وحدات الماكرو
أنشأها بن سامبسون
مرشد
تثبيت
الترحيل إلى PHP التعدادات الأصلية
مكتبة التعداد
الاستخدام الأساسي
تعريف التعداد
إنشاء مثيل
خصائص المثيل
صب المثيل
مثيل المساواة
نوع التلميح
التعداد ذو العلامة/Bitwise
صب السمات
الهجرات
تصديق
التعريب
تخصيص الأوصاف
تخصيص وصف الفئة
تخصيص أوصاف القيمة
توسيع فئة التعداد الأساسية
تكامل لارافيل نوفا
التكامل PHPStan
قائمة الأوامر الحرفية
مرجع فئة التعداد
بذرة
أنت تقرأ وثائق 6.x
.
إذا كنت تستخدم Laravel 8، فيرجى الاطلاع على المستندات الخاصة بالإصدار 4.x
إذا كنت تستخدم Laravel 7، فيرجى الاطلاع على المستندات الخاصة بـ 2.x
إذا كنت تستخدم Laravel 6 أو أقل، فيرجى الاطلاع على المستندات الخاصة بـ 1.x
.
الرجاء مراجعة دليل الترقية للحصول على معلومات حول كيفية الترقية إلى الإصدار الأحدث.
لقد كتبت تدوينة حول استخدام laravel-enum: https://sampo.co.uk/blog/using-enums-in-laravel
يتطلب PHP 8، وLaravel 9 أو 10.
يتطلب الملحن bensampo/laravel-enum
PHP 8.1 يدعم التعدادات أصلاً. يمكنك ترحيل استخداماتك لـ BenSampoEnumEnum
إلى تعدادات PHP الأصلية باستخدام الخطوات التالية.
تأكد من استيفاء المتطلبات التالية:
PHP 8.1 أو أعلى
لارافيل 10 أو أعلى
Rector 0.17 أو أعلى، يتضمن rector.php
الخاص بك جميع الملفات ذات الصلة
أحدث نسخة من هذه المكتبة
اعتمادًا على حجم مشروعك، يمكنك اختيار ترحيل جميع التعدادات مرة واحدة، أو ترحيل عددين أو تعداد واحد فقط في المرة الواحدة.
تحويل جميع التعدادات مرة واحدة: php artisan enum:to-native
قم بتمرير اسم الفئة المؤهلة بالكامل للتعداد للحد من التحويل: php artisan enum:to-native "AppEnumsUserType"
يعد هذا ضروريًا إذا تم استخدام أي تعدادات أثناء مرحلة التمهيد لـ Laravel، فإن تحويل استخداماتها يتداخل مع Larastan ويمنع التشغيل الثاني لـ Rector من العمل.
قم بمراجعة تغييرات التعليمات البرمجية والتحقق من صحتها لحالات الحافة المفقودة:
انظر غير منفذة
Enum::coerce()
: إذا تم تمرير القيم فقط، فيمكنك استبدالها بـ tryFrom()
. إذا كان من الممكن أيضًا تمرير المفاتيح أو المثيلات، فقد تحتاج إلى منطق إضافي لتغطية ذلك.
Enum::$description
و Enum::getDescription()
: تنفيذ بديل.
كتل محاولة/التقاط التي تتعامل مع BenSampoEnumExceptionsInvalidEnumKeyException
أو BenSampoEnumExceptionsInvalidEnumMemberException
. إما أن تكتشف خطأ ValueError
الذي تم طرحه بواسطة التعدادات الأصلية، أو قم بالتبديل إلى استخدام tryFrom()
والتعامل مع null
.
بمجرد تحويل كافة التعدادات، يمكنك إزالة تبعيتك لهذه المكتبة.
قم بالتصفح والتنزيل من قائمة التعدادات الشائعة الاستخدام والتي ساهم بها المجتمع.
مكتبة التعداد →
يمكنك استخدام أمر Artisan التالي لإنشاء فئة تعداد جديدة:
php artisan make: enum UserType
الآن، كل ما عليك فعله هو إضافة القيم المحتملة التي يمكن أن يحتوي عليها التعداد الخاص بك كثوابت.
<?php أعلن(strict_types=1);namespace AppEnums;use BenSampoEnumEnum;الفئة النهائية UserType توسع التعداد {مسؤول const = 0;مشرف const = 1;مشترك ثابت = 2;const SuperAdministrator = 3; }
هذا كل شيء! لاحظ أنه نظرًا لأن قيم التعداد محددة كثوابت عادية، فيمكنك ببساطة الوصول إليها مثل أي ثابت فئة آخر.
UserType::Administrator // له قيمة 0
قد يكون من المفيد إنشاء مثيل للتعدادات لتمريرها بين الوظائف مع الاستفادة من تلميح النوع.
بالإضافة إلى ذلك، من المستحيل إنشاء تعداد بقيمة غير صالحة، لذلك يمكنك التأكد من أن القيمة التي تم تمريرها صالحة دائمًا.
من أجل الراحة، يمكن إنشاء مثيل للتعدادات بعدة طرق:
// فئة PHP قياسية جديدة، تمرر قيمة التعداد المطلوبة كمعلمة$enumInstance = new UserType(UserType::Administrator);// مثل المنشئ، يتم إنشاء مثيل له حسب القيمة$enumInstance = UserType::fromValue(UserType::Administrator) ;// استخدم مفتاح التعداد بدلاً من قيمته$enumInstance = UserType::fromKey('Administrator');// استدعاء اسم المفتاح بشكل ثابت كطريقة، باستخدام __callStatic magic$enumInstance = UserType::Administrator();// محاولة إنشاء مثيل جديد للتعداد باستخدام المفتاح أو القيمة المحددة. يُرجع قيمة فارغة إذا تعذر إنشاء مثيل للتعداد.$enumInstance = UserType::coerce($someValue);
إذا كنت تريد أن يقوم IDE الخاص بك بالإكمال التلقائي لمساعدي إنشاء مثيل ثابت، فيمكنك إنشاء تعليقات PHPDoc من خلال أمر حرفي.
افتراضيًا، سيتم إضافة تعليقات توضيحية لجميع التعدادات الموجودة في app/Enums
(يمكنك تغيير المجلد عن طريق تمرير مسار إلى --folder
).
التعداد الحرفي PHP: التعليق التوضيحي
يمكنك إضافة تعليق توضيحي لفئة واحدة عن طريق تحديد اسم الفئة.
التعداد الحرفي لـ php: قم بالتعليق على "AppEnumsUserType"
بمجرد حصولك على نسخة التعداد، يمكنك الوصول إلى key
value
description
كخصائص.
$userType = UserType::fromValue(UserType::SuperAdministrator);$userType->key; // SuperAdministrator$userType->value; // 3$userType->description; // المسؤول المتميز
يعد هذا مفيدًا بشكل خاص إذا كنت تقوم بتمرير مثيل التعداد إلى طريقة عرض النصل.
يمكن تحويل مثيلات التعداد إلى سلاسل أثناء قيامها بتنفيذ الطريقة السحرية __toString()
.
وهذا يعني أيضًا أنه يمكن تكرارها في عروض الشفرات، على سبيل المثال.
$userType = UserType::fromValue(UserType::SuperAdministrator); (سلسلة) $userType // '3'
يمكنك التحقق من مساواة المثيل مقابل أي قيمة عن طريق تمريره إلى الطريقة is
. للراحة، هناك أيضًا طريقة isNot
وهي عكس is
تمامًا.
$admin = UserType::Administrator();$admin->is(UserType::Administrator); // صحيح$admin->is($admin); // true$admin->is(UserType::Administrator()); // true$admin->is(UserType::Moderator); // false$admin->is(UserType::Moderator()); // false$admin->is('random-value'); // خطأ شنيع
يمكنك أيضًا التحقق لمعرفة ما إذا كانت قيمة المثيل تتطابق مع مصفوفة من القيم المحتملة باستخدام التابع in
، واستخدام notIn
للتحقق مما إذا كانت قيمة المثيل ليست في مصفوفة من القيم. يمكن أيضًا التحقق من العناصر التكرارية.
$admin = UserType::Administrator();$admin->in([UserType::Moderator, UserType::Administrator]); // true$admin->in([UserType::Moderator(), UserType::Administrator()]); // true$admin->in([UserType::Moderator, UserType::Subscriber]); // false$admin->in(['random-value']); // false$admin->notIn([UserType::Moderator, UserType::Administrator]); // false$admin->notIn([UserType::Moderator(), UserType::Administrator()]); // false$admin->notIn([UserType::Moderator, UserType::Subscriber]); // true$admin->notIn(['random-value']); // حقيقي
التعدادات التي تم إنشاء مثيل لها ليست مفردة، بل يتم إنشاء كائن جديد في كل مرة. وبالتالي، فإن المقارنة الصارمة ===
لمثيلات التعداد المختلفة ستعيد دائمًا false
، بغض النظر عن القيمة. في المقابل، المقارنة الفضفاضة ==
ستعتمد على القيمة.
$admin = UserType::Administrator();$admin === UserType::Administrator(); // falseUserType::Administrator() === UserType::Administrator(); // false$admin === UserType::Moderator(); // false$admin === $admin; // true$admin == UserType::Administrator(); // true$admin == UserType::Administrator; // true$admin == UserType::Moderator(); // false$admin == UserType::Moderator; // خطأ شنيع
إحدى فوائد مثيلات التعداد هي أنها تمكنك من استخدام تلميحات الكتابة، كما هو موضح أدناه.
الدالة canPerformAction(UserType $userType) {if ($userType->is(UserType::SuperAdministrator)) {return true; }إرجاع خطأ؛ }$userType1 = UserType::fromValue(UserType::SuperAdministrator);$userType2 = UserType::fromValue(UserType::Moderator);canPerformAction($userType1); // إرجاع truecanPerformAction($userType2); // إرجاع كاذبة
تمثل التعدادات القياسية قيمة واحدة في كل مرة، ولكن التعدادات ذات العلامات أو ذات البتات قادرة على تمثيل قيم متعددة في وقت واحد. وهذا يجعلها مثالية عندما تريد التعبير عن تحديدات متعددة لمجموعة محدودة من الخيارات. ومن الأمثلة الجيدة على ذلك أذونات المستخدم حيث يوجد عدد محدود من الأذونات المحتملة ولكن لا يمكن للمستخدم أن يمتلك أيًا منها أو بعضها أو جميعها.
يمكنك إنشاء تعداد مُعلَّم باستخدام الأمر الحرفي التالي:
php artisan make:enum UserPermissions --flagged
عند تعريف القيم، يجب عليك استخدام قوى العدد 2، وأسهل طريقة للقيام بذلك هي استخدام عامل التحول لليسار <<
كما يلي:
تمتد أذونات المستخدم من الفئة النهائية إلى FlaggedEnum {const ReadComments = 1 << 0;const WriteComments = 1 << 1;const EditComments = 1 << 2;const RemoveComments = 1 << 3;// سيكون التالي هو `1 << 4` وهكذا. ..}
يمكنك استخدام bitwise أو |
لتعيين قيمة اختصار تمثل مجموعة معينة من القيم.
تمتد أذونات المستخدم من الفئة النهائية إلى FlaggedEnum {const ReadComments = 1 << 0;const WriteComments = 1 << 1;const EditComments = 1 << 2;const RemoveComments = 1 << 3;// Shortcutsconst Member = self::ReadComments | self::WriteComments; // القراءة والكتابة.const Moderator = self::Member | self::EditComments; // جميع الأذونات التي يمتلكها العضو، بالإضافة إلى Edit.const Admin = self::Moderator | الذات::حذف التعليقات؛ // جميع الأذونات التي يمتلكها المشرف، بالإضافة إلى الحذف.}
هناك طريقتان لإنشاء مثيل للتعداد الذي تم وضع علامة عليه:
// فئة PHP قياسية جديدة، تمرر قيم التعداد المطلوبة كمصفوفة من القيم أو مصفوفة من مثيلات التعداد$permissions = new UserPermissions([UserPermissions::ReadComments, UserPermissions::EditComments]);$permissions = new UserPermissions([UserPermissions: :ReadComments(), UserPermissions::EditComments()]);// طريقة العلامات الثابتة، لتمرير المطلوب مرة أخرى قيم التعداد كمصفوفة من القيم أو مصفوفة من مثيلات التعداد$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::EditComments]);$permissions = UserPermissions::flags([UserPermissions::ReadComments(), UserPermissions ::تحرير التعليقات()]);
يعمل اختيار السمات بنفس طريقة عمل تعدادات القيمة الفردية.
يمكن أن لا تحتوي التعدادات التي تم وضع علامة عليها على أي قيمة على الإطلاق. يحتوي كل تعداد تم وضع علامة عليه على ثابت محدد مسبقًا وهو None
والذي يمكن مقارنته بـ 0
.
UserPermissions::flags([])->value === UserPermissions::None; // حقيقي
بالإضافة إلى أساليب التعداد القياسية، هناك مجموعة من الأساليب المفيدة المتاحة للتعدادات ذات العلامات.
ملاحظة: في أي مكان يتم فيه تمرير خاصية ثابتة، يمكنك أيضًا تمرير نسخة التعداد.
قم بتعيين علامات التعداد على مجموعة العلامات المحددة.
$permissions = UserPermissions::flags([UserPermissions::ReadComments]);$permissions->flags([UserPermissions::EditComments, UserPermissions::DeleteComments]); // العلامات الآن: تحرير التعليقات، حذف التعليقات.
أضف العلامة المحددة إلى التعداد
$permissions = UserPermissions::flags([UserPermissions::ReadComments]);$permissions->addFlag(UserPermissions::EditComments); // العلامات الآن: ReadComments، EditComments.
أضف العلامات المعطاة إلى التعداد
$permissions = UserPermissions::flags([UserPermissions::ReadComments]);$permissions->addFlags([UserPermissions::EditComments, UserPermissions::WriteComments]); // العلامات الآن هي: ReadComments، وEditComments، وWriteComments.
أضف كافة العلامات إلى التعداد
$permissions = UserPermissions::flags([UserPermissions::ReadComments]);$permissions->addAllFlags(); // يحتوي التعداد الآن على جميع الأعلام
قم بإزالة العلامة المحددة من التعداد
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->removeFlag(UserPermissions::ReadComments); // العلامات الآن: WriteComments.
قم بإزالة العلامات المحددة من التعداد
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments, UserPermissions::EditComments]);$permissions->removeFlags([UserPermissions::ReadComments, UserPermissions::WriteComments]); // الأعلام الآن: تحرير التعليقات.
إزالة كافة العلامات من التعداد
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->removeAllFlags();
تحقق مما إذا كان التعداد يحتوي على العلامة المحددة.
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->hasFlag(UserPermissions::ReadComments); // True$permissions->hasFlag(UserPermissions::EditComments); // خطأ شنيع
تحقق مما إذا كان التعداد يحتوي على كافة العلامات المحددة.
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->hasFlags([UserPermissions::ReadComments, UserPermissions::WriteComments]); // True$permissions->hasFlags([UserPermissions::ReadComments, UserPermissions::EditComments]); // خطأ شنيع
تحقق مما إذا كان التعداد لا يحتوي على العلامة المحددة.
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->notHasFlag(UserPermissions::EditComments); // True$permissions->notHasFlag(UserPermissions::ReadComments); // خطأ شنيع
تحقق مما إذا كان التعداد لا يحتوي على أي من العلامات المحددة.
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->notHasFlags([UserPermissions::ReadComments, UserPermissions::EditComments]); // True$permissions->notHasFlags([UserPermissions::ReadComments, UserPermissions::WriteComments]); // خطأ شنيع
قم بإرجاع الأعلام كمجموعة من الحالات.
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->getFlags(); // [UserPermissions::ReadComments(), UserPermissions::WriteComments()];
تحقق مما إذا كانت هناك علامات متعددة تم تعيينها على التعداد.
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->hasMultipleFlags(); // True;$permissions->removeFlag(UserPermissions::ReadComments)->hasMultipleFlags(); // خطأ شنيع
احصل على قناع البت للتعداد.
UserPermissions::Member()->getBitmask(); // 11;UserPermissions::Moderator()->getBitmask(); // 111;UserPermissions::Admin()->getBitmask(); // 1111;UserPermissions::DeleteComments()->getBitmask(); // 1000؛
لاستخدام التعدادات المميزة مباشرةً في استعلامات Eloquent، يمكنك استخدام خاصية QueriesFlaggedEnums
في نموذجك والتي توفر لك الطرق التالية:
User::hasFlag('permissions', UserPermissions::DeleteComments())->get();
User::notHasFlag('permissions', UserPermissions::DeleteComments())->get();
User::hasAllFlags('permissions', [UserPermissions::EditComment(), UserPermissions::ReadComment()])->get();
User::hasAnyFlags('permissions', [UserPermissions::DeleteComments(), UserPermissions::EditComments()])->get();
يمكنك إرسال سمات النموذج إلى التعدادات باستخدام عملية الصب المخصصة المضمنة في Laravel. سيؤدي هذا إلى إرسال السمة إلى مثيل التعداد عند الحصول على قيمة التعداد والعودة إليها عند الإعداد. نظرًا لأن Enum::class
ينفذ عقد Castable
، فأنت بحاجة فقط إلى تحديد اسم فئة التعداد:
استخدم BenSampoEnumTestsEnumsUserType;استخدم IlluminateDatabaseEloquentModel;مثال الفئة يمتد النموذج {protected $casts = ['random_flag' => 'boolean', // مثال معياري laravel cast'user_type' => UserType::class, // مثال enum cast]; }
الآن، عند الوصول إلى سمة user_type
لنموذج Example
الخاص بك، سيتم إرجاع القيمة الأساسية كتعداد UserType
.
$example = example::first();$example->user_type // مثيل UserType
قم بمراجعة الطرق والخصائص المتوفرة في مثيلات التعداد للحصول على أقصى استفادة من اختيار السمات.
يمكنك تعيين القيمة إما عن طريق تمرير قيمة التعداد أو مثيل تعداد آخر.
$example = example::first();// تعيين باستخدام قيمة التعداد$example->user_type = UserType::Moderator;// تعيين باستخدام مثيل التعداد$example->user_type = UserType::Moderator();
$model->toArray()
عند استخدام toArray
(أو إرجاع نموذج/نماذج من وحدة التحكم الخاصة بك كاستجابة)، سوف يستدعي Laravel التابع toArray
في نسخة التعداد.
افتراضيًا، سيُرجع هذا القيمة فقط في نوعها الأصلي. قد ترغب أيضًا في الوصول إلى الخصائص الأخرى (المفتاح، الوصف)، على سبيل المثال للعودة إلى تطبيق جافا سكريبت.
لتخصيص هذا السلوك، يمكنك تجاوز التابع toArray
في نسخة التعداد.
// مثال Enumfinal class UserType يمتد Enum {مسؤول ثابت = 0؛ وسيط ثابت = 1؛ }$instance = UserType::Moderator();// Defaultpublic function toArray() {إرجاع $هذا->قيمة؛ }// يُرجع int(1)// يُرجع جميع الخصائص إلى الوظيفة العامة toArray() {إرجاع $هذا؛ }// يُرجع مصفوفة بجميع الخصائص// array(3) {// ["value"]=>// int(1)"// ["key"]=>// string(9) "MODERATOR "// ["الوصف"]=>// string(9) "المشرف"// }
تقوم العديد من قواعد البيانات بإرجاع كل شيء كسلاسل (على سبيل المثال، قد يتم إرجاع عدد صحيح كسلسلة '1'
). لتقليل الاحتكاك بين مستخدمي المكتبة، نستخدم أسلوب الإكراه على الكتابة لمعرفة القيمة المقصودة. إذا كنت تفضل التحكم في ذلك، فيمكنك تجاوز الطريقة الثابتة parseDatabase
في فئة التعداد الخاصة بك:
يمتد نوع المستخدم من الفئة النهائية إلى Enum {مسؤول const = 0;مشرف const = 1;وظيفة ثابتة عامة parseDatabase($value) {العودة (كثافة العمليات) قيمة $؛ } }
سيؤدي إرجاع null
من طريقة parseDatabase
إلى جعل السمة الموجودة في النموذج null
أيضًا. يمكن أن يكون هذا مفيدًا إذا كانت قاعدة البيانات الخاصة بك تخزن قيمًا فارغة غير متناسقة مثل السلاسل الفارغة بدلاً من NULL
.
إذا كنت تقوم بإرسال السمات في النموذج الخاص بك إلى التعدادات، فيمكن استخدام حزمة laravel-ide-helper لإنشاء كتل docblock الخاصة بك تلقائيًا.
نظرًا لأن التعدادات تفرض الاتساق على مستوى الكود، فليس من الضروري القيام بذلك مرة أخرى على مستوى قاعدة البيانات، وبالتالي فإن النوع الموصى به لأعمدة قاعدة البيانات هو string
أو int
اعتمادًا على قيم التعداد الخاصة بك. هذا يعني أنه يمكنك إضافة/إزالة قيم التعداد في التعليمات البرمجية الخاصة بك دون القلق بشأن طبقة قاعدة البيانات الخاصة بك.
استخدام AppEnumsUserType؛استخدام IlluminateSupportFacadesSchema؛استخدام IlluminateDatabaseSchemaBlueprint؛استخدام IlluminateDatabaseMigrationsMigration؛فئة CreateUsersTable لتمديد الترحيل {/** * تشغيل عمليات الترحيل. * * @return void */public function up(): void{ المخطط::table('users', function (Blueprint $table): void {$table->bigIncrements('id');$table->timestamps();$table->string('type') ->default(UserType::Moderator); }); } }
enum
وبدلاً من ذلك، يمكنك استخدام فئات Enum
في عمليات الترحيل الخاصة بك لتحديد أعمدة التعداد. يجب تعريف قيم التعداد كسلاسل.
استخدام AppEnumsUserType؛استخدام IlluminateSupportFacadesSchema؛استخدام IlluminateDatabaseSchemaBlueprint؛استخدام IlluminateDatabaseMigrationsMigration؛فئة CreateUsersTable لتمديد الترحيل {/** * تشغيل عمليات الترحيل. * * @return void */public function up(): void{ المخطط::table('users', function (Blueprint $table): void {$table->bigIncrements('id');$table->timestamps();$table->enum('type', UserType:: الحصول على القيم ()) ->default(UserType::Moderator); }); } }
يمكنك التحقق من أن قيمة التعداد التي تم تمريرها إلى وحدة التحكم هي قيمة صالحة لتعداد معين باستخدام قاعدة EnumValue
.
استخدم BenSampoEnumRulesEnumValue؛مخزن الوظائف العامة (طلب طلب $) {$this->validate($request, ['user_type' => ['required', new EnumValue(UserType::class)], ]); }
افتراضيًا، يتم تعيين التحقق من النوع على صارم، ولكن يمكنك تجاوز ذلك عن طريق تمرير false
إلى المعلمة الثانية الاختيارية لفئة EnumValue.
new EnumValue(UserType::class, false) // قم بإيقاف تشغيل التحقق الصارم من النوع.
يمكنك أيضًا التحقق من صحة المفاتيح باستخدام قاعدة EnumKey
. يعد هذا مفيدًا إذا كنت تستخدم مفتاح التعداد كمعلمة URL للفرز أو التصفية على سبيل المثال.
استخدم BenSampoEnumRulesEnumKey؛مخزن الوظائف العامة (طلب طلب $) {$this->validate($request, ['user_type' => ['مطلوب', <span class="pl-v" الجديد)