Saya telah melihat sejumlah strategi untuk mengintegrasikan struktur data jarak jauh di Drupal. Strategi-strategi tersebut tampaknya berkembang ketika modul-modul tertentu telah stabil dan kasus penggunaan telah dicoba.
Bayangkan kita memiliki struktur data "Pasar Petani" yang diwakili oleh sejumlah tipe data (pasar, market_hours, penjual, kios, produksi) dll yang terpapar melalui REST API. ID untuk layanan eksternal perlu dihubungkan di Drupal, yaitu ketika memuat "pasar" kami ingin mengambil data dari 'market_hours' dan 'stall'. Apa cara terbaik untuk menyatakan bahwa sebagai konten hanya baca di Drupal yang disinkronkan secara teratur?
Saya mencoba mengevaluasi ini dengan kriteria berikut:
Struktur Data di Drupal:
Node vs Entitas Kustom
Sejumlah skenario yang melibatkan layanan web yang saya lihat menggunakan entitas khusus. Ini menyederhanakan operasi CRUD. Namun, barang-barang ini akan menjadi "konten" karena akan dilihat secara publik.
Penyimpanan (Lokal vs Remote):
Saya telah melihat beberapa contoh di mana layanan dimuat sebagai entitas jarak jauh, di mana modul ini membuat perpustakaan untuk: https://drupal.org/project/wsdata . Ini terdengar paling menarik, tetapi belum melihat banyak kasus penggunaan. Ada juga contoh kode khusus: https://drupal.org/sandbox/fago/1493180
Menyinkronkan Data:
Umpan vs Migrasikan vs Guzzle vs 'Klien Layanan Web' vs 'Data Layanan Web'
Ada sejumlah opsi. Umpan sekarang mendukung entitas. Migrasi tampaknya jauh lebih bersih daripada umpan, terutama untuk skenario khusus. Saya juga melihat orang menggunakan klien guzzle untuk mengambil sinkronisasi dengan layanan jarak jauh: http://drupalcode.org/project/ckan.git/blob/refs/heads/ckan_dgu_7.x-1.x:/ckan.drush. inc # l273 . Saya juga memperhatikan modul WS Client https://drupal.org/project/wsclient menyediakan opsi yang telah dibuat khusus sebagai klien sisanya. Data Layanan Web memuat langsung dari layanan dan menyimpannya secara lokal.
Terima kasih atas pemikirannya.
Jawaban:
1. Merumuskan kembali pertanyaan
Contoh Anda menunjukkan bahwa data hanya dibaca di sisi Drupal, dengan sinkronisasi satu arah saja. Saya pikir ini adalah faktor yang paling penting untuk dipertimbangkan di sini, karena pada dasarnya solusi apa pun yang Anda terapkan akan menjadi varian penyimpanan jauh, sinkronisasi dan caching lokal - bahkan jika caching lokal akhirnya menjadi entitas dalam database Drupal.
Jadi pertanyaannya, daripada menjadi "penyimpanan lokal vs penyimpanan jauh" akan menjadi:
Artikel yang mungkin menarik bagi Anda adalah " Entitas Jarak Jauh di Drupal 7 ".
2. Caching data
Secara umum, caching data adalah ide yang baik:
Anda terlindungi dari pemadaman layanan lain, atau batas waktu dalam koneksi;
Memiliki data Anda hadir dalam database Drupal Anda akan mempercepat operasi;
Memiliki data Anda hadir dalam database Drupal Anda akan berarti bahwa Anda lebih mungkin untuk mendapatkan integrasi dengan modul lain, seperti Views (meskipun ini tidak dijamin).
Satu-satunya keuntungan dari tidak melakukan caching data adalah Anda tidak pernah mendapatkan data basi, yang dalam beberapa kasus lebih disukai - kadang-kadang lebih baik untuk tidak menampilkan data daripada data basi. Saya tidak melihat ini sebagai manfaat dalam contoh yang Anda berikan, jadi saya akan memfokuskan jawaban ini pada solusi yang melibatkan caching lokal.
3. Entitas lokal + Sinkronisasi
Jika Anda memilih opsi memiliki entitas lokal dan menyinkronkannya sendiri, maka kami kembali ke pertanyaan awal Anda:
Jika Anda menggunakan node atau entitas khusus;
Modul mana yang terbaik untuk sinkronisasi.
3,1 Nodes vs entitas Kustom
Definisi apa sebenarnya sebuah simpul adalah definisi yang cukup terbuka. The halaman dokumentasi pada node menunjukkan bahwa node "postingan" yang "disimpan" di situs Anda - baik yang berlaku untuk data Anda;
Sebagai pengembang Drupal saya berharap bahwa jika sesuatu adalah sebuah node maka saya harus dapat memanipulasinya di situs itu sendiri;
Sebagai pengguna Drupal, saya juga berharap bahwa node dapat diedit;
Masalah Drupal 8 ini https://drupal.org/node/2019031 menyarankan bahwa konsep "hanya baca" adalah konsep yang akan berlaku di tingkat entitas, bukan pada tingkat bundel. Jika ini pernah diterapkan Anda akan mendapat manfaat dari itu karena telah menempuh rute ini.
Untuk meringkas: data Anda hanya dibaca dan disimpan dari jarak jauh , lebih masuk akal untuk menggunakan jenis entitas khusus untuk mewakili data Anda.
3.2 Sinkronisasi
Untuk bagian kedua, dua modul utama untuk ini adalah, seperti yang Anda sarankan, Umpan dan Migrasi .
Perbedaan antara Umpan dan Migrasi adalah bahwa Umpan dibuat untuk mengimpor konten secara teratur, sedangkan Migrasi dibuat untuk porting konten satu kali dari satu tempat ke tempat lain. Migrasi mendukung pembaruan data yang ada, namun mengingat kedua modul didukung dengan baik, lebih masuk akal untuk menggunakan modul yang dibuat untuk tugas yang sedang dikerjakan - Umpan lebih cocok.
Setelah menggunakan kedua modul itu sendiri (Umpan untuk sinkronisasi, Migrasi untuk migrasi) Saya tidak menemukan Feed lebih berantakan daripada Migrasi. Migrasikan memerlukan lebih banyak kode khusus dalam pengalaman saya, meskipun memigrasikan seluruh situs lebih kompleks daripada mengimpor tipe konten tunggal, jadi sulit untuk membandingkan.
4. Modul khusus untuk penyimpanan jarak jauh, sinkronisasi + caching
Ada sejumlah modul di luar sana yang dapat membantu tugas ini.
Anda menyebutkan modul Data Layanan Web , dan yang lain menyebutkan modul Data . Opsi lain untuk dipertimbangkan adalah modul Remote Entity API . Perhatikan bahwa satu-satunya yang saya alami adalah modul Data.
Modul Data Layanan Web belum memiliki rilis - yang mungkin menunjukkan kode belum stabil, API mungkin berubah dan sebagainya. Itu tidak mendukung Kueri Bidang Entitas (sesuai dengan halaman proyeknya), dan penelusuran cepat dari repositori kode tidak menunjukkan bukti bahwa ia memiliki dukungan Tampilan - sehingga Anda tidak akan dapat menggunakan Tampilan untuk menampilkan entitas Anda;
Modul Data lebih berorientasi, menurut pengalaman saya, terhadap non-pengembang yang memiliki data dalam tabel dan ingin mengeksposnya ke tampilan. Saya telah menemukan versi Drupal 6 cukup frustasi untuk digunakan - meskipun itu mungkin telah berubah sejak saat itu;
Modul Remote Entity API kedengarannya cukup menjanjikan - mendukung pengambilan dan caching entitas jauh, dan memiliki dukungan Views. Ini hanya pada rilis alpha - jadi API mungkin masih berubah. Pada pandangan pertama sepertinya tidak memiliki dukungan Entity Field Query, dan hanya mendukung satu jenis layanan jarak jauh sehingga Anda harus menerapkan sendiri.
Kesimpulan
Mengingat bahwa tidak ada modul penyimpanan jarak jauh yang mendukung Kueri Bidang Entitas, menggunakan entitas + umpan aktual adalah solusi yang akan memberi Anda integrasi terbaik dengan situs Drupal Anda.
Jika dukungan Views sudah cukup, dan Anda tidak khawatir tentang potensi integrasi dengan modul lain melalui Kueri Bidang Entitas, maka menggunakan API Entitas Jarak Jauh mungkin merupakan cara yang harus dilakukan - Anda perlu mengimplementasikan antarmuka jarak jauh Anda sendiri.
sumber
Jika Anda memerlukan pandangan, aturan, token, kait cruds, api pencarian dan integrasi sistem yang jelas kuat dalam pendapat saya mereka tidak dapat dianggap node tetapi mereka harus entitas kustom dengan keistimewaan mereka sendiri menyimpan dalam database "entitas id" dan Hubungan "id eksternal" dan dengan panggilan informasi pengambilan yang dienkapsulasi dalam "properti entitas". Akhirnya, apa pun alat yang Anda pilih untuk menyinkronkan data, saya akan memprosesnya dengan cron Queues.
Jika Anda hanya perlu mengambil dan mengekspos data tepat waktu, saya pikir pilihan yang lebih baik adalah membuat kelas Interface untuk mengambil data eksternal dan mengimplementasikan Antarmuka ini dengan Kelas yang mengambil info dari struktur "Pasar Pasar" Anda.
Salam
sumber
Ada Field Storage API , yang memungkinkan penyimpanan back-end selain mesin database default.
sumber