everlutionsk / enum-bundle
使用 Symfony 和 Doctrine 集成的 PHP 枚举
v1.1.0
2017-11-30 11:40 UTC
Requires
- php: >=7.1
- doctrine/dbal: ^2.6
- doctrine/doctrine-bundle: ^1.7
- doctrine/orm: ^2.5
- symfony/form: ^3
This package is auto-updated.
Last update: 2024-08-26 21:27:49 UTC
README
使用 Symfony 和 Doctrine 集成的 PHP 枚举。
允许编写更简洁、面向对象的 SRP 代码。
安装
composer require everlutionsk/enum-bundle
$bundles = [ new Everlution\EnumBundle\EnumBundle(), ]
实现
创建新的枚举
<?php // always use final final class Gender extends Enum { const MALE = 1; const FEMALE = 2; const OTHER = 3; public static function getChoices(): array { // 'string represtation' => self::constant return [ 'gender.male' => self::MALE, 'gender.female' => self::FEMALE, 'gender.other' => self::OTHER, ]; } // following is optional public function isMale(): bool { return $this->isValue(self::MALE); } public function isFemale(): bool { return $this->isValue(self::FEMALE); } }
使用它!
PHP
<?php $male = new Gender(Gender::MALE); var_dump($male->isMale()); // bool(true) var_dump($male->isSameAs(new Gender(Gender::FEMALE))); // bool(false) var_dump($male->isValue(Gender::FEMALE)); // bool(false) echo $male->getValue(); // Gender::MALE echo $male->getLabel(); // 'gender.male' echo $male; // 'gender.male' (has __toString() implemented)
Twig
{{ gender|trans }}
将枚举映射到数据库
在您的应用中,创建一个名为 正好 为 enum.db_map
的服务,并使其实现 EnumDBMapInterface
。
使用纯 PHP 进行配置非常适合重构。
<?php /** * Class EnumDBMap. * * @author Richard Popelis <richard@popelis.sk> */ class EnumDBMap implements EnumDBMapInterface { public function getMap(): array { return [ 'enum_gender' => Gender::class, // 'enum_visibility' => Visibility::class, // and so on ]; } }
在实体中使用枚举
class User { /** * @var Gender * @ORM\Column(type="enum_gender") */ private $gender; /** * @return Gender */ public function getGender(): ?Gender { return $this->gender; } /** * @param Gender $gender * @return User */ public function setGender(?Gender $gender): self { $this->gender = $gender; return $this; } } ## usage $user = new User; $user->setGender(new Gender(Gender::MALE));
无缝地在表单中使用枚举
class UserType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('gender', EnumChoiceType::class, [ 'enum_class' => Gender::class, // optional blacklisting: remove OTHER from form field choices 'enum_blacklist' => [Gender::OTHER], // optional whitelisting: show only specified values 'enum_whitelist' => [Gender::MALE, Gender::FEMALE], ]); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => User::class, ]); } }
不需要显式声明 DataTransformer。它已经内置在表单类型中。
还提供了 EnumRadioType
。
快乐的枚举时光!