Controller ของคุณกำลังทำงานหนักเกินไป

ลองเปิด Controller ของคุณขึ้นมา แล้วดูที่ method store ของคุณ

มันมีโค้ดถึง 40 บรรทัดเลยหรือเปล่า? มันเริ่มด้วยบล็อก validation ขนาดใหญ่ ตามด้วย if หลายๆ ตัว จากนั้นเป็น business logic และจบด้วยการ return ใช่ไหม?

Controller ของคุณกำลังทำงานที่ไม่ใช่หน้าที่ของมัน

Controller มีหน้าที่เพียงอย่างเดียวที่เรียบง่าย คือรับ request, เรียกใช้ service เพื่อแก้ปัญหา และส่ง response กลับไป ให้ลองนึกภาพว่ามันคือพนักงานเสิร์ฟ พนักงานเสิร์ฟมีหน้าที่นำอาหารมาเสิร์ฟ แต่พวกเขาไม่ได้เป็นคนทำอาหาร

เมื่อคุณใส่ทั้ง validation, authorization และการประมวลผลข้อมูลไว้ใน controller มันจะกลายเป็นความวุ่นวาย คุณจะลงเอยด้วยโค้ดอสูรกายยาว 80 บรรทัดที่ไม่มีใครอยากแตะต้อง

Laravel มีโซลูชันที่สร้างมาให้พร้อมใช้งานแล้ว นั่นคือ: Form Requests

เลิกเขียน logic ของ validation และ authorization ซ้ำๆ ในทุก method เสียที จงใช้หลักการ Single Responsibility Principle คลาสหนึ่งควรมีเหตุผลในการเปลี่ยนแปลงเพียงอย่างเดียว Controller ควรเปลี่ยนเมื่อ flow ของ request เปลี่ยนไป ไม่ใช่เปลี่ยนเพียงเพราะกฎการ validation เปลี่ยน

รันคำสั่งนี้เพื่อสร้าง request class โดยเฉพาะ: php artisan make:request StorePostRequest

ย้าย logic ของคุณเข้าไปในคลาสใหม่นี้ โดย Form Request จะจัดการ 3 เรื่องหลัก ได้แก่:

Authorization: ใช้ method authorize เพื่อตัดสินใจว่าผู้ใช้สามารถดำเนินการนั้นๆ ได้หรือไม่ หากส่งค่ากลับเป็น false Laravel จะส่ง error 403 กลับไปให้โดยอัตโนมัติ

Validation: ใช้ method rules เพื่อกำหนดเงื่อนไขของข้อมูลที่ต้องการ

Data Preparation: ใช้ prepareForValidation เพื่อทำความสะอาดหรือแปลงข้อมูลก่อนที่การ validation จะเริ่มทำงาน ซึ่งเหมาะมากสำหรับการสร้าง slug หรือการจัดรูปแบบเบอร์โทรศัพท์ให้เป็นมาตรฐาน

เมื่อคุณย้าย logic เหล่านี้ออกไป Controller ของคุณจะเล็กลง และอาจจะมีหน้าตาแบบนี้:

public function store(StorePostRequest $request)
{
    $post = Post::create($request->validated());
    return redirect()->route('posts.show', $post);
}

แค่นั้นเอง เพียงแค่สองบรรทัด

Controller จะยังคงความคลีน (lean) ไว้ได้ เพราะ Laravel จะรัน validation และ authorization ให้เสร็จสิ้นก่อนที่ method จะเริ่มทำงานด้วยซ้ำ หากข้อมูลไม่ถูกต้อง ผู้ใช้จะได้รับ error ทันที

ข้อควรระวัง: อย่าใช้ Form Requests กับทุกอย่าง หากคุณมี route เล็กๆ ที่มีเพียง field เดียวแบบง่ายๆ ให้เขียน validation ไว้ในบรรทัดนั้นเลย (inline) แต่จงใช้ Form Requests เมื่อ logic เริ่มซับซ้อนขึ้น, มีการใช้งานซ้ำ หรือเกี่ยวข้องกับสิทธิ์การใช้งาน (permissions)

นอกจากนี้ อย่าใส่ business logic ไว้ใน Form Request การคำนวณและการอัปเดตฐานข้อมูลควรอยู่ใน Service layer

ลองหา Controller ที่เละเทะที่สุดของคุณดูวันนี้ แล้วแยก validation ออกไปไว้ใน Form Request แล้วคุณจะเห็นมันเล็กลงอย่างน่าอัศจรรย์

method store ที่ใหญ่ที่สุดที่คุณเคยเห็นคืออะไร? บอกเราในคอมเมนต์ได้เลย

Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o