Controller ของคุณกำลังทำงานผิดหน้าที่

เปิด controller ของคุณขึ้นมา แล้วมองหา method store

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

Controller ของคุณกำลังทำงานที่ไม่ควรทำ

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

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

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

รูปแบบที่ไม่ดีที่พบได้บ่อยมีลักษณะดังนี้:

  • การตรวจสอบข้อมูล input
  • การตรวจสอบสิทธิ์ของผู้ใช้ (permissions)
  • การแปลงรูปแบบข้อมูล (transforming data)
  • การรัน business logic

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

ใช้คำสั่งนี้เพื่อแก้ไข: php artisan make:request StorePostRequest

คำสั่งนี้จะสร้างไฟล์เฉพาะสำหรับ logic ของ request ของคุณ ให้ย้าย 3 สิ่งนี้เข้าไปไว้ใน Form Request:

  • Authorization: ใช้ method authorize() เพื่อตรวจสอบสิทธิ์
  • Validation: ใช้ method rules() เพื่อกำหนดเงื่อนไขของข้อมูล
  • Data Preparation: ใช้ prepareForValidation() เพื่อทำความสะอาดหรือจัดรูปแบบข้อมูลก่อนการ validation

คราวนี้ลองกลับไปดู controller ของคุณอีกครั้ง:

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

ตอนนี้ controller เหลือเพียงสองบรรทัด และกลับมาทำหน้าที่เป็นพนักงานเสิร์ฟอีกครั้ง

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

ปฏิบัติตามแนวทางเหล่านี้:

  • ใช้ validation แบบ inline ได้หากมันสั้นและใช้เพียงที่เดียว
  • ใช้ Form Request หากการ validation เริ่มซับซ้อนขึ้น, มีการใช้ซ้ำ หรือรวมการตรวจสอบสิทธิ์ (authorization) เข้าไปด้วย
  • อย่าใส่ 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