PHP Görünüm MVC denetleyicisi verileri Passing

3 Cevap php

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.

3 Cevap

Ben ... (ya da isterseniz, Fat Models Thin Controllers) Fat Models, Skinny Controllers kavramını tavsiye edeceğim

Başka bir deyişle, modeliniz çok katı olduğunu - Bir RowDataGateway gibi sadece bir şey göstermek için bir model ipe son derece sınırlayıcı.

Aslında, iyi modeller Eğer her bir veritabanından veri okuyorsanız gerçeğini gizlemek düşünüyorum. Gerçekte, veri metin dosyaları, ya da bir web servisi, ya da her türlü olabilir, çünkü. Eğer övmek DBal başka bir şey gibi Model tedavi, sadece uzakta düşünme "veriler sadece veritabanından gelen" bir şekilde kırmak izin vermez senin kontrolörleri sıkı birleştiğinde koduna sahip kendinizi mahkum.

Ben popüler MVC / çiftleşmiş çerçeveler uygulanan ilk iki yöntemlerin her ikisi de gördüm.

django görünümüne görünüm şablonu doldurmak için kullandığı değişkenlerin bir sözlük geçen, ilk yöntemi kullanır.

smarty Smarty nesnesi oluşturma ve kap her özelliklerine değerler atayarak, ikinci yöntemi kullanır.

Üçüncü yöntem, esasen küçük mimari farklılıklar ile, ikinci olarak aynı olacak gibi görünüyor.

Gerçekten, ben zaten düşünce değil bir şey söylemedim sanırım. Temel olarak, bu tüm sesler fikirleri vardır, bu yüzden size en rahat hissediyorum ne olursa olsun uygulamak.

Ben kullanmak birinde, otomatik olarak görünümü yöntemleri ve özellikleri erişebilirsiniz denetleyicisi bir görünüm özelliğine sahiptir. Tüm kamu özellikleri görünümü görünümünde sonra erişilebilir '$ this' görünümü, kendi nesneleri bağlamında oluşturulur beri.

Denetleyicisi:

$this->view->myVar = 'test';

Ve görünümünde:

$this->myVar; // 'test'

Aynı görünüm nesnenin iki ayrı örnekleridir beri aynı düzeni için de geçerli:

$this->layout->myVar = 'test';

Ve sonra düzeni:

$this->myVar; // 'test'

Çerçevesi özel olarak kullanılan, ancak genel halka yayımlanan üzeredir. Bunu yardım ederdim düşünüyorsanız ben ondan bazı kod göndermek için mutlu olurdu. Basit cevap genelde iyi cevap olduğunu unutmayın.