我一直在Doctrine 2中将值对象实现为自定义DBAL类型,并且它一直正常工作.但是我一直想知道这是不是最好的方法.我已经考虑过使用Post Load监听器来实例化Value Objects.同时在请求时通过Entity访问器实例化它们,后者的优点是我不会实例化比我需要的更多的对象.
我的问题是:哪种方法最好?或者有更好的方法吗?以上是否有任何陷阱或不合理的表现?
我有以下型号:
Ext.define('Gst.model.Order', {
extend: 'Ext.data.Model',
idProperty: 'id',
fields: [
{ name: 'id', type: 'string' }
]
});
Run Code Online (Sandbox Code Playgroud)
我的问题是订单模型的ID是用户定义的.因此,创建新订单实例并将其插入订单商店的代码将是:
order = Ext.create('Gst.model.Order', {'id': 'someuserdefinedvalue'});
store.insert(0, order);
Run Code Online (Sandbox Code Playgroud)
发生的情况是因为idProperty由用户提供,然后订单没有标记为幻像,因此不被视为脏.因此,没有向服务器发出POST.如果我手动将订单设置为幻像和脏,那么当我将订单插入商店时,我可以触发POST,如:
order = Ext.create('Gst.model.Order', {'id': 'someuserdefinedID'});
order.phantom = true;
order.setDirty();
store.insert(0, order);
Run Code Online (Sandbox Code Playgroud)
这样会很好,但是我的服务器端代码使用REST控制器并且期望POST不具有和在URL中的id.因此,虽然请求extJS问题是
POST http://app.local/api/order/someuserdefinedID.json
Run Code Online (Sandbox Code Playgroud)
虽然我的服务器寻找的格式是
POST http://app.local/api/order.json
Run Code Online (Sandbox Code Playgroud)
因此,解决这个问题的唯一方法就是创建一个订单并设置phantom = true并调用setDirty().这将导致发出POST,然后在我的RestProxy中覆盖buildUrl:使用逻辑来测试POST请求并从url中删除idProperty.
这对我来说似乎是一个丑陋的工作,并想知道是否有更好的方法?
我想我的问题是:处理这样的事情的最佳方法是什么?