Bu sorunun eski olduğunu biliyorum, ancak tek cevabın resmen kabul edilmediğinden buradaki düşüncelerimi buraya atarım ve bu da gelecekteki araştırmacılara yardımcı olabilir. Sorunuzu doğrudan cevaplamak için, yukarıdakilerin hiçbirini söylemem. Denetleyici ile repo/mapper nesneleri arasındaki etkileşimi sağlamak için ekstra bir hizmete, bir "yönetici" ye sahip olmayı tercih ederim. Her model, oluşturulmasını, güncellemelerini ve silinmesini yönetmek için özel bir yöneticiye sahiptir.
Kontrol
bir uygulamanın yapıştırıcı olarak kontrolör düşünün. İstediğimiz konuları olabildiğince çok parçaya ayırabiliyoruz, ancak bir nokta boyunca, bir şey hem görüş tarafını hem de model tarafını anlamak zorundadır ve bu nesne kontrolördür. Bu söylendiğine göre, denetleyicilerin sıska olması gerektiğine inanıyorum, bu yüzden denetleyicinin tek işi bir isteği bir yanıtla eşleştirmek. Herhangi bir ara işlem başka bir yere atılmalıdır.
Bir CRUD uygulamasında, yeni nesnelerin oluşturulmasına ve denetleyicide kalmasına izin vermek oldukça kolaydır; hatta bir kez daha yapılır, çünkü yapıştırmanın yalnızca birkaç satırı vardır. Ya nesne yaratımı önemsiz değilse? Birçok karmaşık ilişkiyle bir uygulamayı sürdürüyorum ve kullanıcı tarafından gönderilen bir oluşturma çoğu zaman aynı anda birçok nesnenin oluşturulmasını gerektiriyor. Bu, denetleyici ve modele dayalı bir ortamda sürdürmek için uygun değildir. FormHandler ve Yöneticisi:
Ekstra Servis Katmanlar
bu işlemek için, ben 2 ekstra hizmet katmanları oluşturduk. Form her gönderildiğinde, form içeriği form işleyicisi katmanına gönderilir. Form işleyicileri, gelen ve normalleştiren form verilerinin anlaşılmasından sorumludur. Form işleyicileri daha sonra verileri işlemek için uygun yönetici nesnelerine aktarabilir. Yönetici nesneleri verileri işler ve alan katmanını günceller. Model oluşturmaya, modelleri değiştirmeye ve arka uca devam etmekten sorumludurlar.
Bu şekilde, denetleyiciler İstek, Yanıt, Form (muhtemelen, çerçeveniz sunucu tarafı form oluşturmayı destekliyorsa) ve FormHandler hakkında bilgi sahibidir. Form işleyicileri, Form (veya form verileri) ve Yöneticisi bilgisine sahiptir. Müdür Deposu, Mapper ve Model bilgisine sahiptir. Şimdi, Bildirimler, Modeller ve Haritalayıcı ile tek etkileşim noktasıdır ve Form verisi ya da İstek ya da Müdahale hakkında hiçbir bilgisi yoktur. Kapak tarafında, denetleyiciler ve form işleyicileri, etki alanı katmanı verileri veya kalıcılığı hakkında bilgi sahibi olmanıza gerek yoktur.
Bu tasarım sayesinde Sonuç
: buldum
Controller -> FormHandler -> ModelManager -> Mapper
tüm sınıfları artık birim test edilebilir dolayı güzel olmanın endişeleri ayrılığı (bir dereceye kadar bile kontrolörleri) vardır bölünmüş ve tek etkileşim noktası, yinelenen mantığı önlemek için bir nimettir.
Notlar
aklımda Repo sadece veritabanını sorgulamak için - bu bir şey varsa yeni şeyler yaratmak değil, onu soruyorum.
bu durumda benim deneyim Symfony 2 ve Doctrine kullanarak dan
2.
YMMV; Örneğin. form katmanı gereksiz olabilir, ancak form/görüntü verisinden alan modellerinin anladığı veri dönüşümü için çok kullanışlı buldum.
Bu durumun harika bir analizi. Diğer düşünceleri duymak beni çok heyecanlandırıyor, ama kesinlikle Kontrolörde oluşturmanın kabul edilebilir olduğunu düşünüyorum. Ancak, belki daha az esneklik? Örneğin, DB'deki Kullanıcı tablosuna yeni bir alan eklersem, UserEntities yaratan her bir Denetleyiciye gitmeyi hatırlamalıyım. – johnnietheblack
Büyük olasılıkla söz konusu yeni bilgileri kabul eden görünümü düzenleyeceksiniz (geleneksel bir web uygulaması hakkında konuştuğumuzu varsayarak), düzenleyiciyi düzenlemek çok fazla değil. Görünümü düzenlemek için kontrol etmeyi unuttuğunuz denetleyiciyi düzenlemeyi unutursanız, şansınız vardır. Ayrıca, basit bir global arama, sınıfınızın nerede kullanıldığını bulabilir. – Crashspeeder
Bir başka iyi nokta, ve eğer Kontrolör cevap ise, o zaman üzülmüyorum ... ama yine de, bazı yerlerde aynı örnekleme sürecini "suçlu" yazan bir parçam var. Yok hayır? Aynı şekilde, yeni tablo değişikliğini yansıtacak form alanları eklemek için yalnızca tek bir dosyada değişiklik gerektirecek şekilde benim görüşlerim ayarlanmış olur. – johnnietheblack