Saya sedang membangun aplikasi Laravel, yang memiliki sejumlah berbagai fitur. Saya ingin dapat mengaktifkan atau menonaktifkannya tergantung pada persyaratan domain tertentu. Saat ini, di config saya ada serangkaian flag seperti:
'is_feature_1_enabled' => true,
'is_feature_2_enabled' => false,
... dan seterusnya.
Kemudian pada pengendali dan pandangan saya, saya memeriksa nilai-nilai konfigurasi untuk melihat apakah saya harus menampilkan sesuatu atau tidak, memungkinkan tindakan tertentu, dll. Aplikasi saya mulai tercemar dengan jenis-jenis cek ini di mana-mana.
Apakah ada metode praktik terbaik dalam mengelola fitur di aplikasi Laravel?
laravel
laravel-5
design-patterns
laravel-4
StackOverflowNewbie
sumber
sumber
Jawaban:
Ini secara teknis disebut fitur flags - https://martinfowler.com/articles/feature-toggles.html
tergantung pada kebutuhan Anda, flag di config / database, rollout, dll ...
Tapi itu pada dasarnya kalau ada dalam kode dan tidak bisa bersih.
Paket Laravel:
https://github.com/alfred-nutile-inc/laravel-feature-flag
https://github.com/francescomalatesta/laravel-feature
Beberapa layanan:
https://launchdarkly.com/
https://bullet-train.io/
https://configcat.com/
Lihat juga https://marketingplatform.google.com/about/optimize/ untuk tampilan depan .
sumber
Saya mengalami masalah yang sama ketika saya mencoba menerapkan beberapa penyedia hotel.
Apa yang saya lakukan adalah menggunakan wadah layanan.
pertama Anda akan membuat kelas untuk setiap domain Dengan fitur-fiturnya:
maka Anda akan menggunakan pengikatan di penyedia layanan aplikasi Anda untuk mengikat domain dengan kelas yang akan digunakan.
Catatan Anda dapat menggunakan kelas umum yang berisi fitur-fitur yang ada di semua domain lalu gunakan kelas umum itu di kelas Anda
Akhirnya di controller Anda, Anda dapat memeriksa domain Anda kemudian menggunakan kelas yang akan Anda gunakan
sumber
Sepertinya Anda mengkodekan hal-hal berdasarkan nilai konfigurasi untuk mengaktifkan atau menonaktifkan fitur tertentu. Saya sarankan Anda untuk mengontrol hal-hal berdasarkan rute yang ditentukan daripada nilai konfigurasi.
jadi Anda tidak akan memiliki kondisi yang sama mengulangi setiap tempat dan mengasapi kode Anda .. di sini adalah kode sampel menunjukkan kepada Anda cara mengambil semua rute, dan Anda dapat mencocokkan nama grup rute untuk proses lebih lanjut agar sesuai dengan situasi Anda.
dan di sini adalah contoh middleware handler di mana Anda dapat memeriksa apakah fitur tertentu aktif dengan mencocokkan dengan apa yang sudah Anda simpan di database Anda ..
sumber
Dengan asumsi bahwa fitur-fitur itu hanya diperlukan untuk permintaan HTTP.
Saya akan membuat
Features
kelas dasar default dengan semua flag standar:Lalu saya akan memperluas kelas itu untuk setiap Domain dan mengatur penggantian yang diperlukan untuk domain itu:
Kemudian buat Middleware untuk mengikat Kelas Fitur ke wadah:
Jangan lupa untuk melampirkan middleware ini ke rute Anda: ke grup atau untuk setiap rute.
Setelah ini, Anda bisa mengetikkan kelas Fitur di pengontrol Anda:
sumber
Laravel hebat dengan ini, Anda bahkan dapat menyimpan fitur Anda di db, dan membuat hubungan antara domain.
Saya akan merekomendasikan untuk menggunakan Gates dan Kebijakan, yang akan memberi Anda kontrol yang lebih baik di controller dan template blade Anda. Ini berarti Anda mendaftarkan gerbang dari db atau kode keras Anda.
Misalnya jika Anda memiliki fitur produk ekspor dengan tombol di sistem Anda dan Anda ingin membuat fitur itu tersedia untuk beberapa pengguna, Anda dapat mendaftarkan gerbang dengan logika bisnis.
Kemudian Anda dapat melakukan hal berikut di pengontrol
Berikut ini contoh template templat Anda:
informasi lebih lanjut tersedia di https://laravel.com/docs/5.8/authorization
sumber
Kasus menarik yang Anda miliki di sini. Mungkin menarik untuk melihat
Feature
antarmuka atau kelas abstrak yang berisi beberapa metode yang biasanya Anda butuhkan.Anda bahkan dapat membagi ini menjadi
ExecutableFeature
danRenderableFeature
.Selanjutnya pada beberapa jenis kelas pabrik dapat dibuat untuk membuat hidup lebih mudah.
sumber
Apa yang saya lakukan dalam kasus saya adalah membuat tabel baru pada database, Anda bisa menyebutnya
Domains
sebagai contoh.Tambahkan semua fitur spesifik, yang dapat ditampilkan pada beberapa domain tetapi tidak di sisanya, sebagai kolom untuk tabel itu sebagai bit untuk nilai boolean. Seperti, dalam kasusku
allow_multiple_bookings
,,use_company_card
... terserahlah.Kemudian, pertimbangkan untuk membuat kelas
Domain
dan repositori masing-masing, dan tanyakan saja nilai-nilai ini pada kode Anda, mencoba untuk mendorong sebanyak mungkin logika itu ke domain Anda (model Anda, layanan aplikasi, dll).Misalnya, saya tidak akan melakukan pemeriksaan pada metode pengontrol karena
RequestBooking
jika domain yang meminta pemesanan hanya dapat meminta satu atau lebih.Alih-alih, saya melakukannya pada suatu
RequestBookingValidatorService
yang dapat memeriksa apakah waktu pemesanan telah berlalu, pengguna memiliki kartu kredit yang diaktifkan, ... atau dari Domain tempat tindakan ini diizinkan untuk meminta lebih dari satu pemesanan (dan kemudian jika sudah memiliki apa saja).Ini menambah kenyamanan keterbacaan, karena Anda telah mendorong keputusan ini ke layanan aplikasi Anda. Juga, saya menemukan bahwa setiap kali saya memerlukan fitur baru saya dapat menggunakan migrasi Laravel (atau Symfony) untuk menambahkan fitur itu di atas meja dan saya bahkan dapat memperbarui barisnya (domain Anda) dengan nilai-nilai yang saya inginkan pada komit yang sama dengan yang saya beri kode.
sumber