Ben çok sıkı isimleri ve kavramlara bağlı bir çerçeve oluşturmak için çalışıyoruz düşünüyorum. Ben Model-View-Controller deyim isimler ve kavramlar katı tanımlanmış değildir bulduk. Ben de o paradigma içinde çalışan kod bazen kuralları esnetmeye edebilmek için ihtiyacı olduğunu tespit ettik.
Model isn't bir Datastore, sadece has a Datastore: @ duffymo Model bileşen hakkında çok önemli bir nokta vardır. Bu, her bir örneği olması gerekiyordu ne bakmak olduğunu düşünmenin bir başka yolu açık değilse. Bir "datastore" nesnesinin bir örneği veri keyfi bir miktarda erişim aracılık bir kaynak temsil eder. Genellikle bir veritabanı bağlantısı olduğunu. Bir "model" nesnesinin bir örneği genellikle birden fazla veri parçaları ile ayrı bir kimlik. Genellikle bir tablodaki bir veritabanı satır temsil eder, ama bir metin dosyasında satır, ya da bir dosya deposunda bir dosya olabilir.
Controller ve View aynı soruda uygulamak ve Model bölümü oldukça farklı bir hayvan olduğunu görebilirsiniz. Sadece bir Kontrolör nesne ve bir View nesnesi normalde bir anda ortaya olacak iken, farklı türlerde birçok farklı model nesneler bir anda varlığı olması oldukça muhtemeldir.
Ne yazık ki, ben de MVC "çerçeveler" bir sürü SQL deyimleri hangi yapmak arkasında bir API katmanı olarak bir "Model" tanımlamak olduğunu biliyoruz. Bu çerçeveler, bir "Model" statik bir sınıf veya bir tek örnek olduğunu ve yakın-yararsız ad bölümleme sağlamak başka bir şey yok. Ve programcılar bir sürü bu mantıklı ve onunla mücadele etmek gerekiyordu düşünüyorum. This is why I recommend you don't MVC deyim adlarını ve kavramları kullanmak. Strong>
Yapılandırılmış PHP yazmak için tercih edilen yoldur sadece MVC için sallıyor. Bu dağıtıcı ve denetleyici mantığı üst ve alt HTML biçimlendirmesi vardır. Kontrolörleri ve Görüntüleme genellikle sıkıca bağlanmış ve aynı dosyada koyarak çok PHP-ish, çünkü bu iyi çalışıyor. Evet, görünüm-ish kodunda kontrolör-ish eylemler yapmak değil disiplin sürer, ama ben daha ziyade kendimi çerçeve beni zorlamak zorunda daha yapmak gerekiyor. Bu sayfalar tek başına değil, ancak, ortak mantık bir sürü yer ve hafif bir memuru sistemi gibi şeyleri almak, hatta ortak denetleyici mantığın bütün swathes arayabilirsiniz.
Ancak ortak mantık sağlayan ana şey bir veri soyutlama katmanı - benim cevap üstündeki açıklandığı gibi, temelde Model katmanı. Bir veritabanı işleyicisi, bir "nesne" nesne ve bir "koleksiyon" nesne: Ben yazdım veri soyutlama katmanı temelde üç şey olduğunu.
Veritabanı tutacağı datbasee yaşayan tüm nesneler için DataStore olduğunu. Bu bir sorgu yapmak ve bir yanıt almıyorsanız veritabanına faaliyetleri tek bir yerde tüm böylece asıl amacı bu. Çoğu veritabanı çağrıları nesne çekirdek vardır. Veritabanı tutacağı nesne çekirdek hakkında hiçbir şey bilmiyor: sadece resultsets SQL alır ve döndürür.
The other two objects are designed to be sub-classed and will not work if instantiated themselves. Using inheritance and a special extended declaration (done by a static class method), they know how to turn
database data into an object. An instance of an inherited "object" object represents one row of the declared class. It is given an ID upon instantiation, and will query the database when it needs to to retreive its one row of data. It also keeps track of changes and can do a one-row UPDATE when told to. The API it presents is completely devoid of SQL: the object has fields you ->get() and ->set(), and you can ->save() when you're done.
"Koleksiyon" nesne belirli bir nesne satır filtrelenmiş listesini almak için nasıl bilir ve onlar tek tek örneği alındı gibi işlev her biri, uygun olarak ayrı ayrı nesneler içine açmak için nasıl bilir. (Koleksiyon nesnesi aynı zamanda bir nesnenin kendisi olma destekler, ancak şu anda bazı uygulama sınırlamaları gibi nadiren bu özelliği kullanabilirsiniz. Ve ben en çok programcılar sorun doyumsuz var buldum bir kavramdır.)
Çoğu nesneler çekirdek miras kodu ve belirli bir tablo için bildirimleri sadece gerekir.
Sonuna etkisi the controller code bu gibi bariz şeyler yapmak alır olduğunu:
$ticket = Ticket::Create($ticket_id);
$ticket->set('queue', $new_queue);
$ticket->set('queue_changed', date('Y-m-d H:i:s'));
$ticket->save();
Yerine ... gibi opak bir şey:
TicketModel::ChangeTicketQueue($ticket_id, $new_queue);
Bu yaklaşım aynı zamanda diğer alanları veya diğer nesneleri güncelleştirmek olabilir Bilet nesne şeyleri kod sağlar zaman queue
alanı değişimleri ve bu alanı değiştirmek yerine her zaman bu bunu yapmak için hatırlamak zorunda, oluşacak her işlev bir biletin kuyruğunu değiştirebilirsiniz. Ayrıca bir bilet için başka yöntemler ekleyebilirsiniz gelir: $ticket->get_queue()
return TicketQueue::Create($this->get('queue'));
Senin için yapmak için muhtemelen mantıklı olur. Ona Nesne yönelimli programlama iyi değil! :-)
Yani, son soruyu cevaplamak için, ben none sorunuzu yaklaşımların öneriyoruz. Sizin modeli nesneleri denetleyicisi kodu birleşik bir API sunmalıdır ve onların veri depolamak olarak nasıl onlara kalmış. Bir veritabanında ise, o zaman onlar bunu kendi aramaları organize etmek gerekir. Ancak, bir model isn't, bir veri deposuna: Bununla birlikte, iyi olabilir have on.