Intereting Posts
Preg_split по запятой, игнорировать скобки, PHP Символ пробела SQL LIKE База данных в CSV (Готово) пытается сохранить файл в папку на сервере OpenSSL «Печать» в C (или через оболочку) Использование Facebook PHP-SDK 3.x для регистрации / входа пользователя с помощью Codeigniter 2.1.0 WordPress, как я могу получить дополнительные сообщения AJAX PHP, как открыть страницу1, перенаправить на страницу2 и показать страницу1 в div dom? PHP-SQL: загруженное изображение, отображаемое как нежелательный текст Как считывается массив в цикле foreach PHP? Сравнение элементов в многомерном массиве Красноречивое соединение / отсоединение / синхронизация срабатывает в любом случае? Производительность PHP multi cURL хуже, чем последовательная file_get_contents Опубликовать фотографию на стене facebook Автозаполнение для ZF2 просмотр помощников в PhpStorm Как получить следующий идентификатор автоматического инкремента в таблице mysql?

BreezeJS на Durandal с PHP REST API (Laravel)

Я пишу СПА в Дюрандале 2.1. Все идет нормально. Тем не менее, у меня большие трудности с выбором правильной библиотеки Data Persistence для связи с моим REST API PHP (Laravel).

Библиотека номер один для Durandal – BreezeJS. Говорят, что он поддерживает API без рамки OData / ASP.NET Entity. Я искал много дней, но я не могу найти достойный ресурс, рассказывающий мне, как использовать BreezeJS с моим базовым API REST PHP.

Список пожеланий выглядит следующим образом:

  • Сохранять данные между видами
  • Проверка моделей
  • Отслеживание состояния (aka isDirty / cancelChanges)
  • GET / POST / PUT / DELETE с использованием вызовов REST API (в случае PUT, отправлять только грязные вещи)

API REST выглядит следующим образом. Я буду использовать структуру Contact + Address + Country Model, чтобы объяснить, как работает мой API.

  • Связаться со многими адресами
  • Адрес принадлежит Стране aka Страна имеет-много Адрес

Следующий запрос GET:

GET /api/v1/contacts + Payload: { append_addresses : 1, // add addresses as nested data append_addresses_country : 1, // add country as nested data of addresses stack : 2, // return no more than 2 contacts (eg for pagination) page : 1, // return the first page (so the first 2 contacts) count : 1 // return the total number of existing contacts } 

Возвращает следующий результат:

 { "total": 100, "data": [ { "id": 1, "name": "Turner PLC", "addresses": [ { "id" : 214, "country_id" : 1, "city" : "North Jason", "country" : { "id" : 1, "name" : "Canada" } }, { "id" : 203, "country_id" : 2, "city" : "West Lafayette", "country" : { "id" : 2, "name" : "The Netherlands" } } ] } ] } 

API поддерживает два способа использования POST / PUT:

  1. POST / PUT в той же структуре, что и выше, в атрибуте "data". Основываясь на id модели, бэкэнд решит, нужно ли ему создавать ИЛИ обновлять модель. Бэкэнд также автоматически определяет, нужно ли создавать / обновлять / удалять отношения на основе поставляемой полезной нагрузки. Довольно круто, да? 🙂

  2. POST / api / v1 / entity …

… со следующей полезной нагрузкой:

 [ { "type" : "Contact", "data" : { "id" : null, // Will create a new Contact "name" : "Malaysia" } }, { "type" : "Contact", "data" : { "id" : 1, // Will update existing Contact "name" : "Turner Example" } }, { "type" : "Address", "data" : { "id" : 203, // Will update existing Address "city" : "South Jason", "contacts_id" : [1,3,5] // Will set/update the many-to-many relationship between Address ID 203 and Contact ID 1, 3 and 5 } } ] 

Итак, теперь у меня есть вопросы:

  1. Можно ли это сделать в BreezeJS или я должен рассмотреть альтернативу, такую ​​как JayData или Waterline?

  2. BreezeJS, похоже, настаивает на использовании запроса типа синтаксиса. Я пропустил его цель или это бесполезно? Если да, можно ли опустить запрос как синтаксис и по-прежнему использовать BreezeJS или альтернативу?

  3. Как BreezeJS (или альтернатива) имеет дело с hasOne, hasMany, принадлежит и принадлежит для многих и полиморфных отношений?

  4. Существует ли «начало работы» для подобного использования, как у меня? Я много читал о BreezeJS и его альтернативах, но части головоломки еще не собрались мне в голову. Другими словами, я полностью потерян.

Существует множество примеров на http://www.breezejs.com/samples, которые показывают использование Breeze.js без EF и OData. Выберите свой вкус, я бы рекомендовал Zza, Intro для SPA (Ruby), Edmunds или ESPN. Все они используют клиентские метаданные из того, что я помню.

Что касается данных POSTing, не стесняйтесь либо настраивать адаптер AJAX, используя что-то вроде http://www.breezejs.com/documentation/breezeajaxpostjs, которое позволяет получать данные POSTing, а Breeze все равно будет интерпретировать результаты как объекты, если они находятся в правильной структуре JSON или вы всегда можете либо расширить текущий адаптер AJAX Breeze с вашими дополнительными дополнениями, либо просто использовать старые старые звонки AJAX. Это действительно неважно.

Имейте в виду, что Breeze не предпочитает, как вы получаете / устанавливаете свои данные только в том случае, если вы это сделаете, и обновите объекты, которые он кэшировал с результатами. Чтобы конкретно ответить на ваши вопросы –

  1. Можно ли это сделать в BreezeJS или я должен рассмотреть альтернативу, такую ​​как JayData или Waterline? Должен ли я использовать то или это? – Нелегкий вопрос. Всегда выбирайте лучший инструмент для работы.

  2. BreezeJS, похоже, настаивает на использовании запроса типа синтаксиса. Я пропустил его цель или это бесполезно? Если да, можно ли опустить запрос как синтаксис и по-прежнему использовать BreezeJS или альтернативу? По умолчанию Breeze использует синтаксис в запросах, поскольку адаптер по умолчанию – это WebAPI. Не стесняйтесь использовать метод .withParameters() для создания собственных тел запроса.

  3. Как BreezeJS (или альтернатива) имеет дело с hasOne, hasMany, принадлежит и принадлежит для многих и полиморфных отношений? Бриз поддерживает все отношения и типы, за исключением многих-ко-многим. Однако отношения «многие ко многим» могут поддерживаться с помощью объекта типа соединения. http://www.breezejs.com/documentation/presenting-many-many

  4. Существует ли «начало работы» для подобного использования, как у меня? Я много читал о BreezeJS и его альтернативах, но части головоломки еще не собрались мне в голову. Другими словами, я полностью потерян. Прочтите документы и проверьте образцы выше. Есть ссылки в некоторых образцах на прогулку, я являюсь автором ESPN, поэтому я знаю, что он работает и не заботится о реализации API

Что он сказал. (PW Kad)

Что касается синтаксиса избыточного запроса, Breeze использует синтаксис OData из коробки, но может быть адаптирован к более синтаксису RESTy. Взгляните на breeze.ajaxrestinterceptor.js . Он преобразует синтаксис OData по умолчанию, например:

 /breeze/orders/?$filter=id eq 1 

в синтаксис RESTy:

 /breeze/orders/1 

Если вы хотите поддерживать более богатые запросы, breeze.server.php делает это для вас, но в настоящее время поддерживает только ORM Doctrine. Возможно, вы сможете адаптировать его для Laravel / Eloquent.

Также есть демонстрационная версия breeze.server.php, которую вы можете просмотреть.