PHP enum động
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 Show #[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.
Cài đặtcomposer 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 đượcCá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 địnhLà 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ổ sungCá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ờ enumsBả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ợpBiểu mẫu SymfonySymfony đã 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. 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. Sử dụng nó thay vì cái của Symfony composer require "elao/enum:^2.0" 4FlagBag Form FormNế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 httpKernelGiải quyết các đối số của bộ điều khiển từ đường dẫn tuyến đườngKể 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 dungBạ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ếtKể 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" 9
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 SymfonyCấ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 QueryBuilderKhi 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 ODMBạ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 SymfonyCấ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ạoThư 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 AliceNế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 |