Halo semuanya, nama saya Alex. Saya ingin memperkenalkan Anda pada kerangka PHP saya untuk membuat layanan microser. Itu tumbuh dari percobaan saya tiga tahun lalu, yang kemudian tumbuh menjadi proyek hewan peliharaan, dan kemudian dalam kerangka ini saya membuat beberapa proyek produksi.
Ketika saya mulai melakukannya, saya memutuskan untuk membuat keputusan bahwa:
- dapat dengan mudah diintegrasikan ke dalam proyek yang ada;
- Anda dapat dengan cepat membuat setidaknya sesuatu berfungsi;
- desain yang paling ringkas dan ekspresif;
- bijak menggunakan kemampuan PHP modern.
Jadi, dari mana Anda memulai? Tentu saja dari sumbernya! Anda dapat menontonnya di
githubNah, agar tidak masuk ke argumen panjang, mari kita mulai dengan contoh kerja.
Pertama-tama, kita perlu .htaccess, di mana kita akan mengkonfigurasi beberapa aturan:
# use mod_rewrite for pretty URL support RewriteEngine on RewriteRule ^([a-z0-9A-Z_\/\.\-\@%\ :,]+)/?(.*)$ index.php?r=$1&%{QUERY_STRING} [L] RewriteRule ^/?(.*)$ index.php?r=index&%{QUERY_STRING} [L]
Kemudian Anda dapat membuat layanan pertama Anda. Di dalamnya, kita akan membuat satu titik akhir yang akan memproses metode GET dan mengembalikan pesan bahwa semuanya baik-baik saja dengan itu. Semacam pemeriksaan kesehatan.
Untuk memulai, kita perlu menghubungkan kerangka kerja kita:
require_once ('vendor/service/service.php');
Kemudian kami membuat kelas untuk layanan mikro:
class TodoService extends ServiceBase implements ServiceBaseLogicInterface { }
Di sini kita memiliki:
- ServiceBase adalah kelas layanan dasar dengan fungsionalitas paling dasar dan paling utilitarian;
- ServiceBaseLogicInterface adalah antarmuka yang perlu diterapkan oleh setiap kelas jika ingin menyediakan penangan titik akhir. Sementara antarmuka ini tidak memaksakan persyaratan khusus pada kelas Anda. Hanya dibuat untuk pengetikan yang lebih ketat.
Kemudian kita mendapatkan pengendali titik akhir pertama:
public function action_ping() { return ('I am alive!'); }
Lalu kami meluncurkan microservice pertama kami:
Service::start('TodoService');
Menyatukan semuanya, kita mendapatkan:
class TodoService extends ServiceBase implements ServiceBaseLogicInterface { public function action_ping() { return ('I am alive!'); } } Service::start('TodoService');
Sebuah pertanyaan yang masuk akal mungkin muncul - dan pada URL apa fungsi ini tersedia? Faktanya adalah bahwa dengan mendefinisikan metode dengan awalan action_ <name-part>, Anda menjelaskan kepada layanan bahwa itu adalah penangan URL <name-part> i.e. dalam kasus kami ini akan menjadi sesuatu seperti
localhost / pingGaris bawah dalam nama metode berubah menjadi -. Yaitu Metode action_hello_world akan tersedia di
localhost / hello-worldKami melaju.
Sama seperti untuk aplikasi GUI, alangkah baiknya menggunakan MVC (atau pola lain dengan pemisahan komponen visual dan logika), serta dalam layanan microser. Hal-hal yang dapat dihancurkan adalah yang terbaik dihancurkan.
Yaitu dalam kasus kami, biarkan kelas layanan terus melakukan fungsi utilitarian untuk menginisialisasi layanan dan meluncurkan penangan yang diinginkan, dan menempatkan logika di kelas yang terpisah. Untuk melakukan ini, kami memodifikasi kode kami sebagai berikut:
class TodoLogic extends ServiceBaseLogic { public function action_ping() { return ('I am alive!'); } } class TodoService extends ServiceBase { } Service::start('TodoService', 'TodoLogic');
Lalu kami mendapat kelas dengan logika:
class TodoLogic extends ServiceBaseLogic
Diwarisi dari kelas dasar ServiceBaseLogic (ini memiliki fungsi minimum, jadi kami akan memeriksanya secara rinci nanti).
Kelas TodoService telah berhenti mengimplementasikan antarmuka ServiceBaseLogicInterface (pada kenyataannya, itu belum hilang, baru saja kelas ServiceBaseLogic mengimplementasikannya).
Setelah menghapus logika, kelas TodoService ternyata kosong dan dapat dihapus dengan aman, mengurangi kode lebih:
class TodoLogic extends ServiceBaseLogic { public function action_ping() { return ('I am alive!'); } } Service::start('ServiceBase', 'TodoLogic');
Di sini, kelas ServiceBase bertanggung jawab untuk memulai layanan, bukan milik kita.
Kami melaju lebih jauh.
Dalam proses menggunakan kerangka saya, pada saat tertentu, kelas dengan logika ukuran mengerikan mulai berubah. Apa yang menjengkelkan rasa keindahan saya di satu sisi, di sisi lain, Sonar marah, di sisi ketiga, konsep membagi metode menjadi metode membaca dan metode menulis (lihat CQRS) tidak jelas bagaimana menerapkannya.
Oleh karena itu, pada saat tertentu, menjadi mungkin untuk mengelompokkan penangan titik akhir menurut satu atau atribut lainnya sesuai dengan kelas logika yang berbeda, dan jika perlu, menjalankannya dalam layanan yang sama atau mendistribusikannya tanpa rasa sakit ke yang berbeda.
Yaitu Anda dapat melakukan semua logika CRUD dalam satu layanan. Dan itu dapat dibagi menjadi dua layanan:
- satu menyediakan metode membaca;
- dan yang lainnya menyediakan metode modifikasi data.
Sekarang mari kita tambahkan metode pembuatan entitas dan metode pengambilan daftar entitas ke contoh kita:
class TodoSystemLogic extends ServiceBaseLogic { public function action_ping() { return ('I am alive!'); } } class TodoReadLogic extends ServiceBaseLogic { public function action_list() { return ('List!'); } } class TodoWriteLogic extends ServiceBaseLogic { public function action_create() { return ('Done!'); } } Service::start('ServiceBase', [ 'TodoSystemLogic', 'TodoReadLogic', 'TodoWriteLogic' ]);
Kami hanya akan menyentuh perubahan:
- kelas TodoSystemLogic (metode sistem), TodoReadLogic (metode baca), TodoWriteLogic (metode menulis) muncul;
- ketika memulai layanan, kami mentransfer tidak satu kelas dengan logika, tetapi beberapa.
Itu saja untuk hari ini. Saya akan membahas fitur-fitur lain dari kerangka kerja di artikel berikut. Ada banyak dari mereka. Sementara itu, Anda dapat melihat sendiri
apa yang menarik di sana .