Nasıl MVC bileşenleri birbirine uyacak mı?

5 Cevap php

MVC bileşenleri web üzerinde birbirine uygun şekillerde örnek bir dizi gördüm.


The Controller retrives data from the Model and passes it to the View

Bu biraz ayrıntılı ve dağınık görünüyor.

$model = new Model;
$view = new View;
$view->set('foo', $model->getFoo());
$view->display();

The Controller passes the Model to the View

Ne Görünüm birden Modeller veri ihtiyacı varsa?

$model = new Model;
$view = new View($model);
$view->display(); //View takes what is needed from the Model

The Controller passes the View to the Model

$view = new View;
$model = new Model($view);
$view->display(); //Model has told the View what is needed


Şeyleri gitmek için "en iyi" yolu bu hangisidir? Yok eğer, nedir?

5 Cevap

The Controller retrives data from the Model and passes it to the View

Dediğin gibi ayrıntılı ve dağınık. Ama bu MVC felsefesi ile en uygun çözümdür.

The Controller passes the Model to the View

Çok geçerli görünüyor. Ancak bazı model yöntemi istemek için görünüm için gerekli olacak. MVC ruhu değil gerçekten Hangi. Sizin görünüm yalnızca bağlam hakkında önemsemeden, kendisine sağlanan verileri işlemek gerekir.

The Controller passes the View to the Model

Şunu unutma. İşte o dağınık.

Eğer 'model' (potansiyel uygulamalar arasında kullanılır) merkezi eseridir, ve bir 'view' (ya da olmayabilir) modele farkında olabileceğini düşünün ama (tanım olarak) bir ise cevabı kendiliğinden açıktır (potansiyel soyut) bir model ve uygulamalar karşısında yine, potansiyel olarak kullanışlı bir 'görünümü'. 'Controller' yönetmek etkileşimleri ve desen çoğu uygulama belirli bir unsurdur, bu nedenle kesin modeli ve görünümü detayları hakkında bilmek gerekiyor.

If the view is specific to a given model, you can use option 2. If the view is for an abstract model (and you can use it to display info from a set of models), you use option 1.

Seçenek 3 yanlıştır.

Asıl soruya cevabı:

  1. The Controller retrives data from the Model and passes it to the View

MVC aslında çok düzgün ve temiz. Bu adresleme ne hatırlıyorum:

  1. Kodu yeniden (Modeller kontrolörleri veya görünümleri güvenmeyin. İzlenme kontrolörleri veya modellere güvenmeyin. Kontrolörleri app özeldir.)

  2. Mantık Ayırma (MySQL LDAP için bir kimlik doğrulama arkaplana değişen Örneğin bir görünüme 0 değişikliği gerektirir. Bir görünümün düzenini değiştirme modeline 0 değişikliği gerektirir. Veritabanı tablo yapısını değiştirme denetleyicisi veya görünüme 0 değişikliği gerektirir).

Eğer formları otomatik bir tablo yapısı oluşturulmasını istediğiniz IF - Şimdi görüşleri, şimdi (sıkıca bağlanmış) tabloya bağlı. Tabloda bir değişiklik (potansiyel otomatik olsa) görünümünde bir değişiklik gerektirir. Bu daha az kod alabilir - ancak görünümü artık bir kod yeniden stand noktadan güvenilir.

Benzer şekilde (MVC) görüşleriniz şablonları başka bir şey olmalıdır. Sadece değişkenler - hiçbir mantığı olmamalıdır. Tüm "mantık", iş kuralları, aka denetleyicisi bulunur. Modeller veri almak ve normalize tutmak için biliyorum. Gösterim verilerini görüntülemek için biliyorum. Kontrolör verileri uygulamak için verileri kullanmak ve hangi görünümler ne zaman bilir.

MVC sıkı 3 katmanlı mimarisi. İki katmanlı mimari bazı uygulamalar için geçerlidir. Hızlı mashup ve bir bağlı mimarisi uygun olabilir "bok yaptırılır" (ama stil puan alamadım) için.

Umarım bu yardımcı olur.

IMHO, seçenek 2 (the Controller passes the model to the view) en uygun dekuplajı ve endişeleri ayrılmasını korur. Görünümü çoklu modellerini ihtiyacı varsa, geçirilen modeli görünüm tarafından ihtiyaç duyulan her modeli içeren kompozit bir veri türü olmalıdır. "Görünümü tarafından gerekli her model" genellikle ViewModel adlandırılan, genellikle basık olduğunu sizin varlık modelinde farklı ve ekran için akıcı.

Seçenek 1 (the Controller retrives data from the Model and passes it to the View) 2 seçeneği oldukça benzer, ama denetleyicisi az mantığını yerleştirir çünkü seçenek 2 tercih olduğunu iddia. MVC, mümkün olduğu kadar çok mantık mümkün olduğunca basit denetleyicileri ve incelemeler bırakarak modelinde olmalıdır.

Ben ikincisi ile aynı fikirdeyim. Daha durumsal uygulamalarda olabildiğince MVC web üzerinde gerçekten uygulamaya olamaz. Çoğu web MVC uygulamaları sizin kontrolörleri mantık koymak ve ham veri erişimi için modelini kullanmak var. Ben daha doğru yolu model mantık koymak olduğunu düşünüyorum. Modeli içinde yapılır ham veri erişimi bir zımni 4 tabakası neredeyse yok, ancak modeli aynı zamanda bu veri anlam veren ve görünümünü güncelleştirmek için sorumludur.

wikipedia article oldukça iyi açıklıyor.