ไม่แนะนำให้ใช้ไลบรารีนี้อีกต่อไป โดยเฉพาะอย่างยิ่งสำหรับโปรเจ็กต์ใหม่ PHP 8.1 รองรับ enums โดยกำเนิด
ดู #332.
การใช้งานการแจงนับที่เรียบง่าย ขยายได้ และมีประสิทธิภาพสำหรับ Laravel
แจกแจงคู่ค่าคีย์เป็นค่าคงที่ของคลาส
ชุดวิธีการที่มีคุณสมบัติครบถ้วน
อินสแตนซ์แจงนับ
แจงนับที่ถูกตั้งค่าสถานะ/Bitwise
พิมพ์คำใบ้
การหล่อคุณสมบัติ
เครื่องกำเนิดไฟฟ้าช่างฝีมือ Enum
กฎการตรวจสอบความถูกต้องสำหรับการส่งคีย์แจงนับหรือค่าเป็นพารามิเตอร์อินพุต
รองรับหลายภาษา
ขยายได้ผ่านมาโคร
สร้างโดยเบน แซมป์สัน
แนะนำ
การติดตั้ง
ย้ายไปยัง Native PHP Enums
ห้องสมุดอีนัม
การใช้งานขั้นพื้นฐาน
คำจำกัดความแจงนับ
การสร้างอินสแตนซ์
คุณสมบัติของอินสแตนซ์
การหล่ออินสแตนซ์
ความเท่าเทียมกันของอินสแตนซ์
ประเภทคำแนะนำ
ติดธง/Bitwise Enum
การหล่อคุณสมบัติ
การโยกย้าย
การตรวจสอบ
รองรับหลายภาษา
การปรับแต่งคำอธิบาย
การปรับแต่งคำอธิบายคลาส
การปรับแต่งคำอธิบายค่า
การขยายคลาสฐาน Enum
การบูรณาการ Laravel Nova
บูรณาการ PHPStan
รายการคำสั่งช่าง
การอ้างอิงคลาส Enum
ต้นขั้ว
คุณกำลังอ่านเอกสารประกอบสำหรับ 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 รองรับ enums โดยกำเนิด คุณสามารถย้ายการใช้งาน BenSampoEnumEnum
ไปยัง PHP enums ดั้งเดิมได้โดยใช้ขั้นตอนต่อไปนี้
ตรวจสอบให้แน่ใจว่าคุณมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้:
PHP 8.1 หรือสูงกว่า
Laravel 10 หรือสูงกว่า
Rector 0.17 หรือสูงกว่านั้น rector.php
ของคุณจะมีไฟล์ที่เกี่ยวข้องทั้งหมด
เวอร์ชันล่าสุดของไลบรารีนี้
ขึ้นอยู่กับขนาดของโปรเจ็กต์ของคุณ คุณอาจเลือกที่จะย้าย enum ทั้งหมดพร้อมกัน หรือย้ายเพียงสองสามหรือครั้งละหนึ่ง enum
แปลง enum ทั้งหมดพร้อมกัน: php artisan enum:to-native
ส่งชื่อคลาสแบบเต็มของ enum เพื่อจำกัดการแปลง: php artisan enum:to-native "AppEnumsUserType"
นี่เป็นสิ่งจำเป็นหากมีการใช้ enum ในระหว่างเฟสบูตสแตรปของ Laravel การแปลงการใช้งานจะรบกวนการทำงานของ Larastan และป้องกันไม่ให้ Rector ทำงานครั้งที่สอง
ตรวจสอบและตรวจสอบการเปลี่ยนแปลงรหัสสำหรับกรณีที่ไม่ได้รับ:
ดูยังไม่ได้ดำเนินการ
Enum::coerce()
: หากส่งเฉพาะค่าเท่านั้น คุณสามารถแทนที่ด้วย tryFrom()
หากคีย์หรืออินสแตนซ์สามารถส่งผ่านได้ คุณอาจต้องใช้ตรรกะเพิ่มเติมเพื่อครอบคลุมเรื่องนี้
Enum::$description
และ Enum::getDescription()
: ใช้ทางเลือกอื่น
ลอง/catch-blocks ที่จัดการ BenSampoEnumExceptionsInvalidEnumKeyException
หรือ BenSampoEnumExceptionsInvalidEnumMemberException
จับ ValueError
ที่ส่งมาจาก enums ดั้งเดิม หรือเปลี่ยนไปใช้ tryFrom()
และจัดการ null
เมื่อแปลง enum ทั้งหมดแล้ว คุณสามารถลบการพึ่งพาไลบรารีนี้ได้
เรียกดูและดาวน์โหลดจากรายการ enum ที่ใช้กันทั่วไปซึ่งสนับสนุนโดยชุมชน
ไลบรารี Enum →
คุณสามารถใช้คำสั่ง Artisan ต่อไปนี้เพื่อสร้างคลาส enum ใหม่:
php artisan make:enum ประเภทผู้ใช้
ตอนนี้ คุณเพียงแค่ต้องเพิ่มค่าที่เป็นไปได้ที่แจงนับของคุณสามารถมีได้เป็นค่าคงที่
<?php ประกาศ (strict_types=1); namespace AppEnums; ใช้ BenSampoEnumEnum; UserType คลาสสุดท้ายขยาย Enum {const Administrator = 0;const Moderator = 1;const Subscriber = 2;const SuperAdministrator = 3; -
แค่นั้นแหละ! โปรดทราบว่าเนื่องจากค่าแจงนับถูกกำหนดให้เป็นค่าคงที่ธรรมดา คุณจึงสามารถเข้าถึงได้เหมือนกับค่าคงที่ของคลาสอื่นๆ
UserType::Administrator // มีค่าเป็น 0
อาจมีประโยชน์ในการสร้างอินสแตนซ์ enum เพื่อส่งต่อระหว่างฟังก์ชันโดยมีประโยชน์ในการบอกใบ้ประเภท
นอกจากนี้ เป็นไปไม่ได้ที่จะสร้างอินสแตนซ์ enum ด้วยค่าที่ไม่ถูกต้อง ดังนั้นคุณจึงมั่นใจได้ว่าค่าที่ส่งผ่านนั้นถูกต้องเสมอไป
เพื่อความสะดวก สามารถสร้างอินสแตนซ์ enum ได้หลายวิธี:
// คลาส PHP ใหม่มาตรฐาน ส่งผ่านค่า enum ที่ต้องการเป็น parameter$enumInstance = new UserType(UserType::Administrator);// เหมือนกับ Constructor, สร้างอินสแตนซ์ด้วย value$enumInstance = UserType::fromValue(UserType::Administrator) ;// ใช้คีย์ enum แทน value$enumInstance = UserType::fromKey('Administrator');// การเรียกชื่อคีย์เป็นวิธีการแบบคงที่ การใช้ __callStatic magic$enumInstance = UserType::Administrator();// พยายามสร้างอินสแตนซ์ Enum ใหม่โดยใช้คีย์หรือค่าที่กำหนด ส่งกลับค่า null ถ้า Enum ไม่สามารถสร้างอินสแตนซ์ได้$enumInstance = UserType::coerce($someValue);
หากคุณต้องการให้ IDE ของคุณเติมข้อมูลตัวช่วยการสร้างอินสแตนซ์แบบคงที่โดยอัตโนมัติ คุณสามารถสร้างคำอธิบายประกอบ PHPDoc ผ่านคำสั่ง Artisan ได้
ตามค่าเริ่มต้น Enums ทั้งหมดใน app/Enums
จะถูกใส่คำอธิบายประกอบ (คุณสามารถเปลี่ยนโฟลเดอร์ได้โดยส่งเส้นทางไปที่ --folder
)
php artisan enum: คำอธิบายประกอบ
คุณสามารถใส่คำอธิบายประกอบให้กับคลาสเดียวได้โดยการระบุชื่อคลาส
php artisan enum: ใส่คำอธิบายประกอบ "AppEnumsUserType"
เมื่อคุณมีอินสแตนซ์ enum แล้ว คุณสามารถเข้าถึง key
value
และ description
เป็นคุณสมบัติได้
$userType = UserType::fromValue(UserType::SuperAdministrator);$userType->คีย์; // SuperAdministrator$userType->ค่า; // 3$userType->คำอธิบาย; //ผู้ดูแลระบบขั้นสูง
สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณกำลังส่งอินสแตนซ์แจงนับไปยังมุมมองเบลด
อินสแตนซ์ Enum สามารถส่งไปยังสตริงได้ในขณะที่ใช้เมธอดเวทย์มนตร์ __toString()
นอกจากนี้ยังหมายความว่าสามารถสะท้อนเสียงเหล่านั้นในมุมมองเบลดได้อีกด้วย
$userType = UserType::fromValue(UserType::SuperAdministrator); (สตริง) $userType // '3'
คุณสามารถตรวจสอบความเท่าเทียมกันของอินสแตนซ์กับค่าใดๆ ได้โดยส่งผ่านไปยังเมธอด is
เพื่อความสะดวก ยังมีวิธี isNot
ซึ่งเป็นวิธีย้อนกลับของวิธี is
อีกด้วย
$admin = UserType::Administrator();$admin->is(UserType::Administrator); // true$admin->is($admin); // true$admin->is(UserType::Administrator()); // true$admin->is(UserType::Moderator); // false$admin->is(UserType::Moderator()); // false$admin->is('ค่าสุ่ม'); // เท็จ
คุณยังสามารถตรวจสอบเพื่อดูว่าค่าของอินสแตนซ์ตรงกับอาร์เรย์ของค่าที่เป็นไปได้หรือไม่โดยใช้เมธอด in
และใช้ notIn
เพื่อตรวจสอบว่าค่าของอินสแตนซ์ไม่อยู่ในอาร์เรย์ของค่าหรือไม่ Iterables ยังสามารถตรวจสอบได้
$admin = UserType::Administrator();$admin->in([UserType::Moderator, UserType::Administrator]); // true$admin->in([ประเภทผู้ใช้::ผู้ดูแล(), ประเภทผู้ใช้::ผู้ดูแลระบบ()]); // true$admin->in([ประเภทผู้ใช้::ผู้ดูแล, ประเภทผู้ใช้::สมาชิก]); // false$admin->in(['ค่าสุ่ม']); // false$admin->notIn([ประเภทผู้ใช้::ผู้ดูแล, ประเภทผู้ใช้::ผู้ดูแลระบบ]); // false$admin->notIn([ประเภทผู้ใช้::ผู้ดูแล(), ประเภทผู้ใช้::ผู้ดูแลระบบ()]); // false$admin->notIn([ประเภทผู้ใช้::ผู้ดูแล, ประเภทผู้ใช้::สมาชิก]); // true$admin->notIn(['ค่าสุ่ม']); // จริง
การแจงนับที่สร้างอินสแตนซ์ไม่ใช่ซิงเกิลตัน แต่มีการสร้างออบเจ็กต์ใหม่ทุกครั้ง ดังนั้นการเปรียบเทียบที่เข้มงวด ===
ของอินสแตนซ์ enum ที่แตกต่างกันจะส่งคืน false
เสมอไม่ว่าค่าจะเป็นเช่นไรก็ตาม ในทางตรงกันข้าม การเปรียบเทียบแบบหลวมๆ ==
จะขึ้นอยู่กับค่า
$admin = UserType::ผู้ดูแลระบบ();$admin === ประเภทผู้ใช้::ผู้ดูแลระบบ(); // falseUserType::ผู้ดูแลระบบ() === ประเภทผู้ใช้::ผู้ดูแลระบบ(); // false$admin === ประเภทผู้ใช้::ผู้ดูแล(); // false$admin === $admin; // true$admin == ประเภทผู้ใช้::ผู้ดูแลระบบ(); // true$admin == ประเภทผู้ใช้::ผู้ดูแลระบบ; // true$admin == UserType::Moderator(); // false$admin == ประเภทผู้ใช้::ผู้ดูแล; // เท็จ
ข้อดีอย่างหนึ่งของอินสแตนซ์ enum คือช่วยให้คุณสามารถใช้คำใบ้ประเภทได้ ดังที่แสดงด้านล่าง
ฟังก์ชั่น canPerformAction (ประเภทผู้ใช้ $ ประเภทผู้ใช้) {if ($userType->is(UserType::SuperAdministrator)) {คืนค่าจริง; } กลับเท็จ; }$userType1 = UserType::fromValue(UserType::SuperAdministrator);$userType2 = UserType::fromValue(UserType::Moderator);canPerformAction($userType1); // ส่งคืน truecanPerformAction($userType2); // ส่งคืนค่าเท็จ
การแจงนับมาตรฐานแสดงค่าเดียวในแต่ละครั้ง แต่การแจงนับที่ถูกแฟล็กหรือระดับบิตสามารถแสดงค่าหลายค่าพร้อมกันได้ ทำให้เหมาะสำหรับเวลาที่คุณต้องการแสดงตัวเลือกหลายรายการจากชุดตัวเลือกที่จำกัด ตัวอย่างที่ดีของสิ่งนี้คือสิทธิ์ของผู้ใช้ซึ่งสิทธิ์ที่เป็นไปได้มีจำนวนจำกัด แต่ผู้ใช้ไม่สามารถมีสิทธิ์บางส่วนหรือทั้งหมดได้
คุณสามารถสร้างแจงนับที่ถูกแฟล็กได้โดยใช้คำสั่งช่างต่อไปนี้:
php artisan make:enum UserPermissions --flagged
เมื่อกำหนดค่า คุณต้องใช้กำลัง 2 วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการใช้ตัวดำเนินการ shift left <<
ดังนี้:
UserPermissions คลาสสุดท้ายขยาย FlaggedEnum {const ReadComments = 1 << 0;const WriteComments = 1 << 1;const EditComments = 1 << 2;const DeleteComments = 1 << 3;// อันถัดไปจะเป็น `1 << 4` ไปเรื่อยๆ ..}
คุณสามารถใช้บิตไวส์ หรือ |
เพื่อตั้งค่าทางลัดซึ่งแสดงถึงชุดค่าที่กำหนด
UserPermissions คลาสสุดท้ายขยาย FlaggedEnum {const ReadComments = 1 << 0;const WriteComments = 1 << 1;const EditComments = 1 << 2;const DeleteComments = 1 << 3;// ทางลัดconst Member = self::ReadComments | ตนเอง::เขียนความคิดเห็น; // อ่านและเขียน.const Moderator = self::สมาชิก | ตนเอง::แก้ไขความคิดเห็น; // สิทธิ์ทั้งหมดที่สมาชิกมี บวกกับ Edit.const Admin = self::Moderator | ตนเอง::ลบความคิดเห็น; // สิทธิ์ทั้งหมดที่ผู้ดูแลมี บวกด้วย Delete}
มีสองวิธีในการสร้างอินสแตนซ์แจงนับที่ถูกตั้งค่าสถานะ:
// คลาส PHP ใหม่มาตรฐาน ส่งค่า enum ที่ต้องการเป็นอาร์เรย์ของค่าหรืออาร์เรย์ของอินสแตนซ์ enum$permissions = new UserPermissions([UserPermissions::ReadComments, UserPermissions::EditComments]);$permissions = new UserPermissions([UserPermissions: :ReadComments(), UserPermissions::EditComments()]);// วิธีตั้งค่าสถานะคงที่ ส่งค่าแจงนับที่ต้องการอีกครั้งเป็นอาร์เรย์ของค่าหรืออาร์เรย์ของ อินสแตนซ์ enum$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::EditComments]);$permissions = UserPermissions::flags([UserPermissions::ReadComments(), UserPermissions::EditComments()]);
การแคสต์แอตทริบิวต์ทำงานในลักษณะเดียวกับการแจงค่าเดี่ยว
การแจงนับที่ถูกตั้งค่าสถานะไม่สามารถมีค่าใดๆ ได้เลย enum ที่ตั้งค่าสถานะทุกรายการมีค่าคงที่ที่กำหนดไว้ล่วงหน้าเป็น None
ซึ่งเทียบได้กับ 0
UserPermissions::flags([])->value === UserPermissions::None; // จริง
นอกเหนือจากวิธีการแจงนับมาตรฐานแล้ว ยังมีชุดวิธีการที่เป็นประโยชน์ที่มีให้ในแจงนับที่ถูกตั้งค่าสถานะ
หมายเหตุ: ทุกที่ที่มีการส่งผ่านคุณสมบัติคงที่ คุณยังสามารถส่งอินสแตนซ์แจงนับได้
ตั้งค่าสถานะสำหรับแจงนับไปยังอาร์เรย์ของแฟล็กที่กำหนด
$permissions = UserPermissions::flags([UserPermissions::ReadComments]);$permissions->flags([UserPermissions::EditComments, UserPermissions::DeleteComments]); // ตอนนี้ตั้งค่าสถานะ: EditComments, DeleteComments
เพิ่มแฟล็กที่กำหนดลงใน enum
$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(); // Enum ตอนนี้มีแฟล็กทั้งหมดแล้ว
ลบแฟล็กที่กำหนดออกจากแจงนับ
$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();
ตรวจสอบว่า enum มีแฟล็กที่ระบุหรือไม่
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->hasFlag(UserPermissions::ReadComments); // True$permissions->hasFlag(UserPermissions::EditComments); // เท็จ
ตรวจสอบว่า enum มีแฟล็กที่ระบุทั้งหมดหรือไม่
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->hasFlags([UserPermissions::ReadComments, UserPermissions::WriteComments]); // True$permissions->hasFlags([UserPermissions::ReadComments, UserPermissions::EditComments]); // เท็จ
ตรวจสอบว่า enum ไม่มีแฟล็กที่ระบุ
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->notHasFlag(UserPermissions::EditComments); // True$permissions->notHasFlag(UserPermissions::ReadComments); // เท็จ
ตรวจสอบว่า enum ไม่มีแฟล็กที่ระบุใดๆ
$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(); // [สิทธิ์ผู้ใช้::ReadComments(), สิทธิ์ผู้ใช้::WriteComments()];
ตรวจสอบว่ามีหลายแฟล็กที่ตั้งค่าไว้ในแจงนับหรือไม่
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]);$permissions->hasMultipleFlags(); // True;$permissions->removeFlag(UserPermissions::ReadComments)->hasMultipleFlags(); // เท็จ
รับบิตมาสก์สำหรับแจงนับ
สิทธิ์ผู้ใช้::สมาชิก()->getBitmask(); // 11;UserPermissions::Moderator()->getBitmask(); // 111;UserPermissions::Admin()->getBitmask(); // 1111;UserPermissions::DeleteComments()->getBitmask(); // 1,000;
หากต้องการใช้การแจงนับที่ถูกตั้งค่าสถานะโดยตรงในการสืบค้น Eloquent ของคุณ คุณอาจใช้คุณลักษณะ QueriesFlaggedEnums
บนโมเดลของคุณซึ่งมีวิธีการดังต่อไปนี้:
ผู้ใช้::hasFlag('สิทธิ์', UserPermissions::DeleteComments())->get();
ผู้ใช้::notHasFlag('สิทธิ์', UserPermissions::DeleteComments())->get();
ผู้ใช้::hasAllFlags('สิทธิ์', [สิทธิ์ผู้ใช้::EditComment(), สิทธิ์ผู้ใช้::ReadComment()])->get();
ผู้ใช้::hasAnyFlags('สิทธิ์', [UserPermissions::DeleteComments(), UserPermissions::EditComments()])->get();
คุณสามารถส่งคุณลักษณะของโมเดลไปยัง enum ได้โดยใช้การหล่อแบบกำหนดเองในตัวของ Laravel สิ่งนี้จะส่งแอตทริบิวต์ไปยังอินสแตนซ์ enum เมื่อรับและกลับสู่ค่า enum เมื่อตั้งค่า เนื่องจาก Enum::class
ใช้สัญญา Castable
คุณเพียงแค่ต้องระบุชื่อคลาสของ enum:
ใช้ BenSampoEnumTestsEnumsUserType; ใช้ IlluminateDatabaseEloquentModel; ตัวอย่างคลาสขยายโมเดล {protected $casts = ['random_flag' => 'boolean', // ตัวอย่างมาตรฐาน laravel cast'user_type' => UserType::class, // ตัวอย่างการแจกแจง enum]; -
ตอนนี้ เมื่อคุณเข้าถึงแอตทริบิวต์ user_type
ของโมเดล Example
ของคุณ ค่าที่ซ่อนอยู่จะถูกส่งกลับเป็น UserType
enum
$example = ตัวอย่าง::first();$example->user_type // อินสแตนซ์ของ UserType
ตรวจสอบวิธีการและคุณสมบัติที่มีอยู่ในอินสแตนซ์ enum เพื่อรับประโยชน์สูงสุดจากการคัดเลือกแอตทริบิวต์
คุณสามารถตั้งค่าได้โดยการส่งค่าแจงนับหรืออินสแตนซ์แจงนับอื่น
$example = ตัวอย่าง::first();// ตั้งค่าโดยใช้ค่า enum$example->user_type = UserType::Moderator;// ตั้งค่าโดยใช้ enum instance$example->user_type = UserType::Moderator();
$model->toArray()
เมื่อใช้ toArray
(หรือส่งคืนโมเดล/โมเดลจากคอนโทรลเลอร์ของคุณเป็นการตอบกลับ) Laravel จะเรียกใช้เมธอด toArray
บนอินสแตนซ์ enum
ตามค่าเริ่มต้น สิ่งนี้จะส่งกลับเฉพาะค่าในประเภทดั้งเดิมเท่านั้น คุณอาจต้องการเข้าถึงคุณสมบัติอื่นๆ (คีย์ คำอธิบาย) เช่น เพื่อกลับไปยังแอปจาวาสคริปต์
หากต้องการปรับแต่งลักษณะการทำงานนี้ คุณสามารถแทนที่เมธอด toArray
บนอินสแตนซ์ enum ได้
// ตัวอย่างคลาส Enumfinal UserType ขยาย Enum {ผู้ดูแลระบบ const = 0; const MODERATOR = 1; }$instance = UserType::Moderator();// ค่าเริ่มต้นฟังก์ชันสาธารณะ toArray() {ส่งคืน $this->value; }// คืนค่า int(1)// คืนค่าฟังก์ชันสาธารณะทั้งหมดเป็น Array() {คืน $สิ่งนี้; }// ส่งคืนอาร์เรย์ของคุณสมบัติทั้งหมด// array(3) {// ["value"]=>// int(1)"// ["key"]=>// string(9) "MODERATOR "// ["คำอธิบาย"]=>// string(9) "ผู้ดูแล"// }
ฐานข้อมูลจำนวนมากส่งคืนทุกสิ่งเป็นสตริง (เช่น จำนวนเต็มอาจส่งคืนเป็นสตริง '1'
) เพื่อลดความขัดแย้งสำหรับผู้ใช้ห้องสมุด เราใช้การบังคับประเภทเพื่อหาค่าที่ต้องการ หากคุณต้องการควบคุมสิ่งนี้ คุณสามารถแทนที่วิธี parseDatabase
static บนคลาส enum ของคุณได้:
UserType คลาสสุดท้ายขยาย Enum {const Administrator = 0;const Moderator = 1;public static function parseDatabase($value) {ส่งคืน (int) $value; - -
การคืนค่า null
จากเมธอด parseDatabase
จะทำให้แอตทริบิวต์ในโมเดลเป็น null
ด้วย สิ่งนี้มีประโยชน์หากฐานข้อมูลของคุณเก็บค่าว่างที่ไม่สอดคล้องกัน เช่น สตริงว่าง แทนที่จะเป็น NULL
หากคุณกำลังส่งแอตทริบิวต์บนโมเดลของคุณเพื่อแจกแจง แพ็คเกจ laravel-ide-helper สามารถใช้เพื่อสร้าง docblock คุณสมบัติให้คุณโดยอัตโนมัติ
เนื่องจาก enums บังคับใช้ความสอดคล้องกันในระดับโค้ด จึงไม่จำเป็นต้องทำอีกครั้งในระดับฐานข้อมูล ดังนั้นประเภทที่แนะนำสำหรับคอลัมน์ฐานข้อมูลคือ string
หรือ int
ขึ้นอยู่กับค่า enum ของคุณ ซึ่งหมายความว่าคุณสามารถเพิ่ม/ลบค่า enum ในโค้ดของคุณได้โดยไม่ต้องกังวลกับเลเยอร์ฐานข้อมูลของคุณ
ใช้ AppEnumsUserType; ใช้ IlluminateSupportFacadesSchema; ใช้ IlluminateDatabaseSchemaBlueprint; ใช้ IlluminateDatabaseMigrationsMigration; คลาส CreateUsersTable ขยายการโยกย้าย {/** * ดำเนินการย้ายข้อมูล * * @return เป็นโมฆะ */ ฟังก์ชั่นสาธารณะขึ้น (): เป็นโมฆะ { Schema::table('users', function (Blueprint $table): void {$table->bigIncreas('id');$table->timestamps();$table->string('type') ->ค่าเริ่มต้น(ประเภทผู้ใช้::ผู้ดูแล); - - -
enum
หรือคุณสามารถใช้คลาส Enum
ในการย้ายข้อมูลของคุณเพื่อกำหนดคอลัมน์ enum ค่าแจงนับต้องถูกกำหนดให้เป็นสตริง
ใช้ AppEnumsUserType; ใช้ IlluminateSupportFacadesSchema; ใช้ IlluminateDatabaseSchemaBlueprint; ใช้ IlluminateDatabaseMigrationsMigration; คลาส CreateUsersTable ขยายการโยกย้าย {/** * ดำเนินการย้ายข้อมูล * * @return เป็นโมฆะ */ ฟังก์ชั่นสาธารณะขึ้น (): เป็นโมฆะ { Schema::table('users', function (พิมพ์เขียว $table): void {$table->bigIncreas('id');$table->timestamps();$table->enum('type', UserType:: รับค่า()) ->ค่าเริ่มต้น(ประเภทผู้ใช้::ผู้ดูแล); - - -
คุณอาจตรวจสอบว่าค่าแจงนับที่ส่งไปยังตัวควบคุมเป็นค่าที่ถูกต้องสำหรับแจงนับที่กำหนดโดยใช้กฎ EnumValue
ใช้ BenSampoEnumRulesEnumValue; ร้านค้าฟังก์ชั่นสาธารณะ (คำขอ $ คำขอ) {$this->validate($request, ['user_type' => ['required', new EnumValue(UserType::class)], - -
ตามค่าเริ่มต้น การตรวจสอบประเภทจะถูกตั้งค่าเป็นแบบเข้มงวด แต่คุณสามารถข้ามสิ่งนี้ได้โดยการส่งค่า false
ไปยังพารามิเตอร์ตัวที่สองที่เป็นทางเลือกของคลาส EnumValue
new EnumValue(UserType::class, false) // ปิดการตรวจสอบประเภทที่เข้มงวด
คุณยังสามารถตรวจสอบคีย์ได้โดยใช้กฎ EnumKey
สิ่งนี้มีประโยชน์หากคุณใช้คีย์ enum เป็นพารามิเตอร์ URL สำหรับการเรียงลำดับหรือการกรอง เป็นต้น
ใช้ BenSampoEnumRulesEnumKey; ร้านค้าฟังก์ชั่นสาธารณะ (คำขอ $ คำขอ) {$this->validate($request, ['user_type' => ['required', ใหม่ <span class="pl-v"