MVC - Nasıl gerçek dünyada çalışır?

3 Cevap php

Ben hesap ve termometrelerin önemsiz MVC örnekler çok okudum ama ben gerçek dünya uygulamaları için desen haritası gibi olamaz.

Eğer daha karmaşık bir senaryo olduğunu varsayalım. Eğer sepetinize eklemeden önce giriş kullanıcıların gerektiren bir web sitesi alışveriş sepeti söylüyorlar. Öncelikle, kullanıcı ürün sayfasını (/ ürün / ayrıntı) görür ve tıklamalar bir öğeyi (/ cart/add/207366) ekleyin. Kullanıcı giriş yapmış değil ama onlar alışveriş sepeti görünümü (/ sepeti / list) götüren, akışı hakkında akıllı olmak, daha sonra oturum açma sayfası (/ user / login) ziyaret etmek gerekir ve bu yüzden. Oradan da alışverişe devam etmek orijinal ürün detay sayfasında geri bağlayabilirsiniz.

Kullanıcıları, usercart ve ürünler: Kullanıcının biz 3 veritabanı tabloları var diyelim. / Modeli (ler) bu durumda ne olduğunu? Bu tüm akış ShoppingCart modelinin addProductToCartFlow fonksiyonu haline kapsüllü olurdu? Bu giriş / kimlik doğrulaması için kullanıcılar tablo erişmek ve sepeti içine Ürün detayları / fiyat çekmek için ürünler tablo erişmek gerekir beri, biraz dağınık gibi görünüyor.

Bunun yerine, sen ShoppingCart modeli kendi kendine yeten ve sadece arabası vb öğeleri kaldırarak, öğeleri ekleyerek ele söyleyebilirim? Kullanıcı olan oturum açan "mantık" daha sonra başka bir yerde kontrol olurdu: belki denetleyicisi kendisi? Bu, kontrol gibi "iş mantığı" yeraldığını ile kontrolörler çok MEŞGUL yapmak istiyorsunuz eğer kullanıcı oturum açmış olan, alışveriş sepeti vb, boş ve modeli sadece veritabanı tablo için güzel bir isim olursa kontrol.

Ya da belki, giriş-veya giriş-çıkış olmanın çok gerçeği gibi işlevleri ile ilgilenen bir UserAuthentication modelinin bir parçasıdır. Ya da belki kullanıcı bir giriş sayfası veya bir sepeti sayfası, ya da bir ürün detay sayfasında olması gerektiği konusunda bize bir UserPageState modeli gerek?

Sizce bu durum için en iyi MVC tasarım nedir?

3 Cevap

Sizin modeller, aslında, iş nesnelerdir. (Çoğu durumda müşteri başına muhtemelen bir sepeti, ama kim söylüyor?) ShoppingCarts Kullanıcıları ve Ürünleri olacak. / Cart/add/207366 kullanıcı yetkili olup olmadığını görmek için kontrol edin ve / login değilse için kontrolöre geçecek için denetleyicisi yöntemi - Sen akışını götürmek denetleyicileri olacak. Giriş kontrolörü sonra tekrar sepetinize öğe eklemek gerekir / cart/add/207366 için kontrolöre doğru bilgi geçmek için yeterince akıllı olmalıdır.

Denetleyicileri Cart.AddItem () çağırır, ancak iş mantığı alışveriş sepeti modeli içinde bulunan - bu öğenin, Kontrolörleri bilmek ya da bakım olmazdı Kullanıcı, vb dayalı bir tercih edilen müşteri indirim fiyatını yukarı görünebilir bu konuda. Kontrolörler bu (View render ne belirlenmesi) kendi işini etkilediği gibi do, (bu uygulama için önemli değilse) bir kullanıcı oturum olup olmadığını bilmek gerekir. Onlar müşteri tercih edilir olmadığını bilmek gerekir, ya da kredi beklemeye veya iş mantığı için önemli ne olursa olsun diğer koşullar yok. İşte tüm modelleri tarafından işlenir oldu.

Ben basit sitelerden her tablo için bir model olacak. Benim denetleyicileri modellerin herhangi bir sayıda kullanabilirsiniz. Bir müşteri ve bir arabası ayrılmış değil daha karmaşık örnekler, ben hem tablolar hakkında bilmek yöntemleri ile birlikte bu getiren bir modeli var.

Modellerin çok, çok ince kontrolörleri ve görünümlerinde sadece HTML var. Sizin denetleyicileri denetleyicileri sonuç almak "eğer" tabloların bir şey var olmalıdır. Sizin views "Fors" bu döngü ve tekrar sonuçları, fakat başka hiçbir mantığı olabilir. Hiç bir HTML etiketleri yerde ama senin görüşlerinde.

Yani cevaplar soru için, size aşağıdaki modelleri olabilir

  • Kullanıcılar [kullanıcıların tabloya alır]
  • Cart [Sepeti tabloya almak]
  • Ürün masa ve kullanıcıların tablo]
  • Ürünler [çarpım tablosundan içine alır]
  • Siparişler [kullanıcıları, arabaları ve (temel basit örnek olarak) ürünleri tablo]
  • Sitenizde kullanıcıların durumunu izler bir model PageState

Aşağıdaki denetleyicileri

  • Cart
  • Kullanıcılar
  • ürünleri

Kontrolörler çok uzun belki, ama her eylem, belirli bir iş, küçük bir tanesidir. Ben bu eylemlerin güzel ve kendilerini kısa sürece 10 eylemleri ile bir kontrolör, ok sahip olduğunu düşünüyorum.

Bu eylemleri çağrı modelleri oldukça uzun olabilir ve genellikle iş mantığı için hesap olacaktır. Ben de iş mantığı olmayan şeyler yapmak için yardımcı sınıfları kullanabilirsiniz, ancak hala kritik. Güvenlik ve doğrulama gibi düşünün.

Ve manzaralı bir bütün sülük. Ürün özetinde için giriş kutusunda, ürün detay, kasada her aşamasında, makbuz, HTML biçimli e-posta alındığı, kategori listeleme, menüler, altbilgiler için görünümleri için sepeti için İzlenme. Çok ve manzaralı bir sürü.

Tüm kontrolörler böylece ve üzerinde bazı şeyleri yapabileceği miras bazı ApplicationClass olmasını isterim.

Sen php belirtildiği, böylece şablonu oluşturan görüşlere sahip, ama ASP yaptım eğer kısmi incelemeler yapan bir masterpage olurdu. Ben Ruby veya Python tam olarak ne olduğunu bilmiyorum, ama benzer.

Ben meşgul denetleyicileri hakkında endişe bir endişe olmamalı düşünüyorum: bu onların amacı bulunuyor. Eklenti etkiye sahiptir sepeti kontrolörü kullanıcı oldukça iyi bu yakalanan Yukarıdaki iki cevaplarda oturum olup olmadığını görmek için kullanıcıların denetleyicisi veya kimlik doğrulama yardımcısı üzerinde durulacaktır.

Ayrıca, yerine sayfaları için başka bir model oluşturma, sadece tabloda bir oturum değişkeni veya başka bir alanı kullanmak istiyorsunuz. Başka bir model gerçekten sadece şeyler zorlaştıracaktır, ve aslında kendini içerdiği olması gereken bir varlık temsil etmiyor. Ne zaman destesi için bir ihtiyaç ziyaret görüyorsunuz? Url Onun gerçekten sadece bir dize kullanıcı, oturum değişkenleri ile çok daha az kod ve bellek yoğun bir şekilde takip edebilirsiniz giriş formu, almak için geldi. Sadece addItem () o açtıysa görmek için kontrol var ve eğer oturum açma sayfasına yönlendirmek ve geçerli bir istek saklayın. Sonra bir kez yönlendirme değişken ayarlanmış olup olmadığını görmek için kontrol kaydedilir, ve eğer öyleyse ona gitmek ve sıfırlamak. Bu daha karmaşık bir şey için bir ihtiyaç görmüyorum.

Lütfen pastebin kod CakePHP gibi de görünüyordu. İyi bir seçim. Eğer yapabilirsen, fırında konsol ve iskele kod üretimi yararlanmak. Bu sizin için çok çok çok çalışır, ve sadece sizin için iyi şeyler bırakır.