Tags

, , , , ,

Lebih Jauh apa Lebih Dekat? Sedikit bingung tadi waktu memberi judul tulisan ini. Kata jauh dan kata dekat jelas-jelas beranonim. Tetapi ketika diawali dengan kata lebih, mendadak artinya menjadi sama. Saya ingin mengenalmu lebih dekat. Bisakah kamu ceritakan tentang dirimu lebih jauh.
Screenshot from 2016-02-18 13:52:32
Validating, validation, validator atau apapun lah. Di sini kita tidak sedang belajar bahasa, jadi kita langsung pada pokoknya saja. Intinya, validasi adalah proses untuk memastikan bahwa data yang diinputkan adalah valid. Sebagai sebuah proses, dia memerlukan aktor yang disebut validator. Cukup.

Sebenarnya perlu gak sih proses validasi itu? Jangan-jangan kita pakai hanya untuk gaya-gayaan saja? Umumnya jika kita menginputkan data ke sistem(database) dengan nilai yang tidak valid, kemungkinan besar sistem tetap akan menolak data tersebut dengan disertai error. Pada titik ini, validasi sebenarnya tidak perlu.

Screenshot from 2016-02-18 13:48:23
Lalu?

Validasi menjadi perlu untuk memberi peringatan lebih dini sebelum terjadi error. Juga untuk memperoleh pesan error yang lebih mudah untuk dipahami. Validasi juga berguna untuk menjaga integritas data tetap valid mengingat sekarang ini orang-orang lebih abai dalam menjaga integritas data di level database.

Implementasi Validation

Di framework-framework lain proses validasi biasanya dilakukan secara bebas di mana saja tanpa terikat dengan model. Di framework sebelah misalnya -sebut saja namanya L5-, validasi dapat dilakukan di controller.

// routing
Route::post('post', 'PostController@store');

// PostController
public function store(Request $request)
{
    $this->validate($request, [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    // The blog post is valid, store in database...
}

Validasi dilakukan langsung terhadap objek $request di dalam controller. Tentu saja ada metode lain yang bisa diterapkan. Tetapi itu bukan wilayah kita untuk membahasnya :D. Fokus kita adalah Yii2. Jadi, bagaimana dengan Yii2?

Di Yii2, orang cenderung mengaitkan validasi dengan Model terutama jika orang tersebut adalah veteran Yii1. Tidak terlalu salah memang, mengingat di Yii1 validasi hanya bisa diterapkan di Model (Saya sendiri bahkan tidak ingat pernah menggunakannya di luar model :D).
Di luar model kita bisa menggunakan class Validator dan turunannya untuk memvalidasi data secara ad-hoc.

$email = new \yii\validators\EmailValidator();
$email->validate('misbahuldmunir@gmail.com');

$number = new \yii\validators\NumberValidator();
$number->validate('d426');

Walaupun bisa, tetapi jarang dipakai karena itu bukan best practice-nya Yii. Best practice-nya Yii adalah dengan menggabungkan antara validator dan model. Apalagi jika ditambah dengan ActiveForm, maka kita juga akan memperoleh validasi di sisi client. Fitur yang sangat bagus mengingat jika kita melakukannya secara manual mungkin akan setara dengan berpuluh-puluh baris javascript.
Untuk menggunakan validator di model, kita harus mengoverride method rules() dari model tersebut.

public function rules()
{
    return [
        [['name', 'email'], 'required'],
        [['email'], 'email'],
    ];
}

Kurasa semua sudah tahu tentang cara penggunaannya. Jadi kita tidak akan membahasnya lebih jauh lagi. Kita akan membahas topik berikutnya yang merupakan inti dari tulisan ini. Ada dua isue penting berkaitan dengan validator ini yang ingin saya bagi pada kita semua. Issue tersebut adalah filter validator dan mass assignment.

Filter Validator

Berbeda dengan kebanyakan framework. Yii jelas telah bersikap ghuluw dalam perkara ini. Yii telah berlebih dalam memberikan kemampuan pada validator-validatornya. Jika umumnya validator itu berfungsi hanya untuk mengecek valid tidaknya suatu nilai. Di Yii, validator juga bisa berfungsi merubah nilai dari data yang dicek. Ini nampak tidak logis dari sisi definisi. Contoh filter validator bawaan Yii adalah DefaultValidator.

public function rules()
{
    return [
        [['status'], 'default', 'value' => 'draft'],
        ...
    ];
}

Pada contoh di atas, jika nilai field status kosong maka akan diisi dengan ‘draft’. Jika sudah ada nilainya maka dibiarkan. Ini seolah tampak tidak benar. Bukannya mengecek validitas nilai status, dia justru memberi nilai pada field status tersebut.

public function rules()
{
    return [
        [['value'], 'default', 'value' => function(){
            $total = 0;
            foreach($this->items as $item){
                $total += $item->qty * $item->price;
            }
            return $total;
        }],
        ...
    ];
}

Sedangkan contoh yang ini, kita menghitung nilai value sebagai total dari harga item detilnya.
Walaupun tampak tidak benar, untuk hal ini kita setuju bahwa tidak selamanya sikap ghuluw adalah tidak baik. Kita bahkan mendapatkan banyak keuntungan dengan ability yang dimiliki oleh validator Yii. Kita bisa mengisolasi logic program pada tempat-tempatnya secara tepat.

Validator lain yang juga sangat berguna adalah inline validator. Kita mendefinisikan sendiri fungsi untuk validator kita sehinggah kita bisa lebih bebas berkreasi.

public function rules()
{
    return [
        [['value'], 'myValidator',],
        ...
    ];
}

public function myValidator()
{
    $total = 0;
    foreach($this->items as $item){
        $total += $item->qty * $item->price;
    }
    $this->value = $total;
}

Mass Assignment

Insyaallah dalam tulisan berikutnya.

Advertisements