Repository Pattern เขียนโค้ดที่เดียวก็พอมั้ย [Laravel, MVC]

Whiitez
Whiitez
Nov 5 · 2 min read

คำเตือน — เราจะข้ามส่วนที่เป็น Interface เพราะไม่ค่อยตอบโจทย์สำหรับระบบที่ไม่ได้ยิ่งใหญ่มาก เราเพียงต้องการการทำงานที่ง่ายและสะดวกขึ้นทั้งในตอนนี้และในอนาคตอันใกล้ (ถ้าไกล เดี๋ยวระบบมันใหญ่ขึ้นแล้ว ใช้ไม่ได้)…

เขียนโค้ดซ้ำแล้วซ้ำอีก|ทำไมแก้ที่นี้ แล้วต้องตามไปแก้ที่อื่นด้วย | เย้ย..โค้ดนี้มีอยู่ที่หน้านี้ไป copy มาก็เสร็จแล้ว | Controller หนึ่ง ยาว 3 ล้านบรรทัด ล้อเล่นๆ 5 พันพอ กันเอง << ใครชอบแบบนี้ ข้าม!!

เริ่มกันได้ โดยปกติแล้วเราก็จะคุ้นเคยกับ MVC กันอยู่แล้ว เพราะ Laravel เสิร์ฟมาพร้อมแล้ว แต่วันนี้เราจะเอา Repository Pattern เข้ามาช่วย ทำให้งานของเราลดลง (มั้ง) เพราะจะได้ไม่ต้อง User::find(8) เป็นสิบๆรอบ ไม่ต้องเห็น query หน้าตาเดิมๆ วนไป 5–6 function ใน 1 Controller โดยเราจะโยนงานนี้ไปให้ Repository ทำให้แทน ส่วน Controller ไว้จัดการพวก logic และติดต่อกับบ View ก็พอแล้วจะได้ไม่ยาวจนเกินไป และสะดวกต่อการแก้ไข ไม่ต้องไล่โค้ดให้ปวดตา

วัตถุดิบหลักในวันนี้ นั้นก็คือ Controller, Model และ Repository

จากภาพด้านบนก็จะเห็นว่า Controller และ Model นั้นโดนสั่งห้ามไม่ให้คบหากันโดยตรง จะส่ง จะรับ ก็ต้องผ่าน Repository ซึ่งมันเป็นรูปแบบนี้

Controller — รับ request เข้ามา แล้วจัดการส่ง request ที่พร้อมใช้งานไปให้ ส่วนใหญ่ที่ทำคือ validate request ที่เข้ามา
Repository — รับ request มาแล้วก็จัดการต่อเข้ากับฐานข้อมูล เอาข้อมูลมา ทำให้พร้อมใช้งาน ส่งกับไปให้ controller เอาไปใช้ต่อ
Model — ทำเหมือนเดิม query, relation, scope , …

มาลองเอาไปใช้ในโปรเจคกันดีกว่า

ของเดิมๆ ง่ายๆ ก็แบบนี้ ใช่ง่ายจริงได้ผลลัพธ์ถูกต้อง ไม่กี่บรรทัด

แต่ถ้าเรามีการเพิ่มเงื่อนไขเข้าไป เพื่อให้ได้ข้อมูลเท่าที่เราต้องใช้ แน่นอนมันต้องมีจำนวนบรรทัดมาขึ้น ในจะ If, ประกาศตัวแปร ซึ่งแท้จริง controller ต้องการแค่ list ของ property เพื่อที่จะส่งต่อไปให้ view แสดงผล
ถึงเวลาของ Repository

เริ่มด้วยการสร้าง Repository ที่ต้องการก็คือ PropertyRepository จากนั้นก็เรียกใช้ในหน้าของ Controller แล้วย้าย Model เข้าไปไว้ใน PropertyRepository แทน

จะเห็นว่า code ใน PropertyController เพิ่มมาเพียง 2–3 บรรทัด แต่ก็ยังได้ผลลัพธ์เท่าเดิม(เอ่อ ทำเพื่อ!!) แต่ถ้าเรามีหลายๆ Controller ที่ต้องติดต่อกับ Property Model เราไม่ต้องเขียนโค้ดเพิ่มแล้ว เราเพียงแค่เรียกใช้งาน PropertyRepository แล้วไปเพิ่มเงื่อนไขใน repository ให้ได้ตามที่เราต้องการ จากตัวอย่าง option ที่กล่าวถึงก็เป็น option แบบเล็กๆ น้อยๆ ถ้ามีอะไรที่เป็นพิเศษ อลังการ ก็ทำการแยกออกไปเป็น function ใหม่ใน Repository นี้แหละ เพราะเวลาแก้เราจะแก้ง่ายขึ้น เนื่องจากทุกฟังก์ชันที่ติดต่อกับ Model อยู่ในนี้ ถ้ามันพังจากการ ดึงข้อมูลมันก็พังอยู่ในไฟล์นี้แหละ

สุดท้ายนี้ Pattern ที่ดีที่สุดคือ pattern ที่ทำให้คุณทำงานง่ายขึ้น ใช้เท่าที่จำเป็น อย่าใช้เพราะอยากมีหรือตามคนอื่นนนนนน<< ตามนี้!!

ปล. หากมีข้อผิดพลาดอะไรก็ขออภัยด้วยครับ และยินดีรับคำเสนอแนะ

Rabbit Digital

Our Team is a part of BSS Holdings Company Limited, Develop and Provide technical solution for Rabbit Company. Follow us @rabbit-digital

Whiitez

Written by

Whiitez

Rabbit Digital

Our Team is a part of BSS Holdings Company Limited, Develop and Provide technical solution for Rabbit Company. Follow us @rabbit-digital

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade