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

#[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"
3

sử dụng giá trị trường hợp [chỉ dành cho enum được hỗ trợ chuỗi]

composer require "elao/enum:^2.0"
4

Giá 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"
7

Truy 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"
0

hoặc tạo giao diện/đặc điểm của riêng bạn

composer require "elao/enum:^2.0"
1

cờ 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"
2

Mỗ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"
3

Do đó, 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"
4

FlagBag 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"
5

Symfony 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"
9

Lư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"
0

Nó 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"
1

Trong 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"
3

Sau đó, sử dụng nó như một loại cột

composer require "elao/enum:^2.x-dev"
4

Xử 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"
5

Sử dụng một trong các phương pháp sau

composer require "elao/enum:^2.x-dev"
6

Họ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"
7

Nó 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"
8

Trong mã bootstrapping ứng dụng của bạn

composer require "elao/enum:^2.x-dev"
9

lậ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

Chủ Đề