Dengan konsep 'pengontrol kurus, model gemuk' dan penerimaan umum bahwa Tampilan dapat langsung memanggil Model ketika membutuhkan data untuk output, haruskah seseorang mempertimbangkan untuk menangani bagian 'dapatkan dan tampilkan' permintaan dalam Views dan bukan Pengontrol? Misalnya (berupaya menjaga kode cukup umum):
Pengendali
<?php
class Invoice extends Base_Controller {
/**
* Get all the invoices for this month
*/
public function current_month() {
// as there's no user input let's keep the controller very skinny,
// DON'T get data from the Model here, just load the view
$this->load->view('invoice/current_month');
}
}
Melihat
<?php
// directly retrieve current month invoices here
$invoices = $this->invoice_model->get_current_month();
// get some other display-only data, e.g. a list of users for a separate list somewhere on the page
$users = $this->user_model->get_users();
?>
<h1>This month's invoices</h1>
<ul>
<?php foreach ($invoices as $invoice) { ?>
<li><?php echo $invoice['ref']; ?></li>
<?php } ?>
</ul>
Bagi saya, ini masuk akal setidaknya dalam kasus-kasus di mana permintaan pada dasarnya hanya sebuah Tampilan. Mengapa Pengendali harus mengumpulkan dan meneruskan data ke Tampilan saat itu hanya dapat mengambilnya sendiri? Ini membuat Pengendali terbuka untuk pemrosesan murni 'Tingkat Aplikasi' (misalnya, menangani permintaan GET / POST, mengelola hak akses dan izin, dll.) Serta menjaga agar Model dapat digunakan kembali dan semua hal baik lainnya.
Jika contoh ini diperluas untuk memungkinkan pengguna untuk memfilter hasil, Pengontrol hanya akan menangani POST dari formulir dan meneruskan filter ke tampilan, yang kemudian akan meminta data lagi, kali ini dengan filter.
Apakah ini pendekatan yang valid untuk mengembangkan aplikasi MVC? Atau apakah saya mengabaikan bagian penting dari peran yang harus dimainkan oleh Pengendali?
sumber
offers_model->get_latest()
dibuat? Menambahkan ini ke setiap metode di controller (seperti yang saya coba sebelumnya dengan bodoh) sepertinya berlebihan dan jelas-jelas KERING.offers_model->get_latest()
keProductViewModel
kelas dasar atau yang serupa.Tidak. Ini tidak benar. Lihat tidak bisa langsung memanggil Model. Tampilan seharusnya tidak memiliki akses ke objek Model, kecuali karena suatu alasan programmer telah mengekspos objek-objek tersebut ke View.
Itu pada dasarnya menghapus Controller, dan mengalahkan titik memilikinya.
Pengontrol tidak mengumpulkan data. Model melakukan pengumpulan data. Pengontrol memutuskan apakah data ini harus diteruskan ke tampilan. Tampilan hanya melakukan presentasi data.
Tidak.
Pengontrol memeriksa apakah data POSTed valid, maka ia meneruskan data ini sebagai opsi ke Model, yang kemudian akan meminta sumber data dan mengembalikan data, dan Pengontrol meneruskannya ke View.
Pengontrol beroperasi sebagai penangan untuk permintaan oleh browser. Dispatcher mengirimkan permintaan ke tindakan pengontrol, yang pada gilirannya, menyebarkan permintaan ke Model. Model berisi semua logika bisnis (ini adalah bagian yang gemuk), dan memberikan data kembali ke controller. Pengontrol kemudian dapat menyederhanakan dan menyesuaikan data sehingga lebih mudah bagi Tampilan untuk menyajikannya.
Maksud dari Tampilan adalah memisahkan struktur dan ketergantungan antara presentasi HTML dan DataSource. Meskipun ini bisa sulit. Tampilan tidak selalu menyajikan data yang datang langsung dari Model. Pengontrol sering menambahkan data tambahan yang relevan.
Saya yakin ada banyak tutorial di MVC. Saya sarankan membaca beberapa di antaranya.
sumber
Saya menemukan pertanyaan Anda sangat menarik karena saya mengalami masalah yang sama saat mempelajari Python baru-baru ini.
Sementara jawaban yang diberikan membuat argumen yang meyakinkan, saya pikir saya akan menambahkan pendapat lain yang saya temui di mana View mendapatkan status Model tanpa melalui Controller.
Saya tidak dalam posisi untuk mengatakan pendapat mana yang "benar", dan sejujurnya, saya sedikit lebih bingung setelah membaca jawaban di sini dan artikel yang ditautkan.
Teks lengkap artikel di sini .
sumber
Hal lain yang perlu dipertimbangkan adalah bahwa Anda tampaknya telah melakukan autoload secara otomatis
user_model
daninvoice_model
memungkinkan tampilan untuk mengaksesnya. Agar ini berfungsi dengan andal, Anda mungkin memuat ulang secara otomatis semua model Anda (karena$this->load->model()
hanya terlihat salah dalam tampilan, bukankah ...)Melakukan hal ini secara tidak perlu mengasapi tumpukan Anda dengan memuat banyak barang yang mungkin tidak pernah digunakan. Bagian dari alasan memiliki banyak model adalah untuk memungkinkan Anda merangkum logika terkait dan hanya memuat apa yang Anda perlukan untuk tugas yang diberikan.
Ini terlihat seperti CodeIgniter. Saya telah melakukan banyak pengembangan CI dan saya dapat membagikan dari pengalaman pribadi bahwa Anda benar-benar tidak ingin memuat secara otomatis lebih dari yang seharusnya. Coba tambahkan
$this->output->enable_profiler(TRUE);
konstruktor dan biola dengan autoloads (termasuk pembantu sepertidatabase
): Anda mungkin akan melihat perubahan signifikan dalam waktu muat dan eksekusi, tetapi terutama dalam alokasi memori.sumber
load->model
di sebagian besar pengendali dan metode. Tidak menggunakan fungsi pengisian otomatis yang benar adalah salah satu hal yang paling tidak saya sukai tentang kompatibilitas mundur CI, tapi itu adalah diskusi lainnya ...Jawaban singkatnya adalah bahwa bentuk sampel kode Anda tampak intuitif. Tampaknya ini adalah cara yang "mudah untuk dipikirkan".
Masalah # 1
Objek Anda
Model
danView
akan digabungkan dengan erat.Jika Anda harus menambah atau menghapus metode dalam
Model
, maka Anda mungkin harus mengubah yangView
sesuai.Pada dasarnya, MVC berasal dari pola Command and Observer . Anda ingin 'Model' independen yang dimanipulasi melalui antarmuka / API yang
Controller
dapat dihubungkan ke dalamnya (mis. Delegasi).Seringkali, ini berarti menyuntikkan
Model
danView
instans ke dalamController
dan menyimpannya sebagai properti dari kataController
. Kemudian, dengan menggunakan metodeController
(yaitu perintah) sebagai area kerja, berikan data keView
dariModel
( setelah `Model selesai memperbarui status aplikasi ).Melewati data (array, objek yang dapat diubah, apa pun) terus menyambung di antara
Model
danView
instance yang longgar . Jika Anda memasukkanModel
instance ke dalamView
, lihat Masalah # 1 di atas.Ingat,
Views
bisa berupa HTML, JSON, Teks, XML, header HTTP, YAML, atau hampir apa saja, mengikuti metodologi transfer state representasi (REST) .Dengan demikian, kunci untuk memahami bagaimana mengelola hubungan antara
Model
danViews
adalah melihat hubungan apa adanya, satu-ke-banyak (berpotensi)! Inilah yang persisnya dirancang oleh pola Observer .Sementara sebagian besar pengaturan hanya memiliki satu tampilan untuk diperhatikan pada satu waktu, tidak ada yang menghentikan pola arsitektur MVC dari memperbarui beberapa tampilan sekaligus! Bekerja dengan aplikasi web CRUD tradisional membuat orang berpikir dengan cara satu-ke-satu , tetapi itu adalah contoh terkecil tentang bagaimana pola Pengamat dapat bekerja ( satu-ke-banyak menjadi yang lain ).
Jadi, jika Anda memiliki satu
Model
dan banyakViews
, potensi sakit kepala memperbarui semuaViews'
kode implementasi karena Anda mengubah sesuatu diModel's
API / metode sekarang menjadi akut .Lewati data ke
Views
, bukan instance dariModels
.sumber