หนึ่งคอนโทรลเลอร์ต่อหน้าหรือหลายหน้าในคอนโทรลเลอร์เดียว?


16

ฉันแค่ต้องการคำแนะนำเกี่ยวกับวิธีการทำสิ่งต่าง ๆ ของ MVC ฉันใช้ codeigniter และสงสัยว่าจะดีกว่าถ้ามีคอนโทรลเลอร์หนึ่งตัวต่อหน้าสำหรับเว็บไซต์หรือมีคอนโทรลเลอร์หนึ่งอันสำหรับทุกหน้า?

สมมติว่าฉันมีเว็บไซต์ง่าย ๆ ที่คุณสามารถเยี่ยมชมโฮมเพจล็อกอินสร้างบัญชีและติดต่อผู้ดูแลระบบ

  1. มันจะดีกว่าไหมถ้ามีตัวควบคุมเหล่านี้: ส่วนหน้า (ดัชนี), เข้าสู่ระบบ, บัญชี, ติดต่อหรือมีหนึ่งตัวควบคุมที่เรียกว่าส่วนหน้าหรืออะไรก็ตามที่มีการกระทำเช่นล็อกอิน, createAccount, ผู้ติดต่อ?

  2. คุณจะรู้ได้อย่างไรว่าควรใช้คอนโทรลเลอร์ตัวเดียวในสถานการณ์ที่ดีกว่า?


ฉันมีชีวิตอยู่โดยความเชื่อเสมอ: ผู้ควบคุมคนหนึ่งจะปกครองพวกเขาทั้งหมดและในความมืดผูกพวกเขาไว้ (ไม่ใช่จริง ๆ แต่ฉันชอบเสียงของมัน :-)
Peter Rowell

คำตอบ:


17

จะดีกว่าถ้ามีคอนโทรลเลอร์ต่อหน่วยตรรกะตัวอย่างเช่น AccountController (เข้าสู่ระบบลงทะเบียน) PagesController (บ้านผู้ติดต่อ) แบ็กเอนด์ -> PagesController (สร้างแก้ไขลบ) UsersController (สร้างแก้ไขลบ) และอื่น ๆ


คุณเป็นตัวแทนของเว็บไซต์ที่มีพื้นที่เหล่านี้อย่างไร: บ้าน, เข้าสู่ระบบ, บัญชี, ที่อยู่ติดต่อ คุณจะใช้คอนโทรลเลอร์ 2 ตัวเหมือนตัวอย่างของคุณหรือไม่? ถ้าคุณไปที่ localhost / เปิด homecontroller แล้วถ้าคุณไป localhost / contact ในทางทฤษฎีไม่ควรไปที่ contact controller? และสิ่งที่คุณหมายถึงแบ็กเอนด์?
Rushino

มันขึ้นอยู่กับโครงสร้างของหน้าและจำนวนหน้าของคุณ ฉันจะสร้าง HomeController (home, contact) หรือ PagesController (home, contact หรือรายละเอียด (id)) ตัวอย่างเช่นใน ASP.NET MVC คุณมี HomeController เริ่มต้นพร้อมหน้าแรกและหน้าเกี่ยวกับ
Santas

ฉันชอบวิธีนี้ นอกจากนี้ยังมี ClientController (หรือสิ่งที่คุณต้องการเรียก) สำหรับการดำเนินการที่เรียกผ่าน Jquery.Ajax ซึ่งไม่ได้ระบุเฉพาะส่วนใดส่วนหนึ่งของแอปพลิเคชันของคุณ เช่นนำมาใช้ใหม่ได้จากมุมมองของคุณ
Chris

ดูเหมือนคำตอบที่ถูกต้องสำหรับฉัน CodeIgniter ยอมรับไดเรกทอรีย่อยสำหรับตัวควบคุมที่เปิดใช้งานการแยกตัวควบคุมออกเป็นโซนดังนั้นฉันสามารถจบด้วยตัวควบคุมหน้าสองหน้า (หนึ่งตัวต่อหนึ่งโซน) ขอบคุณ!
Rushino

แต่คุณจะไม่ได้ลงเอยกับผู้ควบคุมที่ค่อนข้างใหญ่ถึงแม้ว่ามันจะเป็นการกระทำที่เกี่ยวข้องกันทั้งหมดใช่ไหม หรือว่าไม่มีปัญหา?
Kid Diamond

4

@Rushino คุณมี 'แอพ' สองตัวที่นี่ - ส่วนหน้า (สำหรับผู้อ่าน) และแบ็กเอนด์ (สำหรับผู้ดูแลระบบ) สำหรับการใช้งานทุกกลุ่มคุณมีคอนโทรลเลอร์

เข้าสู่ระบบเป็นกลุ่มดังกล่าวซึ่งรวมถึงการสร้างรูปแบบ HTML (เขตข้อมูลเรียกดู) และการจัดการรูปแบบ (การตรวจสอบความถูกต้องเชื่อมต่อกับรูปแบบ) ดังนั้น 'เข้าสู่ระบบ' เป็นตัวควบคุมที่มีสองการกระทำ - generateForm และ handleForm

หน้าถูกแบ่งระหว่างแอพพลิเคชั่นส่วนหน้าซึ่งเพิ่งแสดงหน้า - และแอพพลิเคชั่นส่วนหลังที่ช่วยให้การแก้ไขการลบการสร้างและการดูพวกเขาในวิธีที่แตกต่างกัน หน้าแรกคือ 'หน้าอื่น' บนหน้าอย่างน้อยดังนั้นควรอยู่ในส่วนควบคุมของหน้า บนแบ็คเอนด์ตรรกะของมันอาจแตกต่างกันมากพอที่จะพิสูจน์ว่ามีคอนโทรลเลอร์ที่แตกต่างกันโดยสิ้นเชิง

สำหรับผู้ใช้ - หากผู้ใช้สามารถลงทะเบียนตัวเองพวกเขาจะต้องใช้ตัวควบคุมส่วนหน้า แต่ถ้าไม่ทุกอย่างที่ทำกับผู้ใช้เพียงไปในแบ็กเอนด์

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

โดยสรุปดูเหมือนว่านี้:

Frontend
  Pages
    View, Handle
  Login
    View, Handle
  Users
    Register (note that the handler can be the same as 'create' on the backend)
  Contact
    View
    Handle

Backend
  Users
    Create, Delete, Edit, Update, View
  Pages
    Create, Delete, Edit, Update, View

เดี๋ยวก่อน .. คุณกำลังบอกว่าส่วนหนึ่งเป็นตัวแทนของแอพไหม? วิธีที่น่าสนใจในการทำมัน (และอาจเป็นวิธีที่ทำ) สงสัยว่า codeigniter ทำอย่างนี้ .. จะตรวจสอบ ฉันต้องแน่ใจว่าคุณสามารถไปจากแอปหนึ่งไปยังอีกแอปหนึ่งโดยไม่ทำให้เซสชันหรือสถานะการเชื่อมต่อหยุดทำงาน
Rushino

1
@Rushino CodeIgniter สามารถทำได้ด้วยวิธีนี้ - คุณสามารถวางโฟลเดอร์ไว้ในไดเรกทอรี Controllers ความแตกต่างระหว่าง 'แอพ' ไม่ได้อยู่ที่ระดับฐานข้อมูล / โมเดล แต่อยู่ที่ระดับคอนโทรลเลอร์ / มุมมอง เหตุผลในการแยกกันคือแบ็กเอนด์ของคุณกำลังทำสิ่งที่แตกต่างกันมากซึ่งมักจะมีการออกแบบที่แตกต่างอย่างสิ้นเชิง มันช่วยเรื่องความปลอดภัยได้เพราะคุณสามารถ จำกัด IP ได้ทั้งไดเรกทอรีด้านหลัง และช่วยในการพัฒนาเพราะคุณสามารถทำงานกับแบ็กเอนด์โดยไม่กระทบต่อส่วนหน้า
Dan Blows

2

ฉันคิดว่าคุณควรใช้คอนโทรลเลอร์ต่อหน่วยธุรกิจเช่น OrdersController สำหรับการดำเนินการทั้งหมดที่เกี่ยวข้องกับคำสั่งซื้อและเช่นนั้น ฉันทราบว่าในกรณีนี้ตัวควบคุมจะได้รับมาก แต่เรายังสามารถใช้คลาสผู้ช่วยเพื่อมอบหมายสิ่งต่าง ๆ เช่นการเริ่มต้นโมเดลและคลาสบางส่วนเพื่อกระจายการกระทำในไฟล์แยกกัน

ตัวอย่างเช่นฉันสามารถมีCreate.cs and OrdersControllerไฟล์ OrdersController List.cs สำหรับคลาส OrdersController แต่ละรายการพร้อมชุดคำสั่งที่เกี่ยวข้อง ทำให้สิ่งต่าง ๆ สะอาดขึ้นและยังคงทำให้การดำเนินการตามคำสั่งรวมอยู่ในคลาสคอนโทรลเลอร์เดียว

แค่ 2 เซ็นต์ของฉัน


0

ฉันคิดว่าคุณสามารถใช้แนวทางอื่นได้:

หนึ่งตัวควบคุมหลักเป็นประตูหน้าที่ส่งคำขอไปยังตัวควบคุมที่เฉพาะเจาะจง วิธีนี้คุณสามารถใช้ตัวควบคุมด้านหน้านี้เพื่อตรวจสอบสิ่งทั่วไปเช่นการตรวจสอบผู้ใช้ Google analitics และสิ่งทั่วไปอื่น ๆ ที่คุณต้องการทำและรักษาโครงสร้าง MVC ให้บริสุทธิ์

นี่ไม่ใช่ความคิดของฉัน แต่Symfony Frameworkทำงานในลักษณะนี้ดังนั้นฉันสามารถบอกคุณได้ว่าจากประสบการณ์ของฉันนี่เป็นวิธีที่ดีและสวยงามมากในการใช้ส่วนหน้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.