我遇到了一个问题,它也可能放在programmers.stackexchange.com上,但由于它与Doctrine和ZF2相关联,所以我选择了放置它在这。让我向您介绍我的场景:如何为不同的实体类别处理不同的实体属性
- 我有一个应用程序,其中用户发布实体(
BaseEntity
)。 - 的
BaseEntity
拥有财产$cagetory
- 根据
$category
但是实体必须有额外的属性
抗体简单的例子:
class BaseEntity {
protected $id;
protected $title;
protected $description;
}
class MovieEntity {
protected $id;
protected $title;
protected $description;
protected $airingDateStart; // new property
protected $airingDateEnd; // new property
}
现在,我可以很容易地做一个两步的表现公式用户首先选择他的类别,并根据该EntityClass将被选中 - 但我不能这样做。但是这并不好,因为如果用户在BaseEntity
类别中放置了电影,然后又想要将实体更改为MovieEntity
?所以这个想法并不是一个安全的选择。
附加要求(使东西更复杂)
- 的类别以及各实体由教义来控制
- 每个
Category
经由单个Module
- 提供给应用模块需要放在应用程序中,而不需要太多配置(最多一个DB-Query填充
CategoryTable
)
我做了迄今为止
起初我选择了与教义功能单表继承运行。这使我可以轻松完成诸如MovieEntity extends BaseEntity
之类的事情,而且事情就像是将新实体添加到数据库中的魅力一样。但主要问题仍然存在:如果用户改变了Category,它会改变EntityClass,这几乎是No-Go。
我的意思是说,我可以用我目前的方式做事情,并根据类别的变化手动修改DiscriminatorColumn
,但那太诡异了。
另一种替代方法是,在改变类别的事件时,将创建一个新实体并且旧实体将被销毁,但是这也感觉有点肮脏。
总而言之,我认为我走向了错误的方向。可能有一种我不知道的发展模式,使我所有的努力工作看起来像是浪费,结果事情变得超级容易,但看起来我忽略了一些东西。
为了可能得到的是什么我为更紧密的想法,你可以看看我在GitHub上的应用程序:
- DuitMarketplace - 这是一个基类的主要应用,所有的控制器等...
ItemController#editAction()
可能会提供一些关于我打算如何自动完成一些事情的线索。 - DuitMarketplaceItemVehicle - 那得到的一类提前投进mainapp
感谢所有反馈我可能会。我完全意识到,这个问题可能是SO与程序员之间存在的边界.stackexchange,但我选择在这里。
嘿蒂姆,感谢您的意见,设计看起来比我迄今为止在我的应用程序中做得更清楚,所以感谢您的意见。我看到的问题(虽然我可能是错的)仍然是一个类别的变化。当您选择不同的类别时,您的示例是否会自动更新“实体”内的'discriminatorColumn'?我一定会测试一下! PS:从某些模块扩展DiscriminatorMapping:参见[SubModule的myBootstrap()](https://github.com/manuakasam/DuitMarketplaceItemVehicle/blob/master/Module.php#L35-L48) – Sam
Sam,I don不这么认为,只有一件“事情”(或“基本实体”)。那些与'MovieEntity'不同的'BaseEntity'已经被移到了不同的类别中。我在timdev的解决方案中缺少的是如何存储由“Thing”类别定义的那些属性的值。需要一个'ThingCategoryProperty'实体,它具有与'Thing'和'Category'的ManyToOne关联。顺便说一句,我喜欢你解决DiscriminatorMapping动态内容的方式! – netiul
@Sam - 不,当您更改类别时,您将删除一个ThingSomeCategory并插入其他一些ThingSomeCategory。 – timdev