Java'daki MVC tasarım deseni nedir? MVC mimari deseni

"Web sitesi mimarisi" ifadesinin anlamı size sezgisel gelse de, çalışmaya çalışalım. bir dizi tanım saygın kaynaklardan.

Mimari- bu, bileşenlerinde somutlaşan sistemin temel organizasyonu, birbirleriyle ve çevre ile ilişkilerinin yanı sıra sistemin tasarımını ve gelişimini belirleyen ilkelerdir.

Mimari program veya bilgisayar sistemi, programın öğelerini, bu öğelerin dışarıdan görülebilen özelliklerini ve aralarındaki bağlantıları içeren sistemin yapısı veya yapılarıdır [Bass].

Mimari organizasyonun yapısı ve onunla ilişkili sistemin davranışıdır. Bir mimari, arayüzler, parçaları birbirine bağlayan bağlantılar ve parçaların bir araya getirilmesi için koşullar aracılığıyla etkileşime giren parçalara özyinelemeli olarak bölünebilir. Arayüzler aracılığıyla etkileşime giren parçalar, sınıfları, bileşenleri ve alt sistemleri içerir.

Mimari Bir sistemin veya sistem grubunun yazılımı, program yapıları ve sistemleri oluşturan bu yapılar arasındaki etkileşimler hakkındaki tüm önemli tasarım kararlarından oluşur. Tasarım kararları, bir sistemin başarılı olması için desteklemesi gereken istenen özellikler kümesini sağlar. Tasarım kararları, sistem geliştirme, destek ve bakım için kavramsal çerçeve sağlar.

Peki program mimarisi nedir?

Önceki bölümde verilen tanımlar, hazırlıksız bir okuyucu tarafından algılanamayacak kadar kurudur. Özü mümkün olduğunca basit bir şekilde açıklamaya çalışacağız.

Bir program yeterince büyüdüğünde, programcı onu birden çok dosyaya böler. Benzer işlevlerden oluşan grupları ayırmayı ve bunları ayrı modüllere koymayı düşünmüyorsanız, böyle bir bölünme çok az işe yarayacaktır. Kod yeniden kullanılamaz ve gezinmesi zor olacaktır. Programı genişletmek ve değiştirmek zor olacaktır.

Böylece, ilk soru demleniyor: programın dosyalara nasıl bölüneceği. Bir programın dosya mimarisi, yapısının bir yönüdür.

Sistemin modüllerini seçerken, birbirleriyle nasıl bir ilişki içinde olacaklarını anlamak gerekir. Örneğin, veritabanı erişim ve grafik işleme modüllerinin birbirlerinin varlığı hakkında neredeyse hiçbir şey bilmelerine gerek yoktur. Ancak UI modülü her ikisini de bilecektir (ve bilmeyeceklerdir).

Sistem bileşenleri arasındaki ilişkiler de mimarisi tarafından belirlenir.

Genel olarak, yardımı ile çözülen sorunlara değil, programın organizasyonuna yönelik tüm önemli kararlar mimariye atfedilebilir.

soyutlama seviyeleri

Modülleri tasarlarken (prosedürsel bir yaklaşım durumunda fonksiyon gruplarını seçip dosyalar arasında dağıtırken), soyutlamaları vurgulamak ve bunları birkaç seviyeye ayırmaya çalışmak önemlidir.

Düşük seviyeli modüller mümkün olduğunca özerktir, programın diğer bölümlerine bağlı değildirler. İyi tasarlanmış modüller, "dış dünyayı" problemlerini çözmenin inceliklerinden yalıtır. Arayan sadece modülün arayüzünü (harici fonksiyonlar) bilir, dahili kısım ona kapalıdır.

Örnek olarak bir fotoğraf galerisini ele alalım. Görüntüler ve kullanıcılarla ilgili bilgiler veritabanında saklanır, kullanıcı arayüzü istemci kısmı ve yönetici paneli olarak ikiye ayrılır.

Programın yapısı aşağıdaki şekilde gösterildiği gibi olabilir:


Bu örnek izler üç soyutlama seviyesi.

İnsan kullanımına yönelik herhangi bir programda en az iki seviye ayırt edilebilir: kullanıcı arayüzü ve model. Kullanıcı arayüzü modülü, verileri sunmak ve görselleştirmek, kullanıcının tepkisini işlemek için tasarlanmıştır. Model, çözülmekte olan sorunun mantığını içerir ve hiçbir şekilde verilerin görüntülenme şekline bağlı olmamalıdır. Model, farklı kullanıcı arabirimi türleri arasında kolayca taşınabilir olmalıdır.

MVC mimarisi

Şimdi popüler MVC tasarım deseni. Uygulama mantığını kullanıcı arayüzünden ayırmaya yarar. Ama önce, bir tasarım deseninin ne olduğunu açıklayalım.

Bu, bir dizi tipik tasarım çözümü, bir mimarinin çerçevesi veya onun bir parçası. Bir kitaplık yeniden kullanılabilir kod paketiyse, tasarım deseni yeniden kullanılabilir çözümler paketidir.

MVC, uygulama mantığını kullanıcı arayüzünden ayırmamız için bize ne sunuyor?

Örneklem MVC ayırmanızı sağlar veri, sunum ve kullanıcı eylemlerinin üç ayrı bileşene işlenmesi:

  1. modeli. Model (genellikle Görünüme) veri sağlar ve ayrıca durumunu değiştirerek isteklere (genellikle Denetleyiciden) yanıt verir;
  2. görüş. Bilgileri görüntülemekten sorumlu (kullanıcı arayüzü);
  3. Denetleyici. Kullanıcı girdisini yorumlar ve uygun şekilde tepki vermesi için model ve görünümü bilgilendirir.

Aşağıdaki şekil çerçeve bileşenleri arasındaki ilişkiyi göstermektedir. Şekli küçük bir örnekle açıklayalım.


Metin girebileceğiniz bir form hayal edin, Düzenle düğmesini tıklayın ve harf çevirisini alın:


Şemada gösterilen adımları tekrarlayalım:

  1. Kullanıcı Düzenle düğmesini tıklar Verim(Görüntüle) bir mesaj gönderir Denetleyici(Kontrolör): "Komut: düzenle"
  2. kontrolör kabul mesajı alır ve Edit() yöntemini çağırarak Modele erişir.
  3. Sonuç olarak model değişiklikleri durumunu (içinde depolanan harf çevirisi yapılmış metin) ve bu konudaki görüşü bildirir: "Olay: değişti".
  4. Gönderim Kabul Et sinyal verir ve Get() yöntemini çağırarak yeni bir sonuç değeri için modele erişir.

MVC Uygulaması

MVC'nin uygulanması, nesne yönelimli bir yaklaşımı (OOP) varsayar. Bununla birlikte, bir tasarım deseni sadece bir dizi karardır. Onları OOP kullanmadan PHP'ye uyarlıyoruz. Sadeleştirme, mantığın ayrılmasının özüne odaklanmak ve ayrıca materyalin OOP'ye aşina olmayan bir okuyucu tarafından uygulanabilmesi için yapılır.

Tekrar düşünün fotoğraf galerisi örneği.
İki görünüm modu vardır:

  1. Küçük resim görünümü modu (hepsi aynı anda);
  2. Tam boy fotoğraf görüntüleme modu (tek).

olasılık da var fotoğrafları yükle sunucuya. Ek olarak, çerçevenin esnekliğini değerlendirmek için görselleştirme türleri için destek uyguluyoruz.

site iki giriş noktası:

  1. index.php (galeri görünümü);
  2. photo.php (fotoğrafı tam boy görüntüleyin).
Bu iki dosya dikkate alınacaktır Kontrolörler.

Olarak Modeller görüntü depolama ile çalışmayı sağlayan bir modül olacaktır. diyelim galeri.php ve bir klasöre koy model.

Oyuncu kadrosu temsil HTML şablonları hareket edecek, klasörde olacaklar şablonlar. Şablonlar nedir ve ne içindir - daha sonra görülecektir.

Galeri görünümü ve fotoğraf görünümü sayfaları ortak bir üstbilgi ve sayfa altbilgisine sahip olacak, yalnızca orta kısım farklı olacaktır.

Galeri görünümünde iki tür görselleştirme olacaktır:

  1. Tablo olarak (varsayılan);
  2. Liste şeklinde.
Dört şablona ihtiyacımız var:
  1. main.php (sayfa çerçevesi);
  2. content_index_table.php (galeri içeriğinin tablo görünümü);
  3. content_index_list.php (galeri içeriğinin liste görünümü);
  4. content_photo.php (fotoğraf görüntüleme sayfasının içeriği).

Bu, aşağıdaki site yapısıyla sonuçlanır:


Dosya yapısı, üç bölüm oluşturan iki yatay çizgi ile bölünmüştür. Üst kısımdaki dosyalar Modele, orta kısımdaki dosyalar Görünüme, alt kısımdaki dosyalar Kontrolöre aittir.

modeli

Modelin uygulanmasıyla başlayalım. Aşağıdaki kod, örneğin en aza indirilmesi ve daha iyi anlaşılması için tam olarak gösterilmemiştir.

Modelin sadece arayüzünü tanımladık, uygulamayı atladık. Ancak, MVC çerçevesinin örnek uygulaması için buna hiç gerek yoktur.

Verim

Şimdi şablonlara bakalım. Sayfanın genel iskeleti ile başlayalım:

<?=$title?>



Şablonun hiçbir yerden $title ve $content değişkenlerini kullanmasından utanmamalısınız. Kontrolör onları değiştirecektir. Ama bunun hakkında daha sonra.

- bu kısaltılmış bir versiyondur .

Şablonlarda kullanımı uygundur. Şablonlardaki yapılarda if-else , foreach , for , while yazmanın alternatif yollarını kullanmak da daha uygundur. Şuna benziyorlar:

Eğer(<условие>): <тело>endif; her biri için(<инициализация цикла>): <тело>uç foreach;

Şablonların geri kalanı main.php dosyasında şu şekilde değiştirilecektir:

Aşağıdaki örnekler kodlarını göstermektedir:

Kod şablonları/content_index_table.php

Masa| Liste

"> " />



Kod şablonları/content_index_list.php

Tablo | Liste

"> " />



templates/content_photo.php: Geri

" />

Denetleyici

Ve son olarak, iki Kontrolörümüzü tanımlayarak her şeyi bir araya getireceğiz. Görevleri, talebi işlemek, bir şablon seçmek ve şablonun gerektirdiği verileri değiştirmektir. Veriler kural olarak modelden alınır.

Kullanıcı bir dosya gönderdiyse galeri denetleyicisi bir fotoğraf yükler. Aksi takdirde, modelden bir fotoğraf listesi alır, istenen şablonu seçer (kullanıcının isteğine bağlı olarak) ve bir fotoğraf listesi ileterek bu şablonun çıktısını verir:

index.php kodu

Fotoğraf görüntüleme denetleyicisi daha da basittir:

foto.php kodu

Nihayet

Uygulamanızın mimarisine yeterince dikkat etmeye çalışın. Başlangıçta güçlü ve genişletilebilir bir çerçeve oluşturursanız, çaba meyvesini verecek yüz kat.

MVC modelini uygulamak için seçmek daha iyidir nesne yönelimli yaklaşım .

Örneğin Zend Framework'de birçok hazır çerçeve çözümü vardır. Ancak mevcut derste verilen bilgiler MVC mimari çözümlerini anlamak ve hemen kullanmaya başlamak için yeterlidir.

MVC (Model View Controller) yaygın olarak kullanılan bir geliştirme tekniğidir (pattern).

Bugün web geliştirmede kullanılan en popüler kalıptır.

Bu derste, bir MVC çerçevesi ve buna dayalı basit bir CMS oluşturacağız.
Bu CMS, makaleler, kullanıcılar ve bir geri bildirim formu ile çalışmak için birkaç denetleyiciye ve ayrıca bir yönetici paneline sahip olacaktır.

Modeller, Görünümler, Denetleyiciler bir web uygulamasının özel gerekli parçalarıdır.

MVC'nin temel ilkeleri:

Modeller - uygulama verileri ve veritabanı erişiminden sorumludur;

Kontrolörler, sistemle kullanıcı etkileşiminden sorumludur.
Gerekirse, denetleyiciler modellerden veri alır.

Görünümler (başka bir deyişle, HTML şablonları) yalnızca denetleyiciden alınan verileri görüntüler.

Görünümler ve modeller arasında doğrudan bir ilişki yoktur.

MVC uygulamalarının aşağıdakiler gibi birçok avantajı vardır:
- anlama kolaylığı ve geliştirme kolaylığı;
- yüksek derecede esneklik;
- basit kod desteği;
- hızlı gelişme.

Bu nedenle sayısız uygulama ve dünyaca ünlü çerçeveler
MVC'ye dayalı.

Örnek olarak ticari bir web sitesine bakalım:

Kural olarak, en az birkaç ana modülden oluşur:
- Malların teşhirinden, aranmasından ve teşhirinden sorumlu Modül Ürünler (Mallar);
- Siparişlerin verilmesinden ve işlenmesinden sorumlu Modül Sepeti (Sepet);
- Modül Kullanıcıları (Kullanıcılar) - kullanıcıları kaydetmekten ve hesapları yönetmekten sorumludur.

MVC terimleriyle, bu uygulama aşağıdaki yapıya sahiptir:

Yöntemler (işlevler) indeksli ProductsController sınıfı (ürünlerin bir listesini göster),
göster (bir ürünü gösterir), ara (ürünlere göre ara). Bu yöntemlere eylemler (eylemler) denir.
Bu denetleyici, aşağıdakiler için yöntemler içerecek olan Ürün sınıfı (model) ile etkileşime girer.
getProductsList, search, getProductById gibi ürün verilerine erişin ve bunları yönetin,
kaydetme, silme vb.

ProductsController ayrıca yönetici için yöntemler içerir. Örneğin, admin_edit
ürün düzenleme veya admin_view- ürünü yönetici panelinde görüntülemek için.

Sepet ve Kullanıcılar modüllerinin yapısı Ürünler modülüne benzer.

Böyle bir tip yapısının kullanılması, farklı kodları ayırmamızı sağlar.
artırmak için uygulamamızın mantıksal bölümleri veya "modülleri"
üretkenlik ve hatalardan kaçının.
Bu Ürünler modeliyse, kullanıcıları yönetme kodunu içermediğinden ve bunun tersi olduğundan emin olabiliriz.
Ayrıca bu şekilde PHP, HTML, JS ve SQL kodlarını ayırıyoruz.

Böylece kod daha temiz ve anlaşılırdır.

MVC'de isteklerin nasıl işlendiğine bir göz atalım.

Bir MVC uygulaması, URL'nin belirli bir biçimde oluşturulmasını gerektirir.

Yukarıda bahsettiğimiz ticari site örneği ile ilgili olarak, istersek
ürün listesi sayfasına ulaşmak için aşağıdaki URL'ye gitmemiz gerekiyor:
http://siteniz.com/products

Bu durumda, ürünler denetleyicinin adıdır ve eylemin adı dizindir,
varsayılan olarak. Belirli bir ürünü görüntülemek istiyorsak,
http://siteniz.com/products/view/11.

Daha önce benzer URL'leri gördüğünüzü varsayıyoruz.
Bu tür URL'lere Kullanıcı Dostu (yani kullanıcı dostu URL) veya CNC (insan tarafından okunabilir URL) adı verilir.

Yani burada ürün denetleyicinin adıdır ve görünüm ve eylemin adı dizindir.
URL'de, eylem parametresi 11'dir. Bu durumda, ürün kimliği olacaktır.

Aslında, denetleyici, belirli işlemlerden sorumlu olan uygulamanın bir parçasıdır.
araziler. Örneğin Kullanıcılar, Ürünler, Sayfalar farklı denetleyiciler olacaktır. Tüm işlemler
uygulamada üretilebilen, denetleyicilerde genel yöntemler olarak uygulanır.

Örneğin, Kullanıcılar denetleyicisi kayıt, oturum açma, oturum kapatma vb. yöntemleri içerecektir.
Kullanıcıya görüntülenen tüm veriler, denetleyiciden görünümlere, yani. içinde
HTML şablonları. Tipik olarak, her denetleyici yönteminin karşılık gelen bir görünümü vardır.

Bir MVC web sitesinde isteklerin nasıl işlendiğine bir göz atalım.

Oldukça basit.

1. Özel bir .htaccess dosyası kullanarak, olmayan tüm istekler
dosya istekleri index.php dosyasına yönlendirilir.

2. Bir sonraki adım, dağıtıcıyı aramaktır. Gönderici, almak için URL'yi ayrıştırır.
denetleyici ve eylem adı. Diğer parametreler de istekten alınır. BT
örneğin bir dil kodu olabilir.

3. Uygun kontrolör ve kontrolör metot isimleri tanımlandığında,
denetleyici yöntemi çağrılır.

4. Denetleyici yöntemi daha sonra verileri almak için model yöntemlerini çağırır.

5. Kullanıcıya veri sağlama zamanı geldiğinde,
ilgili görünümü görüntüler. Tüm veriler döndürüldü
denetleyici yöntemiyle bir dizi biçiminde görünüme geçirilir ve orada
görüntülenir.

6. Son olarak, kullanıcı html sayfasını alır.

Yani şimdi başlamaya hazırız. Bir sonraki derste projemizi geliştirmeye başlayacağız.
dizin yapısının oluşturulmasından itibaren.

Pek çok kişi, tek bir görevle çalışmak için bir proje yazmaya başlar, bunun çok kullanıcılı bir yönetim sistemine, diyelim ki içeriğe veya Allah korusun, üretime dönüşebileceğini ima etmez. Ve her şey harika ve havalı görünüyor, yazılan kodun tamamen koltuk değneği ve sabit koddan oluştuğunu anlamaya başlayana kadar her şey çalışıyor. Kod, düzen, istekler ve koltuk değnekleriyle karıştırılır, hatta bazen okunamaz bile. Acil bir sorun ortaya çıkıyor: Yeni özellikler eklerken, “orada ne yazıldığını” hatırlayarak çok uzun bir süre bu kodla uğraşmanız gerekiyor. ve geçmişte kendinize lanet edin.

Tasarım kalıplarını bile duymuş ve hatta şu harika kitaplara göz atmış olabilirsiniz:

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides “Nesneye Yönelik Tasarım Teknikleri. Tasarım desenleri";
  • M. Fowler "Kurumsal Yazılım Uygulamalarının Mimarisi".
Ve birçoğu, devasa kılavuzlardan ve belgelerden korkmayan, modern çerçevelerden herhangi birini incelemeye çalıştı ve anlama zorluğuyla karşı karşıya kaldı (birbirine akıllıca bağlanmış birçok mimari kavramın varlığından dolayı), çalışma ve uygulamayı erteledi. arka brülörde modern araçlar.

Sunulan makale öncelikle yeni başlayanlar için faydalı olacaktır. Her durumda, birkaç saat içinde, tüm modern web çerçevelerinin temelini oluşturan MVC modelinin uygulanması hakkında bir fikir edinebileceğinizi ve ayrıca “ üzerinde daha fazla düşünmek için “yiyecek” alabileceğinizi umuyorum. nasıl yapılır". Makalenin sonunda, web çerçevelerinin (MVC'nin yanı sıra) nelerden oluştuğunu ve nasıl çalıştıklarını anlamanıza yardımcı olacak bir dizi faydalı bağlantı sağlanmıştır.

Sertleştirilmiş PHP programcılarının bu makalede kendileri için yeni bir şey bulması pek olası değildir, ancak ana metin hakkındaki yorumları ve yorumları çok yardımcı olacaktır! Çünkü teori olmadan pratik imkansızdır ve pratik olmadan teori işe yaramaz, o zaman önce biraz teori olacak ve sonra pratiğe geçeceğiz. MVC kavramına zaten aşina iseniz, teori bölümünü atlayabilir ve doğrudan uygulamaya geçebilirsiniz.

1. Teori

MVC modeli, iş mantığını kullanıcı arabiriminden ayırmayı amaçlayan bir uygulama yapısı oluşturmanın basit bir yolunu açıklar. Sonuç olarak, uygulamanın ölçeklenmesi, test edilmesi, bakımı ve elbette uygulanması daha kolaydır.

MVC şablonunun kavramsal şemasını düşünün (bence bu, gördüklerimin en başarılı şemasıdır):

Bir MVC mimarisinde, model veri ve iş mantığı kurallarını sağlar, görünüm kullanıcı arabiriminden sorumludur ve denetleyici model ile görünüm arasındaki etkileşimi sağlar.

Tipik bir MVC uygulama iş akışı aşağıdaki gibi tanımlanabilir:

  1. Bir kullanıcı bir web kaynağına girdiğinde, başlatma komut dosyası uygulamanın bir örneğini oluşturur ve yürütme için başlatır.
    Bu, örneğin sitenin ana sayfasının bir görünümünü görüntüler.
  2. Uygulama, kullanıcıdan bir istek alır ve istenen denetleyiciyi ve eylemi belirler. Ana sayfa durumunda, varsayılan eylem gerçekleştirilir ( dizin).
  3. Uygulama, denetleyiciyi başlatır ve eylem yöntemini çalıştırır,
    örneğin, veritabanından bilgi okuyan modele yapılan çağrıları içerir.
  4. Bundan sonra eylem, modelden alınan verilerle bir görünüm oluşturur ve sonucu kullanıcıya gösterir.
modeli- uygulamanın iş mantığını içerir ve örnekleme yöntemlerini (bunlar ORM yöntemleri olabilir), işlemeyi (örneğin doğrulama kuralları) ve genellikle onu çok kalın yapan, oldukça normal olan belirli verileri sağlar.
Model, kullanıcı ile doğrudan etkileşime girmemelidir. Kullanıcının isteğiyle ilgili tüm değişkenler denetleyicide işlenmelidir.
Model, kullanıcının ihtiyaçlarına göre değişebilen HTML veya başka bir işleme kodu oluşturmamalıdır. Bu tür kodlar görünümlerde ele alınmalıdır.
Aynı model, örneğin: kullanıcı doğrulama modeli, uygulamanın hem kullanıcı hem de yönetim kısmında kullanılabilir. Bu durumda ortak kodu ayrı bir sınıfa taşıyabilir ve mirasçılarda alt uygulamalara özel yöntemler tanımlayarak ondan miras alabilirsiniz.

görüş- denetleyiciden ve modelden alınan verilerin harici görüntüsünü ayarlamak için kullanılır.
Görünümler, verileri taramak, biçimlendirmek ve görüntülemek için HTML işaretlemesi ve küçük PHP kodu ekleri içerir.
Veritabanına doğrudan erişmemelidir. Modeller bunu yapmalı.
Bir kullanıcı isteğinden alınan verilerle çalışmamalıdır. Bu görev denetleyici tarafından gerçekleştirilmelidir.
Çıkışa hazır verileri almak için denetleyicinin veya modellerin özelliklerine ve yöntemlerine doğrudan erişebilir.
Görünümler genellikle, tüm sayfalar için ortak olan işaretlemeyi (örneğin, bir üstbilgi ve altbilgi) ve modelden veri çıktısını görüntülemek veya veri giriş formlarını görüntülemek için kullanılan şablon bölümlerini içeren ortak bir şablona bölünür.

Denetleyici- modelleri, görünümleri ve diğer bileşenleri çalışan bir uygulamaya bağlayan bir bağlantı. Kontrolör, kullanıcı isteklerinin işlenmesinden sorumludur. Denetleyici, SQL sorguları içermemelidir. Onları modellerde tutmak daha iyidir. Denetleyici HTML veya başka bir işaretleme içermemelidir. Ortaya çıkarılmayı hak ediyor.
İyi tasarlanmış bir MVC uygulamasında, denetleyiciler genellikle çok incedir ve yalnızca birkaç düzine kod satırı içerir. CMS Joomla'daki Aptal Yağ Kontrolörleri (SFC) hakkında söylenemez. Denetleyicinin mantığı oldukça tipiktir ve çoğu temel sınıflarda alınır.
Öte yandan modeller çok kalındır ve veri işlemeyle ilgili kodun çoğunu içerir. verilerin yapısı ve içerdiği iş mantığı genellikle belirli bir uygulamaya oldukça özeldir.

1.1. Ön Denetleyici ve Sayfa Denetleyicisi

Çoğu durumda, bir web uygulamasıyla kullanıcı etkileşimi bağlantılar aracılığıyla gerçekleşir. Şimdi tarayıcının adres çubuğuna bakın - bu metni bu bağlantıdan aldınız. Bu sayfanın sağ tarafında bulunanlar gibi diğer bağlantılar sizi diğer içeriklere götürecektir. Bu nedenle, bağlantı, web uygulamasına belirli bir komutu temsil eder.

Umarım farklı sitelerin adres çubuğunu oluşturmak için tamamen farklı formatlara sahip olabileceğini fark etmişsinizdir. Her format, bir web uygulamasının mimarisini temsil edebilir. Bu her zaman böyle olmasa da, çoğu durumda açık bir gerçektir.

Adres çubuğu için bir miktar metin ve bir kullanıcı profili gösteren iki seçenek düşünün.

Bu durumda yaklaşık işleme kodu:
switch($_GET["action"]) ( case "about" : require_once("about.php"); // "Hakkımızda" sayfa sonu; case "contacts" : require_once("contacts.php"); // sayfa "Kişiler" sonu; durum "geri bildirim" : require_once("feedback.php"); // sayfa "Geri bildirim" sonu; varsayılan: require_once("page404.php"); // sayfa "404" sonu; )
Sanırım hemen hemen herkes bunu daha önce yaptı.

URL yönlendirme motorunu kullanarak, uygulamanızı aynı bilgileri gösterecek şekilde aşağıdaki gibi istekleri kabul edecek şekilde yapılandırabilirsiniz:
http://www.example.com/contacts/feedback

Burada, kişiler bir denetleyicidir ve geri bildirim, bir geri bildirim formu vb. oluşturan kişiler denetleyicisinin bir yöntemidir. Bu konuya pratik kısımda döneceğiz.

Ayrıca, birçok web çerçevesinin yönlendiricilerinin, rastgele URL yolları (URL'nin her bir bölümünün ne anlama geldiğini belirtin) ve bunları işlemek için kurallar oluşturmanıza izin verdiğini bilmeye değer.
Artık uygulamaya geçmek için yeterli teorik bilgiye sahibiz.

2. Alıştırma

Öncelikle aşağıdaki dosya ve klasör yapısını oluşturalım:


İleriye baktığımızda Model, View ve Controller temel sınıflarının çekirdek klasörde saklanacağını söyleyeceğim.
Çocukları kontrolörler, modeller ve görünümler dizinlerinde saklanacaktır. Dosya index.php bu, uygulamanın giriş noktasıdır. Dosya bootstrap.php gerekli tüm modüller vb. dahil olmak üzere uygulamanın indirilmesini başlatır.

Sırayla gidelim; index.php dosyasını açın ve aşağıdaki kodla doldurun:
ini_set("display_errors", 1); require_once "application/bootstrap.php";
Burada soru sorulmamalıdır.

Sonra, doğruca sonbahara gidelim bootstrap.php:
require_once "core/model.php"; require_once "core/view.php"; require_once "core/controller.php"; require_once "core/route.php"; Rota::start(); // yönlendiriciyi başlat
İlk üç satır, şu anda var olmayan çekirdek dosyalarını içerecektir. Son satırlar, yönlendirici sınıfına sahip dosyayı içerir ve statik başlatma yöntemini çağırarak yürütme için başlatır.

2.1. Bir URL Yönlendiricisi Uygulamak

Şimdilik, MVC modelinin uygulanmasından sapalım ve yönlendirmeye odaklanalım. Atmamız gereken ilk adım, aşağıdaki kodu içine yazmaktır. .htaccess:
RewriteCond'da RewriteEngine %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule .* index.php [L]
Bu kod, tüm sayfaların işlenmesini index.php, ihtiyacımız olan şey bu. İlk bölümde Front Controller hakkında konuştuğumuzu hatırlıyor musunuz?!

Yönlendirmeyi ayrı bir dosyaya koyacağız rota.phpçekirdek dizine. Bu dosyada, kontrolörlerin yöntemlerini çalıştıracak ve sırayla sayfaların görünümünü oluşturacak olan Route sınıfını tanımlayacağız.

Route.php dosya içeriği

class Route ( statik fonksiyon start() ( // varsayılan kontrolör ve eylem $controller_name = "Main"; $action_name = "index"; $routes = patlat("/", $_SERVER["REQUEST_URI"]); // get denetleyici adı if (!empty($routes)) ( $controller_name = $routes; ) // eylem adını al if (!empty($routes)) ( $action_name = $routes; ) // önek ekle $model_name = " Model_ ".$controller_name; $controller_name = "Controller_".$controller_name; $action_name = "action_".$action_name; // dosyayı model sınıfıyla bağla (bir model dosyası olmayabilir) $model_file = strtolower($model_name) ). ".php"; $model_path = "application/models/".$model_file; if(file_exists($model_path)) ("application/models/".$model_file; içerir) // denetleyici sınıf dosyasını $controller_file kancalayın = strtolower ($controller_name)..".php"; $controller_path = "application/controllers/".$controller_file; if(file_exists($controller_path)) ("application/controllers/".$controller_f içerir ile; ) else ( /* buraya bir istisna atmak doğru olur, ancak basitlik için hemen 404 sayfasına yönlendireceğiz */ Route::ErrorPage404(); ) // bir controller oluştur $controller = new $controller_name; $eylem = $eylem_adı; if(method_exists($controller, $action)) ( // denetleyici eylemini çağırın $controller->$action(); ) else ( // ayrıca buraya bir istisna atmak daha mantıklı olur Route::ErrorPage404(); ) ) function ErrorPage404( ) ( $host = "http://".$_SERVER["HTTP_HOST"]."/"; header("HTTP/1.1 404 Bulunamadı"); header("Durum: 404 Bulunamadı" ); header(" Location:".$host."404"); ) )


Sınıfın çok basitleştirilmiş bir mantık uyguladığını (hacimli koda rağmen) ve belki de güvenlik sorunları olduğunu not ediyorum. Bu bilerek yapıldı çünkü. tam teşekküllü bir yönlendirme sınıfı yazmak, en azından ayrı bir makaleyi hak ediyor. Ana noktalara bir göz atalım...

$_SERVER["REQUEST_URI"] global dizisinin öğesi, kullanıcının başvurduğu tam adresi içerir.
Örneğin: example.ru/contacts/feedback

işlevi kullanma patlamak adres bileşenlere ayrılmıştır. Sonuç olarak, verilen örnek için kontrolörün adını alıyoruz, bu kontrolör kişiler ve bizim durumumuzda eylemin adı - geri bildirim.

Ardından, model dosyası bağlanır (model eksik olabilir) ve varsa denetleyici dosyası ve son olarak denetleyici örneği oluşturulur ve eylem, denetleyici sınıfında açıklanmışsa yeniden çağrılır.

Böylece, örneğin adrese gittiğinizde:
örnek.com/portfolio
veya
example.com/portfolio/index
Yönlendirici aşağıdakileri yapacaktır:

  1. Model_Portfolio sınıfını içeren modeller klasöründen model_portfolio.php dosyasını bağlayın;
  2. Controller_Portfolio sınıfını içeren controllers klasöründen controller_portfolio.php dosyasını dahil edin;
  3. Controller_Portfolio sınıfının bir örneğini oluşturacak ve varsayılan eylemi - içinde açıklanan action_index'i çağıracaktır.
Kullanıcı, var olmayan bir denetleyicinin adresine erişmeye çalışırsa, örneğin:
örnek.com/ufo
daha sonra 404 sayfasına yönlendirilecektir:
örnek.com/404
Kullanıcı, denetleyicide açıklanmayan bir eyleme eriştiğinde de aynısı olacaktır.

2.2. MVC Uygulamasına Dönmek

Çekirdek klasöre gidelim ve route.php dosyasına üç dosya daha ekleyelim: model.php, view.php ve controller.php


Şimdi yazmaya başlayacağımız temel sınıfları içereceklerini hatırlatmama izin verin.

Dosya içeriği model.php
sınıf Model ( genel işlev get_data() ( ) )
Model sınıfı, alt sınıflarda geçersiz kılınacak tek bir boş veri getirme yöntemi içerir. Alt sınıflar oluşturduğumuzda her şey daha net hale gelecektir.

Dosya içeriği görünüm.php
class Görünüm ( //public $template_view; // burada varsayılan genel görünümü belirtebilirsiniz. function create($content_view, $template_view, $data = null) ( /* if(is_array($data)) ( // diziyi dönüştür değişkenlere öğeler extract($data); ) */ "application/views/" içerir.$template_view; ) )
Yöntemi tahmin etmek zor değil. üretmek bir görünüm oluşturacak şekilde tasarlanmıştır. Aşağıdaki parametreler kendisine iletilir:

  1. $content_file - sayfa içeriğini gösteren görünümler;
  2. $template_file - tüm sayfalar için ortak şablon;
  3. $data, sayfanın içerik öğelerini içeren bir dizidir. Genellikle modelde doldurulur.
Dahil etme işlevi, görünümün içine gömüleceği ortak bir şablonu (görünüm) dinamik olarak bağlar.
Belirli bir sayfanın içeriğini görüntülemek için.

Bizim durumumuzda, genel şablon bir üstbilgi, menü, kenar çubuğu ve altbilgi içerecek ve sayfaların içeriği ayrı bir biçimde yer alacaktır. Yine, bu basitlik için yapılır.

Dosya içeriği denetleyici.php
class Controller ( public $model; public $view; function __construct() ( $this->view = new View(); ) function action_index() ( ) )
Yöntem action_index varsayılan olarak çağrılan eylemdir, alt sınıfları uygularken onu geçersiz kılacağız.

2.3. Model ve Denetleyici soyundan gelen sınıfları uygulamak, Görünümler oluşturmak

Şimdi eğlence başlıyor! Kartvizit sitemiz aşağıdaki sayfalardan oluşacaktır:
  1. ev
  2. Hizmetler
  3. portföy
  4. Kişiler
  5. Ve ayrıca - sayfa "404"
Her sayfanın denetleyiciler klasöründen kendi denetleyicisi ve görünümler klasöründen bir görünümü vardır. Bazı sayfalar, modeller klasöründen bir model veya modeller kullanabilir.


Dosya önceki şekilde vurgulanmıştır. template_view.php tüm sayfalar için ortak işaretleme içeren bir şablondur. En basit durumda, şöyle görünebilir:
ev


Siteye prezentabl bir görünüm kazandırmak için, bir CSS şablonu oluşturacağız ve HTML işaretlemesinin yapısını değiştirerek ve CSS ve JavaScript dosyalarını ekleyerek onu sitemize entegre edeceğiz:

Makalenin sonunda, “Sonuç” bölümünde, basit bir şablonun entegrasyonunun yapıldığı bir proje ile GitHub deposuna bağlantı bulunmaktadır.

2.3.1. Ana sayfanın oluşturulması

Kontrolör ile başlayalım controller_main.php, işte kodu:
class Controller_Main Controller'ı genişletir ( function action_index() ( $this->view->generate("main_view.php", "template_view.php"); ) )
yöntem üretmek View sınıfının bir örneği, genel şablonun dosyalarının adları ve sayfanın içeriğini içeren görünüm iletilir.
İndeks eylemine ek olarak, denetleyici elbette başka eylemler de içerebilir.

Dosyayı daha önce genel bir bakış açısıyla ele almıştık. Bir içerik dosyası düşünün main_view.php:

Hoş geldin!

OLOLOSHA TEAM, beş ya da altı yüzyıl önce Ekvator Afrikası ustaları tarafından yaratılan Meksika maskeleri, Hindistan ve Seylan'dan bronz ve taş heykeller, kısma ve heykeller toplama konusunda uzun yıllara dayanan deneyime sahip birinci sınıf web sitesi geliştirme uzmanlarından oluşan bir ekip. .


Bu, herhangi bir PHP çağrısı olmadan basit işaretleme içerir.
Ana sayfayı görüntülemek için aşağıdaki adreslerden birini kullanabilirsiniz:

Modelden alınan verileri görüntüleyen bir görünüm kullanma örneği daha sonra tartışılacaktır.

2.3.2. Portföy Sayfası Oluşturma

Bizim durumumuzda, Portföy sayfası modeli kullanan tek sayfadır.
Model genellikle veri alma yöntemlerini içerir, örneğin:
  1. yerel pgsql veya mysql kitaplıklarının yöntemleri;
  2. veri soyutlamayı uygulayan kitaplık yöntemleri. Örneğin, PEAR MDB2 kitaplığının yöntemleri;
  3. ORM yöntemleri;
  4. NoSQL ile çalışma yöntemleri;
  5. ve benzeri.
Basit olması için burada SQL sorguları veya ORM deyimleri kullanmayacağız. Bunun yerine, gerçek verileri simüle eder ve hemen bir dizi sonuç döndürürüz.
Model Dosyası model_portfolio.php modeller klasörüne atın. İşte içeriği:
class Model_Portfolio Model'i genişletir ( public function get_data() ( return array(array("Yıl" => "2012", "Site" => "http://DunkelBeer.ru", "Description" => "Dark Dunkel bira Alman üretici Löwenbraü, Rusya'da "SUN InBev" bira şirketi tarafından üretildi."), array("Yıl" => "2012", "Site" => "http://ZopoMobile.ru", "Açıklama" => "Android işletim sistemine ve aksesuarlara dayalı Çince Zopo telefonlarının Rusça dil kataloğu.", // todo); ) )

Model denetleyici sınıfı dosyada bulunur controller_portfolio.php, işte kodu:
class Controller_Portfolio Controller'ı genişletir ( function __construct() ( $this->model = new Model_Portfolio(); $this->view = new View(); ) function action_index() ( $data = $this->model->get_data( ); $this->view->generate("portfolio_view.php", "template_view.php", $veri); ) )
bir değişkene veri yöntem tarafından döndürülen dizi yazılır get_data, daha önce düşündük.
Bu değişken daha sonra bir yöntem parametresi olarak iletilir. üretmek, ayrıca iletilir: ortak şablona sahip dosyanın adı ve sayfa içeriğine sahip görünümü içeren dosyanın adı.

Sayfanın içeriğini içeren görünüm bir dosyada portföy_view.php.

portföy

Aşağıdaki tablodaki tüm projeler hayal ürünüdür, bu nedenle verilen linkleri takip etmeye bile çalışmayın. "; } ?>
YılProjeTanım
".$satır["Yıl"]."".$satır["Site"]."".$satır["Açıklama"]."


Burada her şey basit, görünüm modelden alınan verileri gösteriyor.

2.3.3. Sayfaların geri kalanını oluşturma

Sayfaların geri kalanı aynı şekilde oluşturulur. Kodları, makalenin sonunda “Sonuç” bölümünde verilen bir bağlantı olan GitHub'daki depoda mevcuttur.

3. Sonuç

Ve işte sonunda olanlar:

Ortaya çıkan kartvizit sitesinin ekran görüntüsü



GitHub'a bağlantı: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

Ancak bu versiyonda aşağıdaki sınıfları (ve bunlara karşılık gelen türlerini) çizdim:

  • Controller_Login, bir oturum açma ve şifre girme formu ile bir görünümün oluşturulduğu, ardından kimlik doğrulama prosedürünün gerçekleştirildiği ve başarılı olursa kullanıcının yönetici paneline yönlendirildiği.
  • Contorller_Admin, kullanıcının sitede daha önce yönetici olarak yetkilendirilip yetkilendirilmediğini kontrol eden bir dizin eylemi (eğer öyleyse, yönetici görünümü görüntülenir) ve oturumu kapatmak için bir oturum kapatma eylemi ile.
Kimlik doğrulama ve yetkilendirme farklı bir konudur, bu nedenle burada ele alınmamaktadır, ancak üzerine inşa edilecek bir şey olması için yalnızca yukarıda belirtilen bağlantı sağlanmıştır.

4. Sonuç

MVC modeli, niteliksel olarak daha karmaşık çözümleri daha kısa sürede geliştirebilmek için oluşturulan birçok çerçeve ve CMS'de mimari bir temel olarak kullanılır. Bu, insan beyninin üzerinde çalışabileceği yapıların karmaşıklığının bir sınırı olduğundan, soyutlama düzeyinin artırılmasıyla mümkün olmuştur.

Ancak basit web uygulamaları (örneğin, kartvizit siteleri) geliştirirken birkaç yüz dosyadan oluşan Yii veya Kohana gibi web çerçevelerini kullanmak her zaman tavsiye edilmez. Artık Php, Html, CSS ve JavaScript kodunu tek dosyada karıştırmamak için güzel bir MVC modeli oluşturabiliriz.

Bu makale, web uygulamanızın temeli olarak alabileceğiniz gerçekten doğru bir şeyin bir örneğinden çok, CMF öğrenmek için bir başlangıç ​​noktasıdır. Belki de size ilham verdi ve şimdiden MVC'ye dayalı kendi mikro çerçevenizi veya CMS'nizi yazmayı düşünüyorsunuz. Ancak, "blackjack ve fahişeler" ile bir sonraki tekerleği icat etmeden önce, tekrar düşünün, belki de çabalarınızı geliştirmeye yönlendirmek ve mevcut bir projenin topluluğuna yardım etmek daha akıllıca olur mu?!

Not: Yazı, yorumlara bırakılan bazı yorumlar dikkate alınarak yeniden yazılmıştır. Eleştiri çok yardımcı oldu. Yanıta bakılırsa: yorumlar, kişisel itirazlar ve gönderiyi favorilerine ekleyen kullanıcı sayısı, bu gönderiyi yazma fikrinin o kadar da kötü olmadığı ortaya çıktı. Ne yazık ki, tüm istekleri dikkate almak, daha fazla ve daha ayrıntılı yazmak zamansızlıktan dolayı mümkün değil ... ama belki de orijinal versiyondan eksilen o gizemli kişilikler bunu yapacak. Projelerinizde iyi şanslar!

5. Konuyla ilgili faydalı linklerden bir seçki

Makale genellikle web çerçeveleri konusuna değinir - bu çok kapsamlı bir konudur, çünkü mikro çerçeveler bile birbirine akıllıca bağlanmış birçok bileşenden oluşur ve bu bileşenler hakkında konuşmak için birden fazla makale gerekir. Ancak, burada bir şekilde çerçeveler konusuyla ilgili olan (bu makaleyi yazarken gittiğim) küçük bir bağlantı seçkisi vermeye karar verdim.

Etiketler:

  • php
  • çerçeve
  • cmf
  • mvc
  • alan
Etiket ekle

Bu yazıda, MVC kavramını ve bir örnekle bunu PHP'de nasıl uygulayabileceğinizi anlayacağız.

MVC Kavramı

MVC(model görünümü denetleyicisi, " Model-Görünüm-Davranış», « Model-Görünüm-Denetleyici”), kontrol mantığının, birini değiştirmenin diğerleri üzerinde minimum etkisi olacak şekilde üç ayrı bileşene ayrıldığı bir uygulama tasarım modelidir.

MVC şablonu, bir php programcısının (veya bir grup programcının bölümlere ayrılmasının), bir tasarımcının, bir kodlayıcının vb. çalışmalarını ayırmanın gerekli olduğu karmaşık projeler oluştururken kullanmak için iyidir.

MVC modeli, sunumu, verileri ve kullanıcı eylemlerinin işlenmesini üç ayrı bileşene ayırır:

MVC Modeli(modeli). Model veri sağlar (genellikle Görünüme) ve ayrıca durumunu değiştirerek isteklere (genellikle denetleyiciden) yanıt verir.

MVC Görünümü(Görüş). Bilgilerin görüntülenmesinden sorumludur (kullanıcı arayüzü).

MVC Davranışı(Kontrolör). Kullanıcı girdisini yorumlar ve uygun şekilde tepki vermesi için model ve görünümü bilgilendirir.

Anlaşılır olması için, MVC modelinin şeması, aşağıda bir örnek verilmiştir.

Sunum ve davranış gibi bileşenler modele bağlıdır ancak hiçbir şekilde etkilemez. Bir modelin birden fazla görünümü olabilir. Belki MVC kavramını anlamak zordur, ancak bir kez anlaşıldığında PHP'de uygulama geliştirirken vazgeçilmez hale gelir.

PHP'de MVC

PHP'de MVC kullanırken özel bir özellik, php uygulamasında örneğin aşağıdaki gibi elde edilen bir giriş noktası olmasıdır. Tüm isteklerin işleneceği bir index.php oluşturulur, bunun için dizin içeren klasörde bir .htaccess dosyası oluştururuz ve içine aşağıdaki kodu yerleştiririz:

RewriteCond'da RewriteEngine %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule ^(.*)$ index.php?route=$1

Sağlanan kodda, ilk satır istenen dosyanın olup olmadığını kontrol eder ve mevcut değilse index.php'ye yönlendirilir, aksi takdirde site görsel istekleri bile dizine yönlendirilir. Kodun son satırı index.php?route=chat/index gibi istekleri like index.php/chat/index'e dönüştürür. Uygulamanızda ModRewrite'ı kullanamıyorsanız, yönlendirmeyi manuel olarak yapmanız gerekecektir.

PHP Modeli

PHP modeliyle ilgili veriler, özniteliklerinde bulunur ve yalnızca özel işlevler aracılığıyla değiştirilebilir. Bir model birden çok görünüm içerebilir. Kural olarak, phpmodel veritabanı ile çalışan bir sınıftır, daha spesifik olarak: yazma, okuma, silme. Doğal olarak, veri tabanından bilgi okuma, birkaç görünüm (fonksiyon) ile uygulanabilir. Örnek olarak, sitedeki makalelerin modeli: veritabanından belirli bir makaleyi, en son, popüler, bazı kategorilerin bir listesini alabilirsiniz ... bunların hepsi modelin temsilleridir. Anlaşılır olması için aşağıda bir php modeli örneği verilmiştir.

PHP Denetleyicisi (Davranış)

PHP denetleyicileri, index.php üzerinden gönderdiğimiz kullanıcı isteklerini alır ve bunlara göre modelin çalışmasını ayarlar. Php uygulamasının çalışmasını kontrol ettiklerini söylemek daha doğru olur.

PHP Görünümü

Görünüm, modeldeki değişikliği izler ve uygulamanın php arabirimini oluşturur veya değiştirir.

veri listesi

ad?>

soyadı?>



Bu nasılPHPMVC kalıbı?

Kullanıcı istenen url'ye eriştiğinde, görünüm ve modele atıfta bulunan ilgili denetleyici seçilir ve bilgi görüntülenir. Başka bir deyişle, mvc'deki denetleyici, model ile görünüm arasındaki bağlantıdır.

PHP uygulaması oluştururken MVC modelinin avantajları

Yukarıda belirtildiği gibi, bu, her şeyden önce, php sitesi geliştiricilerinin bölümlere ayrılmasıdır. Büyük bir proje oluşturulursa php uygulamasının hızı da artar. Pekala, doğrudan php geliştiricisinin kendisini ilgilendiren şey, php kodunun doğru yapılandırılmasıdır (her şey yerli yerinde, anlaşılması daha kolay).

MVC örneği

Zaten var olduğu için MVC'nin nasıl çalıştığına dair örneğe fazla takılmayacağız.Daha derin bir anlayış için birkaç diyagram daha ekleyeceğim.

PHP'deki MVC şablonunun başka bir şeması, anlaşılır olmaktan daha fazlasıdır.



Fok
Konunun devamı:
pencereler

Natalya Komarova , 28/05/2009 (03/25/2018) Bir forum veya blog okuduğunuzda, gönderilerin yazarlarını takma adla ve ... kullanıcının resmiyle, sözde avatarla hatırlarsınız ....