Laravel 13.9 มี `toPasswordRulesString()` ช่วยตรวจสอบกฎการตั้งรหัสผ่านแล้ว

Published on May 31, 2026

2 min read

เคยไหมครับที่เปิด Safari หรือ Chrome แล้วให้มันสุ่มรหัสผ่านมาให้ กดใช้เลย แต่พอกรอกเข้าระบบ กลับโดนแจ้งว่า "รหัสผ่านต้องมีตัวพิมพ์ใหญ่" บ้าง "ต้องมีสัญลักษณ์พิเศษ" บ้าง ทั้งๆ ที่รหัสที่ได้มายาวตั้ง 20 ตัว แต่ดันไม่ตรงเงื่อนไขของเว็บนั้น

ปัญหานี้มาจากการที่ Browsers ไม่รู้ว่าเงื่อนไขฝั่ง backend มันตรวจสอบอะไรบ้าง

ใน Laravel 13.9.0 เพิ่งออกมาพร้อมฟีเจอร์ที่ช่วยแก้ปัญหานี้ได้ toPasswordRulesString()

passwordrules attribute คืออะไร?

passwordrules เป็น HTML attribute ที่ Apple เป็นคนผลักดัน spec นี้ขึ้นมา แนวคิดคือให้ประกาศกฎรหัสผ่านตรงๆ ใน <input> เลย เพื่อให้ browser หรือ password manager อ่านแล้วเข้าใจได้ว่าควรสุ่มรหัสแบบไหน ตัวอย่าง attribute

<input 
  type="password" 
  passwordrules="minlength: 12; maxlength: 64; required: lower; required: upper; required: digit; required: special;"
/>

พอ Safari เห็น attribute นี้ มันจะสุ่มรหัสให้ตรงตามเงื่อนไขทันที

ปัญหาเดิมคือ ต้องเขียนกฎสองที่ ฝั่ง PHP สำหรับ validate และฝั่ง HTML สำหรับ attribute นี้ ถ้าลืมอัปเดตที่ใดที่หนึ่ง กฎก็จะไม่ sync กัน

toPasswordRulesString() แก้ยังไง?

Laravel 13.9.0 เพิ่มเมธอด toPasswordRulesString() เข้าไปในคลาส Password (ที่ใช้สำหรับ validation rule) เมธอดนี้จะแปลงกฎที่เราเขียนด้วย PHP ให้กลายเป็น string ของ passwordrules attribute โดยอัตโนมัติ การ mapping มีแบบนี้

เมธอดใน Laravelค่าใน passwordrules
min(n)minlength: n
max(n)maxlength: n
letters()required: lower
mixedCase()required: lower; required: upper
numbers()required: digit
symbols()required: special

วิธีใช้งาน

แนะนำให้ตั้ง default ไว้ใน AppServiceProvider ครั้งเดียว แล้วทุกที่จะใช้กฎเดียวกันหมด ทั้งฝั่ง validation (PHP) และฝั่ง HTML

// app/Providers/AppServiceProvider.php

use Illuminate\Validation\Rules\Password;

public function boot(): void
{
    Password::defaults(fn () => 
        Password::min(12)
            ->max(64)
            ->mixedCase()
            ->numbers()
            ->symbols()
    );
}

จากนั้นใน Blade template ให้ดึงมาแบบนี้

<input 
    type="password" 
    autocomplete="new-password" 
    passwordrules="{{ Password::defaults()->toPasswordRulesString() }}" 
/>

HTML ก็จะ render ตัว passwordrules ออกมาอัตโนมัติ

<input 
    type="password" 
    autocomplete="new-password" 
    passwordrules="minlength: 12; maxlength: 64; required: lower; required: upper; required: digit; required: special;" 
/>

ออกตัวก่อนว่ายังไม่ได้ลองใช้จริงในโปรเจกต์ครับ แค่เห็นในรายการอัปเดตแล้วรู้สึกว่านี่คือฟีเจอร์เล็กๆ ที่ควรมีมาตั้งนานแล้ว

หมายเหตุ สถานะในปี 2026 passwordrules ยังคงใช้ได้แค่ Safari (macOS, iOS, iPadOS) และ 1Password, Bitwarden, Dashlane, และ Apple iCloud Passwords Chrome และ Firefox หรืออื่นๆ อาจจะต้องรอไปก่อน

Sirichai Teerapattarasakul

ตั้ม — ศิริชัย ธีรภัทรสกุล

นักพัฒนาเว็บฟรีแลนซ์ตั้งแต่ปี 2547 รับพัฒนาเว็บไซต์ ระบบจัดการธุรกิจ และงาน Outsource / Sub-contract (WFH 100%)