Ben üzerinde çalışıyorum bazı projeler için kendi el haddelenmiş PHP MVC framework var. Ben ilk çerçeve yarattığı zaman, bir yönetici CMS binanın bağlamında oldu. Bu nedenle, model, görünüm ve denetleyici arasında çok güzel bir-bir ilişki vardı. Tek bir model haritalar DB, tek bir satır var. Kontrolör modeli yükler ve (örneğin, bir düzenleme forma olarak) işlenecek görünümüne geçirir. Güzel, temiz ve kolay.
Ancak, şimdi ben sitenin ön ucunda üzerinde çalışıyorum ki, şeyler yapışkan alıyorsanız. Bir sayfa her zaman tek bir model bir görünüm değildir. Bu 20 kullanıcıları (her biri bir kullanıcı modeli) ile bir kullanıcı dizin listesi olabilir. Ayrıca, bu tür pagination gibi istek hakkında meta, (geçerli sayfa, toplam sayfa, sonuçların sayısı) ve / veya bir arama sorgusu olabilir.
Benim soru, görünümüne tüm bu verileri geçmek için temiz yolu nedir nedir?
Ben düşünüyorum Bazı seçenekler:
Have the controller create an array and pass that to the view as a single parameter:
class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $data = array() $data['models'] = $models; $data['currentPage'] = $current; $data['totalPages'] = $total; return $view->render($data); } } class UserView{ public function render($data){ // render the data } }
Create properties in the view class and have the controller populate them:
class UserView{ public $models; public $currentPage; public $totalPages; } class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->models = $models; $view->currentPage = $current; $view->totalPages = $total; return $view->render(); } }
Give the view some sort of generic HashMap or Collection object as a container which can hold any arbitrary number and name of data.
class UserView{ public $collection = new Collection(); // works like a Java collection } class UserController{ public function renderView(){ // assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->collection->add($models,'models'); $view->collection->add($currentPage,'currentPage'); return $view->render(); } }
Ben biliyorum ki teknik could işin herhangi bir, ama ben iyi seçim emin değilim, ya da ben eksik bir iyi veya daha geleneksel bir seçim varsa.