Laravel 5.2: ใช้ Username และ Email login
ใช้ Laravel Framework มาได้สักพัก ก็เกือบปีละมั้ง ตอนนี้ออก 5.3 แล้วยังไม่ได้ลอง dev อยู่บน 5.2 และก็เพิ่งรู้ว่ามันมี LTS ด้วยรุ่นก่อนหน้าก็ 5.1 อะเข้าหัวเรื่องกันเลยดีกว่า ผมใช้ระบบ auth ของ laravel ซึ่งค่าเริ่มต้นให้มาจะใช้ email ในการ login อย่างเดียวก่อนหน้านี้ผมได้แก้ไขให้ user สมัครโดยกรอกชื่อ และ อื่น ๆ รวมทั้ง username ไว้โดยยังไม่ได้ใช้ประโยนช์กับมันจนมาถึงวัน present ให้ user ใช้ตอนสมัครก็มีช่อง username ให้กรอกแต่ไม่ได้ใช้ประโยชน์ตอนที่กำลังแนะนำตัวผมเองก็รู้สึกว่า แล้วจะใส่มาทำไมในเมื่อไม่ใส่มา ก็เลยมานั่งไล่ code ในส่วน auth ใหม่พบว่าไม่ยากเท่าไหร่เพราะมีคนแนะนำไว้ เลยเอามาประยุกต์เข้ากับระบบ นั่ง debug อยู่ทั้งบ่าย ฮา ๆ (ไหนว่าไม่ยาก) เลยบันทึกเอาไว้เดี๋ยววันหลังใช้อีก
แก้แค่ที่เดียวคือ
app/Http/Controllers/Auth/AuthController.php
โดยไป Override function getCredentials
protected function getCredentials(Request $request)
{
$request["isActiv"] = TRUE;
$request["usernam"] = $request["email"];
return $request->only(filter_var($request["email"], FILTER_VALIDATE_EMAIL) ? "email" : "usernam", "password","isActiv");
}
โดยก่อนหน้านี้ใน table user เราต้องมี username อยู่ก่อน และใน code อีกอันที่ผมใช้คือ isActive คือถ้า user สมัครมาเองจะยังเข้าใช้ไม่ได้จนกว่าผมจะ active ให้ ก็เช่นเดียวกับ username ต้องมี isActive ใน table user ก่อน
อธิบายคร่าว ๆ ก็คือ เราจะใช้ค่าอะไรบ้างในการ login เข้าระบบ ผมใช้ สามค่า คือ username||email , password, isActive โดยกำหนดค่าให้ก่อนว่าค่าทั้งสามนี้จะใช้อะไร
$request['isActive'] = TRUE;
เราจะใช้ isActive เป็น 1 หรือ TRUE
$request['username'] = $request['email'];
ถ้าเรา login ด้วย username เราก็จะใช้ค่าจาก input หน้าเว็บตรงนี้ตัวแปรเป็น email เพราะไม่ได้แก้หน้าเว็บ
return $request->only(filter_var($request['email'], FILTER_VALIDATE_EMAIL) ? 'email' : 'username', 'password','isActive');
เราก็ return ให้ Laravel ไปตรวจสอบอีกครั้ง โดย return สามค่าที่กำหนด แต่ username และ email ต้องมีการตรวจสอบเพิ่มเติมว่าถ้ากรอกมาไม่ใช่ email ก็จะส่ง username เข้าไปตรวจสอบ