Gre*_*reg 23 php inheritance doctrine doctrine-orm
我有一个定义继承的实体,如下所示:
* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap({"text" = "TextAttribute", "boolean" = "BooleanAttribute", "numeric" = "NumericAttribute", "date" = "DateAttribute"})
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能为田地'类型'吸气?我知道我可以使用instanceof(在大多数情况下这就是我正在做的事情)但是很少有场景,$ item-> getType()会让我的生活变得如此简单.
xPh*_*eRe 18
扩展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;
}
}
Run Code Online (Sandbox Code Playgroud)
ByS*_*pts 14
我就是这样做的.
首先,你做了一个AttributeInterface,以确保所有未来的新属性类型都将实现need方法:
interface AttributeInterface
{
/**
* Return the attribute type
*/
public function getType();
}
Run Code Online (Sandbox Code Playgroud)
然后创建Attribute实现AttributeInterface接口的抽象类.
使用@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';
}
Run Code Online (Sandbox Code Playgroud)
最后,您将创建所有需要的类,扩展Attribute类并实现该getType()方法
/**
* 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...
Run Code Online (Sandbox Code Playgroud)
Lak*_*ula 11
可以使用EntityManager或使用DocumentManager.
$documentManager->getClassMetadata(get_class($entity))->discriminatorValue;
Run Code Online (Sandbox Code Playgroud)
我的方法是通过元数据原则生成简单地访问它的价值
$cmf = $em->getMetadataFactory();
$meta = $cmf->getMetadataFor($class);
$meta->discriminatorValue
Run Code Online (Sandbox Code Playgroud)
会给你价值,所以作为一种方法
public static function get_type()
{
//...get the $em instance
$cmf = $em->getMetadataFactory();
$meta = $cmf->getMetadataFor(__CLASS__);
return $meta->discriminatorValue;
}
Run Code Online (Sandbox Code Playgroud)
我将元数据缓存在扩展我的基本实体的每个类的静态变量中,其中还有很多其他有用的信息......