【发布时间】:2016-02-29 17:49:29
【问题描述】:
我在这种情况下迷路了,希望收到一些关于如何做到这一点的反馈/建议。
我正在构建一个带有 Laravel 5.1 后端和 AngularJS 前端的应用程序。两者对我来说都是新的,但到目前为止我都很喜欢它们。对于我的数据库通信,我使用的是 Propel 2。
所以我在 Laravel 中使用 Propel 设置了我的 Order 对象,它工作正常。为了在 Angular 中使用这个模型,我创建了一个资源工厂。
angular.module('flex')
.factory('Order', ['$resource', 'Address', 'Person', function($resource, Address, Person)
{
var Order = $resource('/restful/shop/order/:id', {id: '@id'}, {
query: {
method: 'GET',
isArray: true,
transformResponse: function(data, header)
{
var jsonData = angular.fromJson(data);
var orders = [];
angular.forEach(jsonData, function(item)
{
var order = new Order(item);
orders.push(order);
});
return orders;
}
},
update: {
method: 'PUT',
params: {id: '@Id'},
}
});
Order.prototype.Person = null;
Order.prototype.getAddresses = function() {};
Order.prototype.getOrderProducts = function() {};
Order.prototype.getPayments = function() {};
Order.prototype.getPerson = function()
{
if (this.Person != null)
return this.Person;
var OrderObject = this;
this.Person = {};
Person.get({id: this.PersonId}, function (response)
{
OrderObject.Person = response;
});
return this.Person;
};
Order.prototype.getShippingAddress = function() {};
return Order;
}])
你可以看到这个资源有一个函数 getPerson() 从另一个资源工厂加载一个人对象。
angular.module('flex')
.factory('Person', function($resource)
{
var Person = $resource('/restful/common/person/:id', {id: '@id'}, {
query: {
method: 'GET',
isArray: true,
transformResponse: function(data, header)
{
var jsonData = angular.fromJson(data);
var persons = [];
angular.forEach(jsonData, function(item)
{
var person = new Person(item);
persons.push(person);
});
console.log(persons);
return persons;
}
}
});
return Person;
})
到目前为止,一切都很好。我可以加载和显示我的订单并使用此加载人员对象,还可以显示来自此对象的数据。
当我想存储更新时,问题就来了。如果我调用 Order.$update() ,则会向我的 Laravel 更新操作发出 put 请求。
public function update($id, Request $request)
{
// Check for orderI
// Load order
$order = OrderQuery::create()
->findPk($id);
// Iterate data
foreach ($request->all() as $key => $value)
{
echo 'set' . $key . "\n";
$order->{'set' . $key}($value);
}
// Save object
$order->save();
}
问题来了。 Order 对象上的 setPerson 需要一个 Person 对象,但会发送一个仅包含参数的简单对象。我可以跳过不是字符串或整数的输入,但是如果我也更新了该人的详细信息会怎样。如果 Person 也能更新,我会很好,但我不知道最好的方法是什么。
我的选择,但我希望有更好的方法:
- 在 Angular 端编写自定义保存函数
- 扩展 Laravel 更新操作以检测对象
【问题讨论】:
标签: php angularjs laravel-5.1 propel ngresource