I have an entity which defines inheritance like this:
* @DiscriminatorColumn(name="type", type="string") * @DiscriminatorMap({"text" = "TextAttribute", "boolean" = "BooleanAttribute", "numeric" = "NumericAttribute", "date" = "DateAttribute"})
I am wondering is it possible to have getter for field 'type'? I know I can use instanceof (and in most cases this is what I'm doing) but there are few scenarios where $item->getType() would make my life so much easier.
Extending what beberlei said, you could declare some constants in the Attribute class, and an abstract getType()
function. Then, overload it in every derived attribute class.
Something like:
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; } }
Here is how I'd do.
First, you made an AttributeInterface
, to be sure that all future new Attribute types will implement the need method :
interface AttributeInterface { /** * Return the attribute type */ public function getType(); }
Then you create the Attribute
abstract class implementing the AttributeInterface
interface.
Use the constants in the @DiscrimatorMap
call for some consistency
/** * 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'; }
Finally, you create all needed classes, extending Attribute
class and implementing the getType()
method
/** * 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...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With