Bir MVC modelinin DB'den gevşek bir şekilde bağlı tutulması?


9

Kodumu test edilebilir tutmayı seviyorum ve gevşek bağlanmış kod, test edilebilirlik ve modülerliği sağlamak için kesinlikle harika bir yol olduğu kanıtlanmış mevcut MVC çerçevem ​​için Bağımlılık-Enjeksiyon stratejisi ile gitmeye karar verdim.

Ancak, Tasarım desenlerindeki bir ustadan uzak olarak, Modellerimi Veritabanı bağlayıcı sınıflarından mümkün olduğunca gevşek bir şekilde bağlı tutmanın iyi bir yolunu bulmakta zorlanıyorum.

Bu nasıl yapılabilir?
Bu soru ile birlikte herhangi bir fiziksel kod sağlamadım, gerçekten yukarıda açıklanan sorunu anlamak için bir yöne yönlendirebilir bazı mantık / kod örnekleri veya bilgi için teşekkür ederiz.


Bu soru , bu konuyu yapılandırmak ve düşünmekle ilgili olduğundan, kodda uygulamaktan çok , Yazılım Mühendisliğine aittir .
Lasse V. Karlsen

Yanıtlar:


6

Bunun bir yolu, veritabanınızı tasarlamadan önce modellerinizi tasarlamaktır. Modellerinizi tasarlarken odak noktası, sorun etki alanındaki iş mantığını ve anlamlarını yakalamaktır. Bu, yalnızca varlıklar ve veri alanlarından fazlası da dahil olmak üzere, iş açısından anlamlı bir şekilde ele alınmalıdır. Bazı veri öğeleri diğerlerinden yorumlanır, bazıları diğerlerine bağlıdır, vb. Ayrıca, belirli bir öğe belirli bir değere ayarlandığında bir nesnenin dahili olarak nasıl tepki verdiği gibi ihtiyacınız olan herhangi bir temel mantığı eklersiniz.

Muhtemelen, veriyi kalıcı hale getirme şeklinizle% 90 + aynı olan bir şey elde edersiniz. Bu iyi. Eşleştirilmeden tamamen aynı olabilir.

Ayrıca, etki alanının gerçek kalıcı cehalet sisinde modellenmesinin yazılım tasarımı için biraz kutsal bir kâse olduğunu unutmayın. Eğer yapabilirsen, harika. Ancak sorunlu etki alanı hiç önemli değilse ve herhangi bir karmaşıklığı varsa, boyadığınızdan emin olmak için veri kalıcılığını akılcı bir şekilde kontrol etmek için zaman zaman etki alanı modellemesinden çıkmak iyi bir fikirdir. Kendinizi köşeye sıkıştırın.

Sadece çeşitli bileşenlerin gerçek rollerini hatırlayın ve tasarlarken bu rolleri ayrı tutun. Herhangi bir tasarım kararı için, kendinize bu rollerden herhangi birinin ihlal edilip edilmediğini sorun:

  1. Veritabanı - Verileri saklayın, verilerin bütünlüğünü koruyun, beklemede olan verileri koruyun.
  2. Modeller - İş mantığını içerir, sorunlu etki alanını modellenir, verileri hareket halinde tutar, iş düzeyinde olaylara yanıt verir, vb.
  3. Görünümler - Verileri kullanıcılara sunun, kullanıcı tarafı mantığı gerçekleştirin (modellerde gerçek doğrulama yapılmadan önce temel doğrulama vb.).
  4. Kontrolörler - Kullanıcı olaylarına yanıt verin, kontrolü modellere, rota isteklerine ve dönüş yanıtlarına geçirin.

Merhaba David. Kapsamlı cevabınız için teşekkürler! Yüksek seviyede gevşek bağlantıyı korurken, modelleri bir veritabanı konnektörüne nasıl bağlarsınız?
Endüstriyel

1
@Endustrial: Modelleri kalıcılığa bağlamak için bir çok yol var, ancak şimdiye kadar ayrı endişeler arzumumu gerçekten tatmin eden bulduğum tek yöntem, DAL tarafından harici olarak uygulanan etki alanı arayüzlerine sahip olmak. Havuz yöntemleri etki alanı modellerini kabul eder ve döndürür ve bunlar ile oluşturulan veritabanı varlıkları arasında dahili olarak dönüştürür. (Dürüst olmak gerekirse, PHP'de bu kadar çok şey yapmadım.) Böylece, tüm DB CRUD'nuzu otomatik olarak oluşturmak için bir DAL çerçevesi kullanabilirsiniz.
David

@Endüstriyel: Örneğin, bir ORM kullanırsanız, bu ORM'ye DAL tarafından (etki alanı modellerinden izole edilir) referans verilir ve modellerinizi buna göre veri erişimine dönüştürür. Veya el ile SQL ile doğrudan veritabanı erişimi yaparsanız, bunu DAL'nizin depo yöntemlerinde yapar ve döndürmeden önce SQL sorgularının sonuçlarını etki alanı modellerine çevirirsiniz.
David

@Endüstriyel: Depo yöntemlerinin sadece CRUD olması gerekmediğini unutmayın. Bu koda birçok zeka katılabilir. Daha karmaşık olanların birçoğu, veritabanından verileri dönüştüren çok fazla dahili koda sahip olabilir. Ya da, karmaşık olanlar veritabanına birçok gezi içeriyorsa, performans kazançları için mantığı saklı bir prosedüre koyabilirsiniz ve DAL yöntemi sadece bu prosedüre geçer ve sonuçları modellere dönüştürür.
David

Merhaba David! Bu cevap için tekrar teşekkür etmek istedim. Kesinlikle en iyi StackExchange aldığım biri!
Endüstriyel

2

İki şeye sahip olmak istiyorsun.

  1. Modelleriniz (DBAL erişimcileri ve uygulama mantığının çoğunu yapıyorlar).
  2. "Alan Modeli" olarak da bilinen Veri Varlıkları, bunlar sisteminizin kullanıcılar, yayınlar, ürünler vb. Varlıklarını temsil eder.

    class PPI_Model_User {
    
        protected $_conn = null;
    
        function __construct(array $options = array()) {
            if(isset($options['dsnData'])) {
                $this->_conn = new PPI_DataSource_PDO($options['dsnData']);
            }
        }
    
        function getAll() {
            $rows = $this->_connect->query("SELECT .....")->fetchAll();
            $users = array();
            foreach($rows as $row) {
                $users[] = new PPI_Entity_User($row);
            }
            return $users;
        }
    
    }

Kullanım Kodu

    $model = new PPI_Model_User(array('dsnData' => $dsnData));
    $users = $model->getAll();
    foreach($users as $user) {
        echo $user->getFirstName();
    }

Orada, etki alanı modelleri (Varlıklar) oluşturma ve DB bağlantısı ve veri işleme yapan MVC modelleri var.

ÜFE'nin ne olduğunu merak ediyorsanız, "PPI Çerçevesi" için google.

Aramanızda iyi şanslar.

Saygılar, Paul Dragoonis.


1

Unutmayın, MVC, tüm nesneler için otomatik kalıcılığa sahip olan küçük konuşmada ortaya çıktı. Dolayısıyla MVC modeli, model / kalıcılık ayrımı için herhangi bir çözüm önermez.

Benim tercihim, veritabanından Model nesneleri oluşturmayı ve Model nesnelerini veritabanına nasıl depolayacağını bilen bir "Havuz" nesnesi sağlamaktır. O zaman Model kalıcılık hakkında hiçbir şey bilmiyor. Bazı kullanıcı eylemleri bir kaydetmeyi tetiklemek zorunda kalacaktır, bu nedenle Denetleyicinin Depo hakkında bilgi sahibi olması muhtemeldir. Denetleyicinin Depoya bağlanmasını önlemek için genellikle bir çeşit Bağımlılık Enjeksiyonu kullanıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.