특히 새 프로젝트의 경우 이 라이브러리를 사용하는 것은 더 이상 권장되지 않습니다. PHP 8.1은 기본적으로 열거형을 지원합니다.
#332를 참조하세요.
Laravel을 위한 간단하고 확장 가능하며 강력한 열거형 구현입니다.
클래스 상수로 열거형 키 값 쌍
모든 기능을 갖춘 방법 모음
열거형 인스턴스화
플래그가 지정된/비트별 열거형
유형 힌트
속성 캐스팅
열거형 장인 생성기
열거형 키 또는 값을 입력 매개변수로 전달하기 위한 유효성 검사 규칙
현지화 지원
매크로를 통해 확장 가능
벤 샘슨(Ben Sampson)이 만든 것
가이드
설치
네이티브 PHP 열거형으로 마이그레이션
열거형 라이브러리
기본 사용법
열거형 정의
인스턴스화
인스턴스 속성
인스턴스 캐스팅
인스턴스 평등
유형 힌트
플래그가 지정된/비트별 열거형
속성 캐스팅
마이그레이션
확인
현지화
설명 사용자 정의
클래스 설명 사용자 정의
값 설명 사용자 정의
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은 기본적으로 열거형을 지원합니다. 다음 단계를 사용하여 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
처리하는 try/catch 블록. 네이티브 열거형에서 발생한 ValueError
포착하거나 tryFrom()
사용으로 전환하여 null
처리하세요.
모든 열거형이 변환되면 이 라이브러리에 대한 종속성을 제거할 수 있습니다.
일반적으로 사용되는 커뮤니티 기여 열거형 목록을 찾아 다운로드하세요.
열거형 라이브러리 →
다음 Artisan 명령어를 사용하여 새로운 enum 클래스를 생성할 수 있습니다:
PHP artisan make:enum UserType
이제 열거형이 상수로 가질 수 있는 가능한 값을 추가하기만 하면 됩니다.
<?php 선언(strict_types=1);네임스페이스 AppEnums;사용 BenSampoEnumEnum;최종 클래스 UserType은 Enum을 확장합니다. {const 관리자 = 0;const 중재자 = 1;const 가입자 = 2;const 최고 관리자 = 3; }
그게 다야! 열거형 값은 일반 상수로 정의되므로 다른 클래스 상수처럼 간단히 액세스할 수 있습니다.
UserType::Administrator // 값은 0입니다.
유형 힌트의 이점을 활용하여 함수 간에 열거형을 전달하기 위해 열거형을 인스턴스화하는 것이 유용할 수 있습니다.
또한 잘못된 값으로 열거형을 인스턴스화하는 것은 불가능하므로 전달된 값이 항상 유효하다는 것을 확신할 수 있습니다.
편의를 위해 열거형은 여러 가지 방법으로 인스턴스화할 수 있습니다.
// 원하는 열거형 값을 매개변수로 전달하는 표준 새 PHP 클래스$enumInstance = new UserType(UserType::Administrator);// 생성자와 동일, value로 인스턴스화$enumInstance = UserType::fromValue(UserType::Administrator) ;// 해당 값 대신 열거형 키를 사용합니다.$enumInstance = UserType::fromKey('Administrator');// __callStatic을 활용하여 키 이름을 메서드로 정적으로 호출합니다. Magic$enumInstance = UserType::Administrator();// 주어진 키 또는 값을 사용하여 새 Enum 인스턴스화를 시도합니다. Enum을 인스턴스화할 수 없는 경우 null을 반환합니다.$enumInstance = UserType::coerce($someValue);
IDE가 정적 인스턴스화 도우미를 자동 완성하도록 하려면 artisan 명령을 통해 PHPDoc 주석을 생성할 수 있습니다.
기본적으로 app/Enums
의 모든 Enum에는 주석이 추가됩니다( --folder
에 경로를 전달하여 폴더를 변경할 수 있음).
PHP 장인 열거형:주석 달기
클래스 이름을 지정하여 단일 클래스에 주석을 달 수 있습니다.
php artisan enum:"AppEnumsUserType" 주석 달기
열거형 인스턴스가 있으면 key
, value
및 description
속성으로 액세스할 수 있습니다.
$userType = UserType::fromValue(UserType::SuperAdministrator);$userType->key; // SuperAdministrator$userType->value; // 3$userType->설명; // 최고 관리자
이는 열거형 인스턴스를 블레이드 뷰에 전달하는 경우 특히 유용합니다.
Enum 인스턴스는 __toString()
매직 메서드를 구현할 때 문자열로 캐스팅될 수 있습니다.
이는 또한 예를 들어 블레이드 뷰에 반영될 수 있음을 의미합니다.
$userType = UserType::fromValue(UserType::SuperAdministrator); (문자열) $userType // '3'
인스턴스를 is
메소드에 전달하여 모든 값에 대해 인스턴스의 동일성을 확인할 수 있습니다. 편의상 is
메소드의 정반대인 isNot
메소드도 있습니다.
$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
사용하여 인스턴스 값이 값 배열에 없는지 확인할 수도 있습니다. Iterable도 확인할 수 있습니다.
$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)을 반환합니다. // 거짓을 반환합니다.
표준 열거형은 한 번에 하나의 값을 나타내지만 플래그가 지정되거나 비트별 열거형은 여러 값을 동시에 나타낼 수 있습니다. 이는 제한된 옵션 세트의 여러 선택을 표현하려는 경우에 적합합니다. 이에 대한 좋은 예는 가능한 권한 수가 제한되어 있지만 사용자가 권한 중 일부 또는 전부를 가질 수 없는 사용자 권한입니다.
다음 artisan 명령을 사용하여 플래그가 지정된 열거형을 생성할 수 있습니다:
php artisan make:enum UserPermissions --flagged
값을 정의할 때 2의 거듭제곱을 사용해야 합니다. 이를 수행하는 가장 쉬운 방법은 다음과 같이 왼쪽으로 이동 <<
연산자를 사용하는 것입니다.
최종 클래스 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;// Shortcutsconst Member = self::ReadComments | self::댓글 쓰기; // 읽고 쓰기.const Moderator = self::Member | 자기::편집설명; // 회원이 가진 모든 권한과 Edit.const Admin = self::Moderator | self::DeleteComments; // 중재자가 갖는 모든 권한과 삭제 권한입니다.}
플래그가 지정된 열거형을 인스턴스화하는 방법에는 두 가지가 있습니다.
// 원하는 열거형 값을 값 배열 또는 열거형 인스턴스 배열로 전달하는 표준 새 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::EditComments()]);
속성 캐스팅은 단일 값 열거형과 동일한 방식으로 작동합니다.
플래그가 지정된 열거형에는 값이 전혀 포함될 수 없습니다. 플래그가 지정된 모든 열거형에는 0
과 비교할 수 있는 None
이라는 미리 정의된 상수가 있습니다.
UserPermissions::flags([])->value === UserPermissions::None; // 진실
표준 열거형 메서드 외에도 플래그가 지정된 열거형에 사용할 수 있는 유용한 메서드 모음이 있습니다.
참고: 정적 속성이 전달되는 모든 곳에서 열거형 인스턴스를 전달할 수도 있습니다.
열거형의 플래그를 주어진 플래그 배열로 설정합니다.
$permissions = UserPermissions::flags([UserPermissions::ReadComments]);$permissions->flags([UserPermissions::EditComments, UserPermissions::DeleteComments]); // 이제 플래그는 EditComments, 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(); // 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]); // 이제 플래그는 다음과 같습니다: EditComments.
열거형에서 모든 플래그를 제거합니다.
$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(); // 참;$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 값을 가져올 때 속성을 enum 인스턴스로 캐스팅하고 다시 enum 값으로 되돌립니다. Enum::class
Castable
계약을 구현하므로 열거형의 클래스 이름만 지정하면 됩니다.
BenSampoEnumTestsEnumsUserType 사용; IlluminateDatabaseEloquentModel 사용; 클래스 예제 확장 모델 {protected $casts = ['random_flag' => 'boolean', // 표준 라라벨 캐스트'user_type' => UserType::class, // 열거형 캐스트 예시]; }
이제 Example
모델의 user_type
속성에 액세스하면 기본 값이 UserType
열거형으로 반환됩니다.
$example = 예::first();$example->user_type // UserType의 인스턴스
속성 캐스팅을 최대한 활용하려면 열거형 인스턴스에서 사용할 수 있는 메서드와 속성을 검토하세요.
열거형 값이나 다른 열거형 인스턴스를 전달하여 값을 설정할 수 있습니다.
$example = 예::first();// 열거형 값을 사용하여 설정$example->user_type = UserType::Moderator;// 열거형을 사용하여 설정 인스턴스$example->user_type = UserType::Moderator();
$model->toArray()
동작 사용자 정의 toArray
사용하는 경우(또는 컨트롤러에서 응답으로 모델/모델을 반환하는 경우) Laravel은 enum 인스턴스에서 toArray
메서드를 호출합니다.
기본적으로 이는 기본 유형의 값만 반환합니다. 예를 들어 자바스크립트 앱으로 돌아가기 위해 다른 속성(키, 설명)에 액세스할 수도 있습니다.
이 동작을 사용자 정의하려면 enum 인스턴스에서 toArray
메서드를 재정의하면 됩니다.
// 예시 Enumfinal 클래스 UserType은 Enum을 확장합니다. {const 관리자 = 0;const 중재자 = 1; }$instance = UserType::Moderator();// 기본 공개 함수 toArray() {return $this->값; }// int(1)를 반환합니다.// 모든 속성을 반환합니다. public 함수 toArray() {$this를 반환; }// 모든 속성의 배열을 반환합니다.// array(3) {// ["value"]=>// int(1)"// ["key"]=>// string(9) "MODERATOR "// ["설명"]=>// string(9) "운영자"// }
많은 데이터베이스는 모든 것을 문자열로 반환합니다. 예를 들어 정수는 문자열 '1'
로 반환될 수 있습니다. 라이브러리 사용자의 마찰을 줄이기 위해 유형 강제를 사용하여 의도한 값을 파악합니다. 이를 제어하려면 열거형 클래스의 parseDatabase
정적 메서드를 재정의할 수 있습니다.
최종 클래스 UserType은 Enum을 확장합니다. {const 관리자 = 0;const 중재자 = 1;public 정적 함수 parseDatabase($value) {반환(정수) $값; } }
parseDatabase
메소드에서 null
반환하면 모델의 속성도 null
이 됩니다. 이는 데이터베이스가 NULL
대신 빈 문자열과 같은 일관되지 않은 공백 값을 저장하는 경우 유용할 수 있습니다.
모델의 속성을 열거형으로 캐스팅하는 경우 laravel-ide-helper 패키지를 사용하여 속성 문서 블록을 자동으로 생성할 수 있습니다.
열거형은 코드 수준에서 일관성을 강화하기 때문에 데이터베이스 수준에서 일관성을 다시 수행할 필요가 없습니다. 따라서 권장되는 데이터베이스 열 유형은 열거형 값에 따라 string
또는 int
입니다. 이는 데이터베이스 계층에 대해 걱정하지 않고 코드에서 열거형 값을 추가/제거할 수 있음을 의미합니다.
AppEnumsUserType 사용;IlluminateSupportFacadesSchema 사용;IlluminateDatabaseSchemaBlueprint 사용;IlluminateDatabaseMigrationsMigration 사용;클래스 CreateUsersTable은 마이그레이션 확장 {/** * 마이그레이션을 실행합니다. * * @return void */public 함수 up(): void{ 스키마::table('users', 함수 (Blueprint $table): void {$table->bigIncrements('id');$table->timestamps();$table->string('type') ->default(UserType::Moderator); }); } }
enum
유형 사용 또는 마이그레이션에서 Enum
클래스를 사용하여 enum 열을 정의할 수도 있습니다. 열거형 값은 문자열로 정의되어야 합니다.
AppEnumsUserType 사용;IlluminateSupportFacadesSchema 사용;IlluminateDatabaseSchemaBlueprint 사용;IlluminateDatabaseMigrationsMigration 사용;클래스 CreateUsersTable은 마이그레이션 확장 {/** * 마이그레이션을 실행합니다. * * @return void */public 함수 up(): void{ 스키마::table('users', 함수 (Blueprint $table): void {$table->bigIncrements('id');$table->timestamps();$table->enum('type', UserType:: getValues()) ->default(UserType::Moderator); }); } }
EnumValue
규칙을 사용하여 컨트롤러에 전달된 열거형 값이 주어진 열거형에 대해 유효한 값인지 확인할 수 있습니다.
BenSampoEnumRulesEnumValue 사용;공용 함수 저장소(요청 $request) {$this->validate($request, ['user_type' => ['필수', new EnumValue(UserType::class)], ]); }
기본적으로 유형 검사는 엄격으로 설정되어 있지만 EnumValue 클래스의 선택적인 두 번째 매개 변수에 false
전달하면 이를 무시할 수 있습니다.
new EnumValue(UserType::class, false) // 엄격한 유형 검사를 끕니다.
EnumKey
규칙을 사용하여 키의 유효성을 검사할 수도 있습니다. 예를 들어 정렬 또는 필터링을 위해 열거형 키를 URL 매개변수로 사용하는 경우 유용합니다.
BenSampoEnumRulesEnumKey 사용;공용 함수 저장소(요청 $request) {$this->validate($request, ['user_type' => ['필수', 새로운 <span class="pl-v"