2015-11-26 4 views
0

Я потерялся в этой ситуации и хотел бы получить некоторые отзывы/советы о том, как это сделать.

Я создаю приложение с поддержкой 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 для обнаружения объектов

ответ

0

«Ваши варианты всегда должны выделять маршруты с опасениями. Если это не имеет значения, приложение сохраняет один маршрут, который делает оба». Я не вижу вашего setPerson или как вы вызываете order.person в угловом (вместе с данными, которые вы передаете)? Вы можете сохранить все в одном маршруте, но убедитесь, что используете правильные методы для выполнения этой работы.

«Приходит проблема. SetPerson на объектах Order ожидает объект Person, но отправляется простой объект с только параметрами. Я мог бы просто пропустить ввод, который не является строкой или целым числом, но что, если я обновил детали в персоне Мне было бы хорошо, если бы человек тоже был обновлен, но я не знаю, как лучше всего это сделать ». Можете ли вы объяснить это больше?

+0

Объект person используется как {{order.getPerson(). NameFirst}} – SvT

+0

Когда данные отправляются на серверный сервер Laravel.Person - это такой объект, как {Id: 6, ContactEmail: "xxx", ContactFacebook: null, ContactPhone: "xxx", ...}. Использование propels $ order-> setPerson() выдает ошибку, так как это ожидает объект Person. – SvT

+0

Справа. У AngularJS нет элементов управления вашим PHP-кодом. Вы отправляете заказ.Персона вместе с методом запроса $ http/$ resource request - будь то post/patch/update? Если ваш PHP-код нуждается в указанном объекте, передайте его. Если ты; затем обработайте запрос соответствующим образом. Я считаю, что есть проблема синхронизации. Не так много, я могу понять, что происходит с вашим PHP-кодом. – Gary

Смежные вопросы