Menu

Showing posts with label validation. Show all posts
Showing posts with label validation. Show all posts

Monday, September 9, 2019

[Laravel - Exception] วิธีการแสดง Validation Errors บนหน้าเว็บ
[Laravel - Exception] How to Display Validation Errors on Web Page

เนื่องจากใช้ฟังก์ชั่น validate ตาม code ข้างล่าง
public function update()
    $this->validate($this->request, [
        'ids' => 'required|array',
        'ids.*' => 'required|integer',
    ]);
    return 'test';
}
ทำให้เวลาที่ Validate request ไม่ผ่าน มันจะ throw ValidationException โดยอัตโนมัติ ซึ่งวิธีการ Handle มี 3 วิธีดังนี้
  1. ใช้ try...catch ครอบ code ส่วน validation เพื่อ handle ValidationException ที่เกิดขึ้นในแต่ละ function ของ controller
  2. เพิ่มการ handle ใน Handler class เพื่อเป็น handle กลางสำหรับ ValidationException ที่ไม่ถูก handle จากข้อแรก
  3. ข้ามข้อ 1 และ 2 แล้วนำ ValidationException มาแสดงผลบนหน้าเว็บ เนื่องจากเวลาเกิด ValidationException ระบบจะ redirect กลับไปหน้าก่อนหน้าพร้อมกับตัวแปรชื่อ $errors
สำหรับวิธีการแสดง Validation Error บนหน้าเว็บ ให้ใส่ code ด้านล่างนี้ในส่วนของ Blade template
@foreach ($errors->all() as $error)
    <div>{{$error}}</div>
@endforeach
หมายเหตุ  ตัวแปร $errors ข้างต้นไม่สามารถตรวจสอบได้ โดยการ inspect ดู Network ของ browser และการเรียกดูจาก request ใน controller

Saturday, October 28, 2017

[PHP] การใช้ preg_match สำหรับ validate Emoticon
[PHP] How to Use preg_match for Emoticon Validation

เนื่องจาก Emoticon แต่ละตัวจะมี unicode เฉพาะตัว ซึ่งสามารถดูได้จาก The Unicode Standard 10.0

แต่การ validate โดยใช้ preg_match ของ PHP จำเป็นจะต้องใช้ code ที่เป็น UTF-8 ซึ่งเราสามารถตรวจสอบได้จากเว็บ Unicode character inspector

สมมติว่า เราต้องการ validate Emoticon ตามข้างล่าง

😋 😐

เมื่อตรวจสอบ Unicode และ UTF-8 ของ Emoticon ข้างต้นจะได้ข้อมูลดังนี้
Unicode: 1F60B และ 1F610 ตามลำดับ
UTF-8: F0 9F 98 8B และ F0 9F 98 90 ตามลำดับ

เราจะใช้ค่าของ UTF-8 ในการเขียน RegEx สำหรับการ validate ดังนี้
UTF-8: F0 9F 98 8B
จะได้ RegEx: \x{F0}\x{9F}\x{98}\x{8B}

และ

UTF-8: F0 9F 98 90
จะได้ RegEx: \x{F0}\x{9F}\x{98}\x{90}

ตัวอย่างโค้ดของการ validate Emoticon ข้างต้นจะเป็นดังนี้
<?php

$value = '😋 😐';
echo preg_match('/^\x{F0}\x{9F}\x{98}\x{8B} \x{F0}\x{9F}\x{98}\x{90}$/', $value);

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ Unicode Regular Expressions อ่านได้ที่ http://www.regular-expressions.info/unicode.html

Monday, August 14, 2017

[NodeJS] Optional Field ของ Joi ไม่อนุญาตค่า null และ empty string
[NodeJS] Optional Field of Joi Validator not Allow Null and Empty String

เนื่องจากใช้ HapiJS เป็น framework ของโปรเจค จึงใช้ Joi เป็น validator ซึ่งก็เหมือน Framework ตัวอื่นๆ คือ สามารถระบุได้ว่า field ใดนั้น required หรือ field ใดนั้นไม่ required

Joi มี method สำหรับการระบุข้างต้น คือ required() และ optional() ตามลำดับ ซึ่งถ้าไม่ระบุจะเป็น optional โดยอัตโนมัติ แต่มันไม่ได้จบเพียงเท่านี้ เพราะ Library ตัวนี้มีบางอย่างที่ขัดกับ validator ของ framework อื่นหลบซ่อนอยู่

สำหรับ required() จะเป็นปกติเหมือน framework ทั่วไป คือ field นั้นต้องมีค่า ซึ่งค่านั้นต้องไม่ใช่ null หรือ empty string

สำหรับ optional() จะมีความแตกต่างจาก framework อื่น คือ field นั้นต้องมีค่า (ซึ่งค่านั้นต้องไม่ใช่ null หรือ empty string) หรือ field นั้นต้องหายไปเลย (undefined) อย่างใดอย่างหนึ่งเท่านั้น

อย่างไรก็ตาม สำหรับ framework ทั่วไป ในกรณีที่ไม่ระบุว่า required ความเป็นไปได้ของ field นั้น คือ มีค่าเป็นอะไรก็ได้รวมถึง null และ empty string ด้วย หรือ field นั้นจะหายไปเลยก็ได้

จะเห็นได้ว่า Joi ต่อให้เป็น optional ก็ไม่สามารถส่งค่า null หรือ empty string มาได้ วิธีแก้ไข คือ เพิ่ม .allow(null) และ .allow('') ต่อท้าย field ที่เป็น optional ด้วย

ปล. มีคนเปิด Issue เกี่ยวกับเรื่องนี้ ให้รวมค่า null กับ empty string เป็น optional ของ Joi ด้วย แต่ก็ได้คำตอบว่า มันโคตรจะไม่ปกติเลยหรือมันไม่ใช่ common use case ซึ่งจากคำตอบก็รู้แล้วแน่ๆว่า จะไม่มีการแก้ไขเกี่ยวกับเรื่องนี้ในอนาคตแน่นอน

สำหรับข้อมูลเพิ่มเติม สามารถอ่านได้ที่
How to allow a string or null?
Joi.string().optional() doesn't treat an empty string as unset