您可以使用documentation 中建议的解决方案2 中的方法,而不是尝试获取元数据。您可以为您的枚举创建一个类型。我使用getValues() 方法扩展了抽象EnumType 并创建了您的枚举类EnumJobStatusType(请注意,name 属性是您的实体的相关类型)。
通过这种方式,您只需调用以下命令即可获取您的值,并通过为您的值使用常量,您可以轻松且省钱地设置您的状态:
<?php
// fetching the possible values
$enum = new \MyProject\DBAL\EnumJobStatusType();
$values = $enum->getValues();
//setting the active status
$job->setStatus(\MyProject\DBAL\EnumJobStatusType::ACTIVE);
您的具有自定义类型“enumjobstatus”的实体类:
<?php
/** @Entity */
class Job
{
/**
* @Column(type="enumjobstatus")
**/
private $status;
}
带有扩展getValues()方法的抽象枚举类型类:
<?php
namespace MyProject\DBAL;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
abstract class EnumType extends Type
{
protected $name;
protected $values = array();
public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
$values = array_map(function($val) { return "'".$val."'"; }, $this->values);
return "ENUM(".implode(", ", $values).") COMMENT '(DC2Type:".$this->name.")'";
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (!in_array($value, $this->values)) {
throw new \InvalidArgumentException("Invalid '".$this->name."' value.");
}
return $value;
}
public function getName()
{
return $this->name;
}
public function getValues() {
return $this->values;
}
}
作业状态枚举类型:
<?php
namespace MyProject\DBAL;
class EnumJobStatusType extends EnumType
{
const ACTIVE = 'active';
const FINISHED = 'finished';
const CANCELLED = 'cancelled';
protected $name = 'enumjobstatus';
protected $values = array(self::ACTIVE, self::FINISHED, self::CANCELLED);
}
请注意,您需要向
注册您的类型
Type::addType('enumjobstatus', 'MyProject\DBAL\EnumJobStatusType');