Kami sedang membangun arsitektur Microservice untuk proyek-proyek kami, dengan sebagian besar aplikasi Symfony front-end berinteraksi dengan back-end RESTful APIs.
Masalahnya adalah pendekatan ini melanggar manajemen entitas Symfony sangat bergantung pada Doktrin dengan database. Di mana Symfony biasanya menangani entitas dengan Doctrine, mengotomatisasi sebagian besar pekerjaan, ini tidak dapat direproduksi dengan mudah ketika kita harus mengakses data eksternal dari API.
Misalnya, dengan entitas Klien:
- Menggunakan Doctrine, kita hanya perlu mendefinisikan kelas Klien kita, dan sekarang mudah untuk membuat, memperbarui, mengambil klien kita
- Menggunakan pendekatan REST API, klien dapat diakses melalui API, tetapi kami memiliki banyak pekerjaan untuk menentukan bagaimana klien dibuat (POST), diperbarui (PUT), diambil (GET), dll.
Yang perlu diperhatikan klien digunakan oleh beberapa aplikasi, tidak hanya aplikasi front-end, karenanya API khusus.
Haruskah kita membuat kelas dengan metode seperti entitas menyembunyikan kompleksitas panggilan API, mengimpor semua data API secara lokal dan mengaksesnya melalui Ajaran, atau dengan cara lain?
Jawaban:
Saya telah membuat proyek berbasis symfony yang menggunakan API eksternal (JSON); apa yang saya lakukan adalah membuat pustaka klien independen ("pustaka klien" - perangkat lunak, paket komposer), dengan kumpulan entitasnya sendiri (POPO); itu terintegrasi dengan kerangka kerja menggunakan antarmuka yang disediakan oleh Symfony (misalnya, dengan hanya membuat penyedia pengguna kustom ).
Klien membuat panggilan http "di belakang layar" - yang penting untuk kemampuan pengujian di masa depan. Anda tidak ingin mengekspos cara Anda berkomunikasi dengan sumber data Anda dan juga Anda tidak ingin tes Anda mengandalkan api langsung.
Antarmuka perpustakaan klien (contoh tampilannya):
Pustaka klien secara internal menggunakan Guzzle untuk komunikasi dan komponen Cache Doctrine untuk menyimpan hasilnya. Pemetaan antara objek entitas dan json dibuat oleh pemetaan, yang pernah ditulis - tidak terlalu sering berubah (atau peristiwa sama sekali). Dalam hal ini saya akan menyarankan menggunakan JMS Serializer untuk transformasi otomatis ke dan dari JSON (saya berasumsi bahwa Anda menggunakan JSON).
Anda akan membutuhkan mekanisme caching yang baik dan penyimpanan lokal, seperti Redis. Melakukan panggilan api pada setiap permintaan aplikasi akan membunuh server Anda dan secara drastis memperlambat aplikasi Anda. Sangat penting untuk memahami cara kerja cache http. Jika api Anda tidak menggunakan header caching (atau menggunakannya dengan cara yang tidak jelas), akan sangat sulit dan menghabiskan banyak sumber daya untuk melacak perubahan.
Anda juga akan ingin memikirkan tentang bagaimana klien harus bersikap jika koneksi terputus - haruskah klien menggunakan data yang macet? Sebaiknya gunakan beberapa server proxy antara aplikasi Anda dan API. Dalam hal ini proksi (seperti Varnish) dapat mempercepat permintaan Anda dan juga menyegarkan data yang macet di latar belakang tanpa memperlambat aplikasi Anda. Ini juga akan membuat situs web Anda online jika terjadi kegagalan API. Anda mungkin tidak dapat menulis data sementara itu, tetapi pengguna Anda masih dapat menelusuri data yang di-cache.
Dan berbicara tentang Doktrin, lihat " Hukum instrumen ".
sumber
Doctrine adalah lapisan akses basis data. Anda tidak ingin mengakses database, tetapi apis. Anda masih dapat membuat Entitas, tetapi kemudian sebagai objek sederhana yang tidak harus memperpanjang apa pun implementasi kami (popo). Seharusnya memiliki Repositori yang mengimplementasikan semua metode CRUD. Dalam hal ini panggilan ke API alih-alih basis data. Saya akan membuat antarmuka untuk itu. Tidak harus merasa berbeda untuk aplikasi Anda untuk digunakan, kecuali bahwa Anda harus mempertimbangkan di mana-mana bahwa layanan mikro mungkin tidak merespons.
sumber
FYI, sekarang ada komponen HttpClient untuk v4.3.
https://symfony.com/blog/new-in-symfony-4-3-httpclient-component
sumber