我可以在学说2中从php访问鉴别器字段吗?

2022-08-30 14:09:28

我有一个实体,它像这样定义继承:

* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap({"text" = "TextAttribute", "boolean" = "BooleanAttribute", "numeric" = "NumericAttribute", "date" = "DateAttribute"})

我想知道是否有可能为字段“类型”获取器?我知道我可以使用 instanceof(在大多数情况下,这就是我正在做的事情),但是在少数情况下,$item->getType() 会让我的生活变得如此轻松。


答案 1

扩展beberlei所说的,你可以在 Attribute 类和一个抽象函数中声明一些常量。然后,在每个派生属性类中重载它。getType()

像这样:

abstract class Attribute {
    const TYPE_BOOL = 0;
    const TYPE_INT  = 1;
    ...
    abstract public function getType();
}

class BooleanAttribute extends Attribute {
    public function getType() {
        return parent::TYPE_BOOL;
    }
}

答案 2

这就是我的做法。

首先,您创建了一个 ,以确保将来所有新的属性类型都将实现 need 方法:AttributeInterface

interface AttributeInterface
{
    /**
     * Return the attribute type
     */
    public function getType();
}

然后创建实现接口的抽象类。AttributeAttributeInterface

使用调用中的常量以获得一些一致性@DiscrimatorMap

/**
 * Attribute
 * ...
 * @DiscriminatorColumn(name="type", type="string")
 * @DiscriminatorMap({Attribute::TYPE_TEXT = "TextAttribute", Attribute::TYPE_BOOLEAN = "BooleanAttribute", Attribute::TYPE_NUMERIC = "NumericAttribute", Attribute::TYPE_DATE = "DateAttribute"})
 */
abstract class Attribute implements AttributeInterface
{
    const TYPE_TEXT    = 'text';
    const TYPE_BOOLEAN = 'boolean';
    const TYPE_NUMERIC = 'numeric';
    const TYPE_DATE    = 'date';
}

最后,创建所有需要的类,扩展类并实现方法AttributegetType()

/**
 * TextAttribute
 *
 * @ORM\Entity
 */
class TextAttribute extends Attribute
{
    public function getType()
    {
        return $this::TYPE_TEXT;
    }
}

/**
 * BooleanAttribute
 *
 * @ORM\Entity
 */
class BooleanAttribute extends Attribute
{
    public function getType()
    {
        return $this::TYPE_BOOLEAN;
    }
}

/**
 * NumericAttribute
 *
 * @ORM\Entity
 */
class  NumericAttribute extends Attribute
{
    public function getType()
    {
        return $this::TYPE_NUMERIC;
    }
}

/**
 * DateAttribute
 *
 * @ORM\Entity
 */
class DateAttribute extends Attribute
{
    public function getType()
    {
        return $this::TYPE_DATE;
    }
}

// And so on...

推荐