Я потерялся в этой ситуации и хотел бы получить некоторые отзывы/советы о том, как это сделать.
Я создаю приложение с поддержкой Laravel 5.1 back-en и интерфейсом AngularJS. Оба новы для меня, но я их до сих пор люблю. Для моей связи с базой данных я использую Propel 2.
Итак, я получил свой объект Order в настройке Laravel с Propel, который отлично работает. Чтобы использовать эту модель в 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(), которая загружает объект person из другой фабрики ресурсов.
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;
})
До сих пор все отлично работает. Я могу загрузить и отобразить мои заказы и загрузить объект человека с этим, а также отобразить данные с этого объекта.
Проблема возникает, когда я хочу хранить обновления. Если я вызываю «Заказ». $ Update(), запрос на отправку делается в мое действие обновления Laravel.
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();
}
Приходит проблема. setPerson на объектах Order ожидает объект Person, но отправляется простой объект с только параметрами. Я мог бы просто пропустить ввод, который не является строкой или целым числом, но что, если я обновляю детали и у человека. Мне было бы хорошо, если бы человек тоже был обновлен, но я не знаю, как лучше всего это сделать.
Моих вариантов, но я надеюсь, что есть лучший способ:
- Напишите обычай функции сохранения на угловой стороне
- Продлить действие обновления Laravel для обнаружения объектов
Объект person используется как {{order.getPerson(). NameFirst}} – SvT
Когда данные отправляются на серверный сервер Laravel.Person - это такой объект, как {Id: 6, ContactEmail: "xxx", ContactFacebook: null, ContactPhone: "xxx", ...}. Использование propels $ order-> setPerson() выдает ошибку, так как это ожидает объект Person. – SvT
Справа. У AngularJS нет элементов управления вашим PHP-кодом. Вы отправляете заказ.Персона вместе с методом запроса $ http/$ resource request - будь то post/patch/update? Если ваш PHP-код нуждается в указанном объекте, передайте его. Если ты; затем обработайте запрос соответствующим образом. Я считаю, что есть проблема синхронизации. Не так много, я могу понять, что происходит с вашим PHP-кодом. – Gary