Cung cấp các tính năng bổ sung, có ý kiến cho PHP 8. Hơn 1 enum gốc cũng như tích hợp cụ thể với các khung và thư viện
#[ReadableEnum[prefix: 'suit.']] enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; case Hearts = '♥︎'; case Diamonds = '♦︎'; case Clubs = '♣︎'; case Spades = '︎♠︎'; }
📢Dự án này được sử dụng để mô phỏng các kiểu liệt kê trước PHP 8. 1.
Đối với 1. x, hãy nhấp vào đây
Bạn cũng có thể tham khảo vấn đề này để theo dõi các mục tiêu và tiến độ cho V2 của thư viện này.
- Đặc trưng
- Symfony VarDumper
Cài đặt
composer require "elao/enum:^2.0"
Hoặc, để trợ giúp và thử nghiệm những thay đổi mới nhất
composer require "elao/enum:^2.x-dev"
enums có thể đọc được
Các enum có thể đọc được cung cấp một cách để hiển thị các nhãn mà con người có thể đọc được cho các trường hợp enum của bạn, bằng cách thêm một hợp đồng
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }5 mới vào các enum của bạn
Cách dễ nhất để triển khai giao diện này là sử dụng thuộc tính
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }6 và
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }7
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }
Đoạn mã sau đây cho biết cách lấy giá trị mà con người có thể đọc được của một enum
Suit::Hearts->getReadable[]; // returns 'suit.hearts'
Nó xác định một hợp đồng thích hợp để hiển thị nhãn trường hợp enum thay vì sử dụng tên nội bộ trường hợp enum. Điều này đặc biệt hữu ích nếu ngôn ngữ hiển thị nhãn cho người dùng của bạn khác với ngôn ngữ bạn đang viết mã, cũng như để tạo tích hợp với các thư viện yêu cầu hiển thị các nhãn đó
Nó cũng đặc biệt hữu ích khi kết hợp với thư viện dịch thuật như thành phần Dịch thuật của Symfony, bằng cách sử dụng các phím dịch thuật
Cho tệp dịch sau
________số 8
$enum = Suit::Hearts; $translator->trans[$enum->getReadable[], locale: 'fr']; // returns 'Coeurs'
Định cấu hình hậu tố/tiền tố & giá trị mặc định
Là một lối tắt, bạn cũng có thể sử dụng thuộc tính
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }8 để xác định
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }9 và
Suit::Hearts->getReadable[]; // returns 'suit.hearts'0 chung để sử dụng, cũng như đặt mặc định cho tên hoặc giá trị trường hợp enum, nếu không được cung cấp rõ ràng
composer require "elao/enum:^2.0"
3sử dụng giá trị trường hợp [chỉ dành cho enum được hỗ trợ chuỗi]
composer require "elao/enum:^2.0"
4Giá trị bổ sung
Các thuộc tính
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }7 cũng cung cấp cho bạn một cách để định cấu hình một số thuộc tính bổ sung cho các trường hợp của bạn và truy cập các thuộc tính này một cách dễ dàng bằng
Suit::Hearts->getReadable[]; // returns 'suit.hearts'2
composer require "elao/enum:^2.0"
7Truy cập những thông tin này bằng cách sử dụng
Suit::Hearts->getReadable[]; // returns 'suit.hearts'3
composer require "elao/enum:^2.0"
0hoặc tạo giao diện/đặc điểm của riêng bạn
composer require "elao/enum:^2.0"
1cờ enums
Bảng liệt kê được gắn cờ được sử dụng cho các hoạt động theo bit
composer require "elao/enum:^2.0"
2Mỗi trường hợp được liệt kê là một cờ bit và có thể được kết hợp với các trường hợp khác thành một mặt nạ bit và được thao tác bằng cách sử dụng đối tượng
Suit::Hearts->getReadable[]; // returns 'suit.hearts'4
composer require "elao/enum:^2.0"
3Do đó, bằng cách sử dụng
Suit::Hearts->getReadable[]; // returns 'suit.hearts'5, bạn có thể nhận được giá trị được mã hóa cho bất kỳ tổ hợp cờ nào từ enum của mình và sử dụng giá trị đó để lưu trữ hoặc liên lạc giữa các quy trình của bạn
tích hợp
Biểu mẫu Symfony
Symfony đã cung cấp một EnumType để cho phép người dùng chọn một hoặc nhiều tùy chọn được xác định trong bảng liệt kê PHP.
Nó mở rộng trường ChoiceType và xác định các tùy chọn tương tự.
Tuy nhiên, nó sử dụng tên trường hợp enum làm nhãn, điều này có thể không thuận tiện.
Vì thư viện này đặc biệt hỗ trợ các enum có thể đọc được, nên nó vận chuyển EnumType của riêng mình, mở rộng EnumType của Symfony và sử dụng đại diện con người cho từng trường hợp thay vì tên của chúng.
Sử dụng nó thay vì cái của Symfony
composer require "elao/enum:^2.0"
4FlagBag Form Form
Nếu bạn muốn sử dụng
Suit::Hearts->getReadable[]; // returns 'suit.hearts'4 trong Symfony Forms, hãy sử dụng FlagBagType. Loại này cũng mở rộng Symfony EnumType, nhưng nó biến đổi các giá trị biểu mẫu sang và từ các phiên bản
Suit::Hearts->getReadable[]; // returns 'suit.hearts'4
composer require "elao/enum:^2.0"
5Symfony httpKernel
Giải quyết các đối số của bộ điều khiển từ đường dẫn tuyến đường
Kể từ Symfony 6. 1+, các trường hợp enum được hỗ trợ sẽ được giải quyết từ các tham số đường dẫn tuyến đường
composer require "elao/enum:^2.0"
6➜ Một lệnh gọi tới
Suit::Hearts->getReadable[]; // returns 'suit.hearts'8 sẽ giải quyết đối số
Suit::Hearts->getReadable[]; // returns 'suit.hearts'9 dưới dạng trường hợp
# translations/messages.fr.yaml suit.hearts: 'Coeurs' suit.diamonds: 'Carreaux' suit.clubs: 'Piques' suit.spades: 'Trèfles'0 enum
Nếu bạn chưa sử dụng Symfony HttpKernel 6. 1+, thư viện này sẽ vẫn làm việc này bằng cách đăng ký trình phân giải của chính nó
Giải quyết các đối số của bộ điều khiển từ truy vấn hoặc nội dung
Bạn cũng có thể giải quyết từ tham số truy vấn hoặc từ nội dung yêu cầu
composer require "elao/enum:^2.0"
7➜ Một cuộc gọi đến
# translations/messages.fr.yaml suit.hearts: 'Coeurs' suit.diamonds: 'Carreaux' suit.clubs: 'Piques' suit.spades: 'Trèfles'1 sẽ giải quyết đối số
Suit::Hearts->getReadable[]; // returns 'suit.hearts'9 dưới dạng trường hợp
# translations/messages.fr.yaml suit.hearts: 'Coeurs' suit.diamonds: 'Carreaux' suit.clubs: 'Piques' suit.spades: 'Trèfles'0 enum
Sử dụng
# translations/messages.fr.yaml suit.hearts: 'Coeurs' suit.diamonds: 'Carreaux' suit.clubs: 'Piques' suit.spades: 'Trèfles'4 để giải quyết từ cơ quan yêu cầu [
# translations/messages.fr.yaml suit.hearts: 'Coeurs' suit.diamonds: 'Carreaux' suit.clubs: 'Piques' suit.spades: 'Trèfles'5]
Nó cũng hỗ trợ biến đổi
composer require "elao/enum:^2.0"
8➜ Một cuộc gọi đến
# translations/messages.fr.yaml suit.hearts: 'Coeurs' suit.diamonds: 'Carreaux' suit.clubs: 'Piques' suit.spades: 'Trèfles'6 sẽ giải quyết đối số
# translations/messages.fr.yaml suit.hearts: 'Coeurs' suit.diamonds: 'Carreaux' suit.clubs: 'Piques' suit.spades: 'Trèfles'7 là
# translations/messages.fr.yaml suit.hearts: 'Coeurs' suit.diamonds: 'Carreaux' suit.clubs: 'Piques' suit.spades: 'Trèfles'8
học thuyết
Kể từ
# translations/messages.fr.yaml suit.hearts: 'Coeurs' suit.diamonds: 'Carreaux' suit.clubs: 'Piques' suit.spades: 'Trèfles'9 2. 11, PHP8. 1 loại enum được hỗ trợ nguyên bản
composer require "elao/enum:^2.0"
9Lưu ý . Trừ khi bạn có nhu cầu cụ thể đối với loại DBAL như được mô tả bên dưới, chúng tôi khuyên bạn nên sử dụng tích hợp ORM chính thức cho các enum được hỗ trợ.
Tuy nhiên, PhpEnums cũng cung cấp một số lớp cơ sở để lưu các bảng liệt kê được PHP hỗ trợ trong cơ sở dữ liệu của bạn. Các lớp DBAL tùy chỉnh dành cho các trường hợp sử dụng dành riêng cho thư viện này, chẳng hạn như lưu trữ một hoặc một bộ sưu tập các trường hợp enum được hỗ trợ, đang hoặc cũng sẽ khả dụng
Trong ứng dụng Symfony
Cấu hình này tương đương với các phần sau giải thích cách tạo loại Doctrine DBAL tùy chỉnh
composer require "elao/enum:^2.x-dev"
0Nó thực sự sẽ tạo và đăng ký các lớp kiểu cho bạn, giúp bạn không phải viết mã soạn sẵn này
thủ công
Đọc tài liệu Doctrine DBAL trước
Mở rộng AbstractEnumType
composer require "elao/enum:^2.x-dev"
1Trong mã bootstrapping ứng dụng của bạn
composer require "elao/enum:^2.x-dev"
2Để chuyển trực tiếp loại cơ sở dữ liệu cơ bản của loại "Suit" mới thành một phiên bản của
$enum = Suit::Hearts; $translator->trans[$enum->getReadable[], locale: 'fr']; // returns 'Coeurs'0 khi thực hiện các thao tác lược đồ, loại này cũng phải được đăng ký với nền tảng cơ sở dữ liệu
composer require "elao/enum:^2.x-dev"
3Sau đó, sử dụng nó như một loại cột
composer require "elao/enum:^2.x-dev"
4Xử lý sự cố
Sử dụng các phiên bản enum với QueryBuilder
Khi sử dụng phiên bản enum làm tham số trong truy vấn được thực hiện bằng
$enum = Suit::Hearts; $translator->trans[$enum->getReadable[], locale: 'fr']; // returns 'Coeurs'1 và các loại DBAL được tạo từ gói, loại tham số có thể không được suy ra chính xác
Sử dụng rõ ràng giá trị enum thay vì một phiên bản hoặc chuyển loại DBAL đã đăng ký làm tham số thứ 3 trong
$enum = Suit::Hearts; $translator->trans[$enum->getReadable[], locale: 'fr']; // returns 'Coeurs'2 để cho phép trình tạo truy vấn chuyển đối tượng thành giá trị cơ sở dữ liệu một cách chính xác
I. E, đưa ra
composer require "elao/enum:^2.x-dev"
5Sử dụng một trong các phương pháp sau
composer require "elao/enum:^2.x-dev"
6Học thuyết ODM
Bạn có thể lưu trữ các giá trị liệt kê dưới dạng chuỗi hoặc số nguyên trong cơ sở dữ liệu MongoDB của mình và thao tác chúng dưới dạng đối tượng nhờ các loại ánh xạ tùy chỉnh có trong thư viện này
Trong tương lai gần, các lớp ODM tùy chỉnh cho các trường hợp sử dụng dành riêng cho thư viện này, chẳng hạn như lưu trữ túi cờ hoặc bộ sưu tập các trường hợp enum được hỗ trợ, cũng sẽ được cung cấp
Trong ứng dụng Symfony
Cấu hình này tương đương với các phần sau giải thích cách tạo loại Doctrine ODM tùy chỉnh
composer require "elao/enum:^2.x-dev"
7Nó thực sự sẽ tạo và đăng ký các lớp kiểu cho bạn, giúp bạn không phải viết mã soạn sẵn này
thủ công
Đọc đầu tiên
Mở rộng AbstractEnumType hoặc AbstractCollectionEnumType
composer require "elao/enum:^2.x-dev"
8Trong mã bootstrapping ứng dụng của bạn
composer require "elao/enum:^2.x-dev"
9lập bản đồ
Giờ đây, loại mới có thể được sử dụng khi ánh xạ các trường
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }0
kẻ giả mạo
Thư viện PhpEnums cung cấp một
$enum = Suit::Hearts; $translator->trans[$enum->getReadable[], locale: 'fr']; // returns 'Coeurs'3 faker cho phép chọn các trường hợp enum ngẫu nhiên
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }1
Hàm tạo của nó nhận được ánh xạ của các bí danh kiểu enum làm đối số đầu tiên
namespace App\Enum; use Elao\Enum\ReadableEnumInterface; use Elao\Enum\ReadableEnumTrait; use Elao\Enum\Attribute\EnumCase; enum Suit: string implements ReadableEnumInterface { use ReadableEnumTrait; #[EnumCase['suit.hearts']] case Hearts = '♥︎'; #[EnumCase['suit.diamonds']] case Diamonds = '♦︎'; #[EnumCase['suit.clubs']] case Clubs = '♣︎'; #[EnumCase['suit.spades']] case Spades = '︎♠︎'; }2
Điều này đặc biệt hữu ích khi sử dụng nhà cung cấp này với DSL của Nelmio Alice [xem phần tiếp theo]
Cách sử dụng với Alice
Nếu bạn đang sử dụng gói nelmio/alice và gói của nó để tạo lịch thi đấu, bạn có thể đăng ký nhà cung cấp Faker bằng cách sử dụng
$enum = Suit::Hearts; $translator->trans[$enum->getReadable[], locale: 'fr']; // returns 'Coeurs'4