Satu pengontrol per halaman atau banyak halaman dalam satu pengontrol?

16

Saya hanya ingin beberapa saran mengenai cara MVC melakukan sesuatu. Saya menggunakan codeigniter dan saya bertanya-tanya apakah lebih baik memiliki satu kontroler per halaman untuk sebuah situs web atau memiliki satu controller untuk semua halaman?

Katakanlah saya memiliki situs web sederhana tempat Anda dapat mengunjungi beranda, masuk, membuat akun, dan menghubungi admin.

  1. Apakah lebih baik memiliki pengontrol ini: frontend (indeks), login, akun, kontak ATAU memiliki satu pengontrol yang disebut frontend atau apa pun dengan tindakan seperti login, createAccount, kontak?

  2. Kapan Anda tahu jika lebih baik menggunakan satu pengontrol dalam suatu situasi?

Rushino
sumber
Saya selalu hidup dengan kredo: Satu Pengendali untuk Memerintah mereka semua, dan dalam Kegelapan Mengikat mereka. (Tidak juga, tapi saya suka suaranya. :-)
Peter Rowell

Jawaban:

16

Lebih baik memiliki controller per unit logika, misalnya AccountController (login, registrasi), PagesController (rumah, kontak), Backend -> PagesController (buat, edit, hapus), UsersController (buat, edit, hapus) dan sebagainya.

Santas
sumber
Bagaimana Anda mewakili situs web dengan bidang tesis ini: rumah, masuk, akun, kontak. Apakah Anda menggunakan 2 pengontrol seperti contoh Anda? jika Anda pergi ke localhost / itu membuka homecontroller maka jika Anda pergi localhost / kontak secara teori seharusnya tidak pergi ke contact controller? dan apa yang Anda maksud dengan backend?
Rushino
Itu tergantung apa struktur halaman dan berapa banyak halaman yang Anda miliki. Saya akan membuat HomeController (home, contact) atau PagesController (home, contact OR details (id)). Sebagai contoh di ASP.NET MVC Anda memiliki HomeController default dengan halaman Home dan About.
Santas
Saya suka metode ini. Juga ClientController (atau apa pun yang Anda ingin menyebutnya) untuk Tindakan yang dipanggil melalui Jquery.Ajax yang tidak spesifik untuk bagian tertentu dari aplikasi Anda. yaitu dapat digunakan kembali dari pandangan Anda
Chris
Tampak jawaban yang tepat untuk saya. CodeIgniter menerima sub direktori untuk pengontrol yang memungkinkan untuk memisahkan pengontrol ke dalam zona sehingga saya bisa berakhir dengan dua pagecontroller (satu per zona). Terima kasih!
Rushino
Tetapi tidakkah Anda akan berakhir dengan Pengendali yang agak besar, meskipun tindakannya semua relatif? Atau tidak ada masalah?
Kid Diamond
4

@Rushino Anda memiliki dua 'aplikasi' di sini - front-end (untuk pembaca) dan backend (untuk admin). Untuk setiap grup fungsi, Anda memiliki pengontrol.

Masuk adalah grup seperti itu, yang mencakup pembuatan HTML formulir (bidang, panggilan tampilan), dan penanganan formulir (validasi, sambungkan dengan model). Jadi 'login' adalah pengontrol dengan dua tindakan - generateForm dan handleForm.

Halaman dibagi antara aplikasi ujung depan - yang hanya menampilkan halaman - dan aplikasi backend yang memungkinkan pengeditan, penghapusan, pembuatan, dan mungkin melihatnya dengan cara yang berbeda. Beranda adalah 'hanya halaman lain' setidaknya di ujung depan, jadi pas di dalam pengontrol halaman. Di backend, logikanya mungkin cukup berbeda sehingga dapat dibenarkan memiliki pengontrol yang sama sekali berbeda.

Untuk pengguna - jika pengguna dapat mendaftar sendiri, mereka akan memerlukan pengontrol frontend, tetapi jika tidak, semuanya harus dilakukan dengan pengguna hanya di backend.

Perhatikan bahwa masing-masing fungsi backend mungkin memerlukan generator dan pengendali. Hal-hal ini dapat dipecah menjadi file konfigurasi, meskipun, dengan plugin yang merupakan generator bentuk generik.

Singkatnya, ini terlihat seperti ini:

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
Dan Blows
sumber
Tunggu .. Anda mengatakan bahwa satu bagian mewakili satu aplikasi? cara menarik untuk melakukannya (dan mungkin cara melakukannya). Bertanya-tanya apakah codeigniter melakukannya dengan cara ini .. akan memeriksa. Saya harus yakin bahwa Anda dapat berpindah dari satu aplikasi ke aplikasi lain tanpa melanggar sesi atau kondisi koneksi apa pun.
Rushino
1
@Rushino CodeIgniter dapat melakukannya dengan cara ini - Anda dapat meletakkan folder di dalam direktori Controllers. Perbedaan antara 'aplikasi' tidak pada tingkat basis data / model, tetapi pada tingkat pengontrol / tampilan. Alasan pemisahan adalah karena backend Anda melakukan hal yang sangat berbeda, seringkali dengan desain yang sama sekali berbeda. Ini membantu dengan keamanan, karena Anda dapat membatasi IP seluruh direktori backend. Dan itu membantu pengembangan karena Anda dapat mengerjakan backend tanpa memengaruhi frontend.
Dan Blows
2

Saya pikir Anda harus menggunakan Pengendali per unit bisnis, seperti OrdersController untuk semua operasi yang terkait dengan pesanan dan semacamnya. Saya menyadari bahwa dalam kasus ini, Pengontrol mendapatkan BESAR, tetapi kami masih dapat menggunakan kelas pembantu untuk mendelegasikan hal-hal seperti inisialisasi model dan kelas parsial untuk menyebarkan tindakan dalam file terpisah.

Misalnya saya dapat memiliki OrdersControllerCreate.cs and OrdersController file List.cs untuk masing-masing kelas OrdersController dengan set Actions yang sesuai. Membuat segalanya lebih bersih dan tetap membuat operasi pesanan terpusat dalam satu kelas pengontrol

Hanya 2 sen saya.

Luis Aguilar
sumber
0

Saya pikir Anda bisa mengambil pendekatan yang berbeda:

Satu pengontrol utama sebagai pintu depan yang mengirimkan permintaan ke pengontrol tertentu. Dengan cara ini Anda bisa menggunakan pengontrol depan ini untuk memeriksa hal-hal umum seperti otentikasi pengguna, analitik google, dan hal-hal umum lainnya yang ingin Anda lakukan dan menjaga struktur MVC murni.

Ini bukan ide saya, tetapi Symfony Framework bekerja dengan cara ini sehingga saya dapat memberi tahu Anda bahwa dari pengalaman saya, ini adalah cara yang sangat bagus dan elegan untuk mengimplementasikan frontend.

guiman
sumber