MVC Data Access Layer ve Model arasındaki fark

2 Cevap php

Ben birkaç web uygulamaları MVC oldukça iyi bir temsil olduğunu düşündüğüm hayata geçirdik ama crackoverflow katıldı sahip beri, belki de benim ilk tanımları biraz basit ve böylece ben gerçekten arasındaki farklar hakkında bazı açıklama sevinir olduğunu bulma yaşıyorum Veri Erişim Katmanı ve bir web uygulamasının Model veya Domain Katman.

Bağlam için, ben şu anda nesne buluştu beni tüm nesneleri arasında yineleme sağlayan bir nesneyi döndüren get () fonksiyonu yanı sıra temsil ettiği tablodaki tek bir kayıt için CRUD fonksiyonları uygulamak, veri erişim nesneleri kullanın get () fonksiyonu için kriterler.

Bu veri erişim nesneleri benim iş mantığı içeren denetleyici komut doğrudan başvurulur.

Bu konularda, PHP ve MySQL çalışan ama diğer dillerde kodlanmış olabilir önerileri ilgileniyorum ediyorum.

UPDATE: daha spesifik Örneğin, ben onlar ait olan şirket e-posta adresi, etkin devlet, kullanıcı adı, şifre, gibi bilgileri tutan kullanıcı (burada kongre tekil tablo isimleri, vb) adlı tablo . Bu temel nesne kodu aşağıdaki gibi olacaktır:

class User implements DataAccessObject
{
     protected $user_id;
     protected $email;
     protected $username;
     protected $password;
     protected $company_id;
     protected $active // Bool that holds either a 0 or 1

     public function __construct ( $user_id ) // Uses Primary Key to know which record to construct
     {
          $sql = //Sql to get this information from the database.

          // Code necessary to assign member variables their values from the query.
     }

     public function insert(){}
     public function update(){}
     public function delete(){}
     public static function get($filters, $orderVals, $limit){}

     // An object such as user might also contain the following function definition
     public static function login($username, $password){}
}

Ben veri erişim fonksiyonları ile (örneğin, bir kullanıcı için oturum olarak) herhangi bir gerçek-dünya türü işlevleri hem de birleştiren bir basitleştirilmiş forma DAO Katmanı ve Model katman bastardized olabilir gibi geliyor.

2 Cevap

model sınıfları gerçek dünya varlıkları bir iyi, temiz, yüksek sadakat model olarak tek başına. Bir iş alanı ise, müşterilerin, planları, ürünleri, ödemeler şeyler tüm bu tür olabilir. Sizin uygulama bu sınıflar ile çalışır. Fikir uygulama alanı nesnelerin gerçek dünya kullanım modeli olmasıdır. Başvurunuz insanlar gerçekten yapmak fiilleri gibi bakmak yöntem fonksiyonlara sahip olabilir, ve bu yöntem fonksiyonların uygulanması, gerçek dünyadaki nesnelerin gerçek dünya açıklama gibi görünüyor.

Önemli: Bu en teknik konuları (ideal) bağımsızdır. Bu tanımlayabilirsiniz etki alanı nesneleri saf modeli bulunuyor. [Evet, yabancı anahtar arama sorunları var, ve evet, bir modeli nesne sadece yabancı anahtarlar yerine gerçek nesne verilen birbirlerini nesneleri bulabilirsiniz böylece modeli ile bazı veri erişim bileşenlerinin farkında nesneleri yapmak zorunda. İyi bir ORM katman sizin için bu navigasyon sorununu ele alır.]

SQL dolu bir modeli iyi bir model değildir. Gerçek dünya ya, SQL dolu değil. Bir fatura gibi bazı isim ve adresleri ve öğeleri, ve bir nakliye tarih ve şeyler bir grup ile bir belgedir.

access sınıfları kalıcı depolama yönetir. Bu genellikle ilişkisel veritabanı tabloları için model nesneleri haritalama içerir. Bir SQL tabanlı veri erişim katmanı, bir ilişkisel veritabanı modelinizi yeniden ve bir ilişkisel veritabanı modelinizi devam ediyorum. Bir YAML veri erişim katmanı modelinden YAML dosyaları okumak ve yazmak istiyorum.

Bazen, nesne-ilişkisel eşleme (ORM) tasarım deseni SQL'ın dünya ve model arasında temiz bir ayrım yapmak için kullanılır. Bazen bir veri erişim nesnesi (DAO) SQL ve model arasında bu ayrımı işler. Bir ORM veya DAO nesne SQL dolu olabilir.

Eğer veritabanı ürünlerini değiştirmek Gerçekten de, only değişiklik DAO veya ORM olduğunu. O SQL, YAML, JSON, XML veya diğer bazı serileştirme tekniği bağımsız olduğundan modeli, asla değiştirir.

DAO oluşturur ve modeli nesneleri devam ederse, ben MVC model parçalar oldukça iyi uygulandığı var düşünüyorum. Sen sanat devletin ek fikir almak için ORM paketleri bakabilirsiniz. I iBatis hayranıyım, kendimi.

Ama sadece bu bütün MVC dünya görüşünün 1/3. - Ve tabii ki - titiz MVC sadece masaüstü veya yalnızca smalltalk veya MVC ortak web uygulamasından farklı olduğunu size söyleyecektir.

It's just a matter of higher abstraction. If you think about some business problem you are about to solve, you want to think about it in terms of concepts (entities, relationships, processes, etc.) of that business, not in terms of database objects or on more detailed level, in terms of internals of some specific database system (eg. MySQL). This way, you can model the domain (ie. the business and its rules) independently on the particular technology you use for implementation.

"Data-access-layerish" konuşmak, diğer bir deyişle, siz, size etki alanı hakkında bahsederken ise (Etkin kayıt deseni kullanarak öneğin) bu verilere erişmek için tabloları, satır, veri tipleri, hatta yaklaşımları hakkında konuşmak iş nesneleri, iş kuralları ve iş süreçleri hakkında konuşun.

MGD desenini kullanırken (yukarıda söylediğim gibi) ve bu arada, sen değil kontrolörleri, sizin modeli (domain) düzey iş mantığını saklanması gerekir - onlar sadece o kuralları tetiklemek gerektiğini, bunu söylemek için.