Saya sedang membaca " Dalam MVC haruskah model menangani validasi? " Karena saya ingin tahu tentang ke mana logika validasi harus dimasukkan dalam situs web MVC. Satu baris dalam jawaban teratas berbunyi seperti ini: "pengendali harus menangani validasi, model harus menangani verifikasi."
Saya suka itu, tetapi itu membuat saya bertanya-tanya mengapa kami tidak akan melakukan validasi data di View, karena beberapa alasan:
- Tampilan biasanya memiliki dukungan validasi yang kuat (perpustakaan JS, tag HTML5)
- Tampilan dapat divalidasi secara lokal, mengurangi IO jaringan
- UI sudah dirancang dengan mempertimbangkan tipe data (kalender untuk tanggal, pemintal untuk angka), menjadikannya satu langkah kecil dari validasi
Memvalidasi di lebih dari satu tempat bertentangan dengan konsep MVC tentang tanggung jawab isolasi, sehingga "melakukannya di keduanya" tampaknya tidak tepat. Apakah melakukan validasi data hanya di controller benar-benar pendekatan yang dominan?
architecture
mvc
WannabeCoder
sumber
sumber
Jawaban:
Saya tidak berpikir ada satu tempat di mana Anda dapat mengatakan semua validasi harus dilakukan. Ini karena kami memiliki beberapa strategi pemrograman bersaing yang berbeda yang bekerja bersama di situs web standar MVC asp.net.
Pertama kita memiliki ide untuk memisahkan logika domain menjadi model, logika 'aksi' menjadi pengontrol dan tampilan menjadi Tampilan. Ini didasarkan pada gagasan bahwa semua logika akan terjadi di server dengan browser hanya memberikan tampilan.
Kemudian, kami memperluas Tampilan dengan menggunakan javascript sisi klien. Ini sangat canggih akhir-akhir ini sehingga ide 'satu halaman situs web' dengan Jquery / knockout / angular adalah praktik umum.
Praktek ini dapat setara dengan menulis aplikasi sisi klien keseluruhan yang dengan sendirinya menerapkan pola MVC atau MVVM. Kami merendahkan Tampilan ke Objek Transfer Data dan Pengendali ke titik akhir layanan. Memindahkan semua logika bisnis dan UI ke klien.
Ini bisa memberikan pengalaman pengguna yang lebih baik, tetapi Anda harus memercayai klien yang pada dasarnya tidak bisa dipercaya. Jadi, Anda masih perlu melakukan logika validasi di server, terlepas dari seberapa baik klien Anda melakukan pra-validasi permintaannya.
Juga, kami sering memiliki persyaratan validasi yang tidak dapat dilakukan oleh klien. misalnya. 'Apakah ID baru saya unik?'
Aplikasi apa pun yang Anda buat dengan tujuan memberikan pengalaman / kinerja terbaik tentu akan meminjam untuk beberapa paradigma pemrograman dan membuat kompromi pada mereka untuk mencapai tujuannya.
sumber
Mungkinkah ada beberapa tanggung jawab validasi untuk dipertimbangkan di sini? Seperti yang Anda katakan di # 3 Anda:
Jadi mungkin itu:
Tampilan : Validasi jenis input, format, persyaratan ... validasi input pengguna dasar yang tidak ada hubungannya dengan logika bisnis. Tangkap semua barang lembut ini sebelum kami menghasilkan lalu lintas jaringan dengan membuat permintaan server.
Model : Validasi masalah bisnis data. Apakah itu nilai hukum menurut aturan bisnis? Ya, ini adalah nilai numerik (kami memastikannya dalam tampilan), tetapi apakah ini masuk akal?
Hanya pemikiran saja.
sumber
Saya akan menganggap Anda perlu validasi untuk kegigihan.
Tidak hanya Lihat, tetapi Model juga tidak boleh menangani validasi. Selama hari-hari saya di IT saya menyadari DDD adalah salah satu cara untuk memastikan Anda benar-benar melakukan sesuatu dengan benar, yaitu. kelas sebenarnya bertanggung jawab atas apa yang seharusnya.
Saat mengikuti desain Domain-Driven, model Anda menyertakan logika bisnis Anda, dan hanya itu. Tetapi mereka tidak memasukkan validasi, mengapa tidak?
Mari kita asumsikan Anda sudah sejauh yang Anda gunakan
Data Mapper
daripadaActive Record
bertahan lapisan domain Anda. Tapi tetap saja, Anda ingin model divalidasi, jadi Anda menambahkan validasi ke Model Anda.Logika validasi memastikan, Anda dapat memasukkan model dengan benar ke dalam basis data MySQL Anda ... Beberapa bulan berlalu dan Anda memutuskan, Anda ingin menyimpan Model Anda di basis data noSQL juga, basis data, yang memerlukan aturan validasi berbeda dari MySQL.
Tetapi Anda memiliki masalah, Anda hanya memiliki 1 metode validasi, tetapi perlu memvalidasi
Model
dalam 2 cara berbeda.Model harus melakukan apa yang mereka harus lakukan , mereka harus menjaga logika bisnis Anda dan melakukannya dengan baik. Validasi terkait dengan kegigihan, bukan logika bisnis, karenanya validasi bukan milik model .
Anda harus membuat
Validator
s, yang akan mengambil model untuk memvalidasi dalam konstruktor mereka sebagai parameter, mengimplementasikanValidation
antarmuka dan menggunakan iniValidator
untuk memvalidasi objek Anda.Jika suatu saat di masa depan memutuskan Anda ingin menambahkan metode validasi lain untuk lapisan kegigihan lainnya (karena Anda memutuskan Redis dan MySQL bukan cara untuk pergi lagi), Anda hanya akan membuat yang lain
Validator
dan menggunakanIoC
wadah Anda untuk mendapatkan instance yang tepat berdasarkan pada Andaconfig
.sumber
Bagi banyak pengembang, model Fat melawan Pengendali Jelek Bodoh adalah metode yang disukai.
Konsep dasar dalam teks adalah
dan
Tampilan seharusnya hanya mementingkan pembuatan dan penyajian UI sehingga pengguna dapat mengomunikasikan maksud ke Model adalah bagian penting. Model harus mendefinisikan data yang tersimpan, sehingga harus juga bertanggung jawab untuk memeriksa validitas data.
Saat mengambil catatan seseorang, setiap orang harus memiliki nomor ID unik yang diberikan oleh negara. Pemeriksaan ini (umumnya) dilakukan dengan
UNIQUE
pemeriksaan kunci oleh basis data. Setiap nomor ID yang diberikan harus memenuhi beberapa langkah kontrol (jumlah digit ganjil harus sama dengan jumlah digit genap dll). Jenis kontrol ini harus dilakukan olehModel
Pengontrol mengumpulkan data dari
Model
dan meneruskannya keView
, atau membalikkan, mengumpulkan data pengguna melaluiView
dan meneruskannya keModel
. Setiap pembatasan dalam mengakses data dan memvalidasinya tidak boleh dilakukan olehController
. ItuController
yang mengumpulkan data cookie dan ituModel
yang memeriksa apakah itu sesi yang valid atau pengguna memiliki akses ke bagian aplikasi ini.View
adalah antarmuka pengguna yang mengumpulkan data dari pengguna atau menyajikan data ke pengguna. Pemeriksaan sederhana dapat dilakukan denganView
seperti memasukkan alamat email pengguna atau tidak (dengan demikian ini juga dapat dilakukan di View) IMO.Lihat adalah sisi klien, dan Anda tidak boleh memasukkan input pengguna. Javascripts mungkin gagal berjalan di sisi klien, pengguna dapat menggunakan skrip tulisan tangan untuk mengubahnya atau menonaktifkan skrip menggunakan browser. Anda dapat mengatur skrip validasi sisi klien, tetapi jangan pernah Anda tidak boleh mendorongnya dan melakukan pemeriksaan nyata pada
Model
layer.sumber
Simple checks can be done by the View like the user input e-mail address or not
mungkin itu tidak jelas. Tetapi apa yang Anda katakan juga benar bagi saya, pemeriksaan sederhana dan mudah dapat dilakukan dengan mudah dalam tampilan.Tampilan harus melakukan validasi untuk tujuan:
sumber