Я пишу СПА в Дюрандале 2.1. Все идет нормально. Тем не менее, у меня большие трудности с выбором правильной библиотеки Data Persistence для связи с моим REST API PHP (Laravel).
Библиотека номер один для Durandal – BreezeJS. Говорят, что он поддерживает API без рамки OData / ASP.NET Entity. Я искал много дней, но я не могу найти достойный ресурс, рассказывающий мне, как использовать BreezeJS с моим базовым API REST PHP.
Список пожеланий выглядит следующим образом:
API REST выглядит следующим образом. Я буду использовать структуру Contact + Address + Country Model, чтобы объяснить, как работает мой API.
Следующий запрос 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:
POST / PUT в той же структуре, что и выше, в атрибуте "data". Основываясь на id
модели, бэкэнд решит, нужно ли ему создавать ИЛИ обновлять модель. Бэкэнд также автоматически определяет, нужно ли создавать / обновлять / удалять отношения на основе поставляемой полезной нагрузки. Довольно круто, да? 🙂
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 } } ]
Итак, теперь у меня есть вопросы:
Можно ли это сделать в BreezeJS или я должен рассмотреть альтернативу, такую как JayData или Waterline?
BreezeJS, похоже, настаивает на использовании запроса типа синтаксиса. Я пропустил его цель или это бесполезно? Если да, можно ли опустить запрос как синтаксис и по-прежнему использовать BreezeJS или альтернативу?
Как BreezeJS (или альтернатива) имеет дело с hasOne, hasMany, принадлежит и принадлежит для многих и полиморфных отношений?
Существует ли «начало работы» для подобного использования, как у меня? Я много читал о 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 не предпочитает, как вы получаете / устанавливаете свои данные только в том случае, если вы это сделаете, и обновите объекты, которые он кэшировал с результатами. Чтобы конкретно ответить на ваши вопросы –
Можно ли это сделать в BreezeJS или я должен рассмотреть альтернативу, такую как JayData или Waterline? Должен ли я использовать то или это? – Нелегкий вопрос. Всегда выбирайте лучший инструмент для работы.
BreezeJS, похоже, настаивает на использовании запроса типа синтаксиса. Я пропустил его цель или это бесполезно? Если да, можно ли опустить запрос как синтаксис и по-прежнему использовать BreezeJS или альтернативу? По умолчанию Breeze использует синтаксис в запросах, поскольку адаптер по умолчанию – это WebAPI. Не стесняйтесь использовать метод .withParameters()
для создания собственных тел запроса.
Как BreezeJS (или альтернатива) имеет дело с hasOne, hasMany, принадлежит и принадлежит для многих и полиморфных отношений? Бриз поддерживает все отношения и типы, за исключением многих-ко-многим. Однако отношения «многие ко многим» могут поддерживаться с помощью объекта типа соединения. http://www.breezejs.com/documentation/presenting-many-many
Существует ли «начало работы» для подобного использования, как у меня? Я много читал о 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, которую вы можете просмотреть.