Fork vweb dengan pemodelan dan validasi data.
Ini adalah bukti konsep.
mkdir modules
cd modules
git clone https://github.com/intangere/tea.git
Mungkin semua penggunaan normal Vweb berlaku.
Ini hanyalah pembungkus tipis di atas Vweb yang cukup terbuka untuk memungkinkan perubahan tanda tangan rute.
Ada banyak contoh di example.v
Contoh lengkap sederhananya adalah sebagai berikut:
Mari kita buat rute /login
yang menggunakan model pengguna.
Impor teh terlebih dahulu dan deklarasikan variabel aplikasi Anda seperti ini:
import tea
struct App {
tea . Context
pub mut:
validators tea . Validators < App >
}
Tentukan model user
Anda:
struct User {
username string
password string
}
Tentukan fungsi untuk memeriksa validitas model user
:
fn ( user User ) is_valid () bool {
username := user . username . strip_margin ()
password := user . password . strip_margin ()
return username . len > 3 &&
password . len > 8
}
Tentukan rute /login
Anda:
['/ login '; post ]
fn ( mut app App ) login ( user User ) tea. Result {
// posted user parameters will be available in user after being validated
println ('U sername : ' + user . username + ' Password : ' + user . password )
app . json ('{" status ":" testing "}')
}
Tentukan fungsi utama Anda:
fn main () {
mut app := App {}
}
Sekarang di fungsi utama itu Anda dapat membuat validator data user
Anda.
(Anda juga dapat mendefinisikan ini sebagai fungsi bernama)
login_validator := fn ( mut app App ) {
model := tea . decode_model < User > ( app . req . data )
if ! model . is_valid () {
app. validation_error ('u sername or password too short ')
return
}
app . login ( model )
}
Validator data harus membongkar beberapa jenis data (dalam hal ini isi json permintaan), memvalidasinya, dan bergantung pada hasilnya, mengembalikan kesalahan validasi atau meneruskan model yang divalidasi ke rute.
Sekarang aplikasi perlu mengetahui validator dan rute mana untuk menjalankannya. Jadi setelah mendeklarasikan validator, Anda perlu menambahkannya ke app.validators
:
app . validators . validators ['/ login '] = login_validator
Kemudian jalankan aplikasi seperti yang Anda lakukan dengan Vweb:
tea . run ( & app , 8080 )
/user/:user_id
dengan parameter lain, parameter url user_id
harus berada setelah parameter lainnya. yaitu // this will not compile (with or without a validator defined. However it does require one)
['/ user / : user_id ']
fn ( mut app App ) user ( user_id string , user User ) {
}
// this will compile with or without a validator
['/ user / : user_id ']
fn ( mut app App ) user ( user_id string ) {
}
// this will compile with a validator
['/ user / : user_id ']
fn ( mut app App ) user ( user_id int ) {
}
// this is how it has to be defined and will compile (requires a validator defined for /user/:user_id)
['/ user / : user_id ']
fn ( mut app App ) user ( user User , user_id string ) {
}
tea.decode_model<T>(string)
mengambil string json sebagai input dan menerjemahkannya menjadi sebuah structapp.url_params
memperlihatkan parameter jalur url bila diterapkan sebagai map[string]string
:user_id
sebagai parameter tetapi masih mengaksesnyatea.from_map<T>(map[string]string)
dapat digunakan untuk mengambil app.query dan mengubahnya menjadi struct dengan bidang string sajaSetiap kali refleksi waktu kompilasi lebih lengkap di V, sesuatu seperti ini harus dimungkinkan yang akan menyembunyikan sebagian besar internal:
import tea
struct App {
tea . Context
pub mut:
validators tea . Validators < App >
}
['/ login '; post ]
fn ( mut app App ) login ( user User ) tea. Result {
// posted user parameters will be available in user after being validated
println ('U sername : ' + user . username + ' Password : ' + user . password )
app . json ('{" status ":" testing "}')
}
['/ login '; validator ]
fn ( mut app App ) login_validator () User {
model := tea . decode_model < User > ( app . req . data )
if ! model . is_valid () {
app. validation_error ('u sername or password too short ')
return
}
return model
}
fn main () {
mut app := App {}
tea . run ( & app , 8080 )
}