Tasarım kalıplarını bile duymuş ve hatta şu mükemmel kitaplara göz atmış olabilirsiniz:
- E. Gamma, R. Helm, R. Johnson, J. Vlissides "Nesne Yönelimli Tasarım Teknikleri. Tasarım desenleri ";
- M. Fowler "Kurumsal Yazılım Uygulamalarının Mimarisi".
Sunulan makale öncelikle yeni başlayanlar için faydalı olacaktır. Her neyse, umarım birkaç saat içinde tüm modern web çerçevelerinin temelini oluşturan MVC modelinin uygulanması hakkında bir fikir edinebilir ve "nasıl yapılır" hakkında daha fazla düşünmek için biraz "yiyecek" elde edebilirsiniz. o." Makalenin sonunda, web çerçevelerinin (MVC'nin yanı sıra) nelerden yapıldığını ve nasıl çalıştıklarını anlamanıza yardımcı olacak bir dizi faydalı bağlantı bulunmaktadır.
Sert çekirdekli PHP programcılarının bu makalede kendileri için yeni bir şey bulması pek olası değildir, ancak ana metinle ilgili açıklamaları 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 hemen uygulamaya geçebilirsiniz.
1. Teori
MVC modeli, iş mantığını kullanıcı arabiriminden ayırma hedefiyle bir uygulamanın yapısını oluşturmanın kolay bir yolunu açıklar. Sonuç olarak, uygulamanın ölçeklenmesi, test edilmesi, bakımı ve elbette uygulanması daha kolaydır.MVC modelinin kavramsal şemasına bir göz atalım (bence bu gördüğüm en başarılı şema):
MVC mimarisinde, model veri ve iş mantığı kuralları sağlar, görünüm kullanıcı arabiriminden sorumludur ve denetleyici, model ile görünüm arasındaki etkileşimden sorumludur.
Bir MVC uygulaması için tipik bir iş akışı aşağıdaki gibi tanımlanabilir:
- 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. - Uygulama, kullanıcıdan isteği alır ve istenen denetleyiciyi ve eylemi belirler. Kalıp sayfa olması durumunda, varsayılan eylem ( dizin).
- Uygulama, denetleyiciyi başlatır ve eylem yöntemini çalıştırır,
örneğin, veri tabanından bilgileri okuyan model çağrılarını içerir. - Bundan sonra eylem, modelden elde edilen verilerle bir görünüm oluşturur ve sonucu kullanıcıya gösterir.
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 görüntü kodu oluşturmamalıdır. Bu tür kodlar görünümlerde işlenmelidir.
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 uygulamaya ö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 geçmek, biçimlendirmek ve görüntülemek için HTML işaretlemesi ve PHP kodunun küçük eklerini içerir.
Veritabanına doğrudan erişmemelidir. Bu modeller tarafından yapılmalıdır.
Bir kullanıcı isteğinden elde edilen 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 üst bilgi ve alt bilgi) içeren ortak bir şablona ve modelden veri çıktısını görüntülemek veya veri giriş formlarını görüntülemek için kullanılan şablonun bölümlerine bölünür.
kontrolör- modelleri, görünümleri ve diğer bileşenleri bir üretim uygulamasına bağlayan yapıştırıcı. Kontrolör, kullanıcı isteklerinin işlenmesinden sorumludur. Denetleyici, SQL sorguları içermemelidir. En iyi modellerde tutulurlar. Denetleyici HTML veya başka bir işaretleme içermemelidir. Türlerde çıkarılmalıdır.
İyi tasarlanmış bir MVC uygulamasında, denetleyiciler genellikle çok incedir ve yalnızca birkaç düzine kod satırı içerir. Bu, CMS Joomla'daki Aptal Yağ Kontrolörleri (SFC) hakkında söylenemez. Denetleyici mantığı oldukça tipiktir ve çoğu temel sınıflarda gerçekleştirilir.
Modeller ise çok kalındır ve veri işleme kodunun çoğunu içerir. içerdiği veri yapısı ve iş mantığı genellikle uygulamaya özeldir.
1.1. Ön Denetleyici ve Sayfa Denetleyicisi
Çoğu durumda, kullanıcının web uygulamasıyla etkileşimi, bağlantılara tıklayarak gerçekleşir. Şimdi tarayıcınızın adres çubuğuna bakın - bu bağlantıyı bu metni aldınız. Bu sayfanın sağındaki gibi diğer bağlantılar size farklı içerik verecektir. Bu nedenle, bağlantı, web uygulamasına belirli bir komutu temsil eder.Umarım farklı sitelerin adres çubuğunu oluşturmak için mükemmel farklı biçimlere 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 tür metin ve kullanıcı profili gösteren iki seçeneği göz önünde bulundurun.
İlk seçenek:
- www.example.com/article.php?id=3
- www.example.com/user.php?id=4
İkinci seçenek:
- www.example.com/index.php?makale=3
- www.example.com/index.php?user=4
Çoklu temas noktası yaklaşımını phpBB forumlarında görebilirsiniz. Forum bir komut dosyası aracılığıyla görüntüleniyor viewforum.php, konuyu görüntüleyerek viewtopic.php vesaire. Tek bir fiziksel komut dosyası aracılığıyla erişime sahip ikinci yaklaşım, tüm çağrıların geçtiği en sevdiğim CMS MODX'te gözlemlenebilir. index.php.
Bu iki yaklaşım tamamen farklıdır. Birincisi, Sayfa Denetleyici kalıbının özelliğidir ve ikinci yaklaşım Ön Denetleyici kalıbı tarafından uygulanır. Sayfa denetleyicisi, oldukça basit bir mantığa sahip siteler için iyidir. Buna karşılık, istek denetleyicisi, istekleri işlemek için tüm eylemleri tek bir yerde birleştirir; bu, genellikle sayfa denetleyicisi tarafından gerçekleştirilenden daha zor görevlerin uygulanmasının mümkün olduğu ek yetenekler sağlar. Sayfa denetleyicisinin uygulanmasının ayrıntılarına girmeyeceğim, ancak yalnızca pratik kısımda geliştirilecek olanın istek denetleyicisi olacağını söyleyeceğim (biraz benzerlik).
1.2. URL yönlendirme
URL yönlendirme, uygulamanızı, uygulamadaki gerçek dosyalarla eşleşmeyen URL'lerden gelen istekleri kabul edecek ve ayrıca kullanıcılar için anlamsal olarak anlamlı olan ve arama motoru optimizasyonu için tercih edilen CNC'leri kullanacak şekilde yapılandırmanıza olanak tanır.Örneğin, bir iletişim formu görüntüleyen normal bir sayfa için URL şöyle görünebilir:
http://www.example.com/contacts.php?action=feedback
Bu durumda yaklaşık işleme kodu:
switch ($ _GET ["eylem"]) ("hakkında" durum: require_once ("about.php"); // "Hakkımızda" sayfası kırmak; case "kişiler": require_once ("contacts.php"); // "Kişiler" sayfası kırmak; case "feedback": require_once ("feedback.php"); // "Geri bildirim" sayfası kırmak; 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 bu 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. görüntüleyen kişiler adı verilen bir denetleyici yöntemidir. Bu konuya pratik kısımda döneceğiz.
Ayrıca, birçok web çerçevesi yönlendiricisinin, rastgele URL yolları oluşturmanıza (URL'nin her bir bölümünün ne anlama geldiğini belirtin) ve bunları nasıl ele alacağınızı 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, çekirdek klasörün temel Model, Görünüm ve Denetleyici sınıflarını depolayacağını söyleyeceğim.
Onların soyundan gelenler denetleyicilerde, modellerde ve görünüm dizinlerinde saklanacaktır. Dosya index.php Bu, uygulamanın dönüşünde bir nokta. Dosya bootstrap.php gerekli tüm modülleri bağlayarak uygulamanın indirilmesini başlatır, vb.
Sürekli gideceğiz; index.php dosyasını açın ve aşağıdaki kodla doldurun:
ini_set ("display_errors", 1); require_once "application / bootstrap.php";
Herhangi bir soru olmamalı.
Sonra, doğrudan dosyaya gidelim bootstrap.php:
require_once "çekirdek / model.php"; require_once "çekirdek / görünüm.php"; require_once "çekirdek / controller.php"; require_once "çekirdek / route.php"; Rota :: başlangıç (); // yönlendiriciyi başlat
İlk üç satır, var olmayan çekirdek dosyaları içerecektir. Son satırlar dosyayı yönlendirici sınıfına bağlar ve statik başlatma yöntemini çağırarak yürütme için başlatır.
2.1. URL yönlendirici uygulaması
Şimdilik, MVC modelinin uygulanmasından sapalım ve yönlendirme ile ilgilenelim. Yapmamız gereken ilk adım aşağıdaki kodu yazmak. .htaccess:RewriteCond% (REQUEST_FILENAME) üzerinde RewriteEngine! -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 Ön Kontrolör hakkında konuştuğumuzu hatırlıyor musunuz?
Yönlendirmeyi ayrı bir dosyaya koyacağız rota.phpçekirdek dizine. Bu dosyada, denetleyici yöntemlerini çalıştıracak ve sırayla sayfa görünümünü oluşturacak olan Route sınıfını tanımlayacağız.
Route.php dosya içeriği
sınıf Rota ( statik fonksiyon başlangıcı () ( // denetleyici ve varsayılan eylem$ controller_name = "Ana"; $ action_name = "indeks"; $ route = patlat ("/", $ _SERVER ["REQUEST_URI"]); // denetleyicinin adını al if (! boş ($ rota)) ($ controller_name = $ rota;) // eylemin adını al if (! boş ($ rota)) ($ action_name = $ rota;) // ö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 (model dosyası mevcut olmayabilir)$ model_dosyası = strtolower ($ model_adı). ".php"; $ model_path = "application / modeller /".$ model_file; if (file_exists ($ model_path)) ("application / modeller /" içerir. $ model_file;) // dosyayı controller sınıfıyla bağla$ controller_file = strtolower ($ controller_name). ".php"; $ controller_path = "uygulama / kontrolörler /". $ controller_file; if (file_exists ($ controller_path)) ("application / controllers /" içerir. $ controller_file;) else ( / * buraya bir istisna atmak doğru olur, ancak basitlik için hemen bir 404 sayfasına yönlendireceğiz * / Rota :: ErrorPage404 (); ) // bir denetleyici oluştur$ denetleyici = yeni $ denetleyici_adı; $eylem = $eylem_adi; if (method_exists ($ denetleyici, $ eylem)) ( // denetleyici eylemini çağır$ denetleyici -> $ eylem (); ) Başka ( // buraya bir istisna atmak da daha mantıklı olur Rota :: ErrorPage404 (); )) fonksiyon ErrorPage404 () ($ host = "http://". $ _ SUNUCU ["HTTP_HOST"]. "/"; başlık ("HTTP / 1.1 404 Bulunamadı"); başlık ("Durum: 404 Bulunamadı"); başlık ("Konum:". $ ana bilgisayar. "404"); ))
Sınıfın çok basitleştirilmiş bir mantık uyguladığını (büyük koda rağmen) ve hatta güvenlik sorunları olabileceğini unutmayın. 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 noktaları düşünelim ...
$ _SERVER ["REQUEST_URI"] global dizisinin öğesi, kullanıcının iletişim kurduğ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 denetleyicinin adını alıyoruz, bu denetleyici kişiler ve bizim durumumuzda eylemin adı - geri bildirim.
Ardından, model dosyası bağlanır (model olmayabilir) ve varsa denetleyici dosyası ve son olarak denetleyici somutlaştırılır ve denetleyici sınıfında açıklanmışsa eylem yeniden çağrılır.
Böylece, örneğin adrese giderken:
örnek.com/portfolio
veya
example.com/portfolio/index
yönlendirici şunları yapacaktır:
- Model_Portfolio sınıfını içeren modeller klasöründeki model_portfolio.php dosyasını içerecektir;
- Controller_Portfolio sınıfını içeren controllers klasöründeki controller_portfolio.php dosyasını içerecektir;
- 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.
örnek.com/ufo
ardından "404" sayfasına yönlendirilecektir:
örnek.com/404
Kullanıcı, denetleyicide açıklanmayan bir eylemde bulunduğunda da aynısı olacaktır.
2.2. MVC uygulamasına geri dön
Ç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 Modeli ( halka açık fonksiyon get_data() (
}
}
Model sınıfı, alt sınıflarda çakışacak 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
sınıf Görünümü (
// genel $ template_view; // burada varsayılan genel görünümü belirtebilirsiniz.
fonksiyon üret ( $ içerik_görünümü, $ şablon_görünüm, $ veri = boş)
{
/ * if (is_array ($ veri)) (// dizi öğelerini değişkenlere dönüştürün özü ($ veri);) * /"application / görünümler /" 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:
- $ content_file - sayfa içeriğini gösteren görünümler;
- $ template_file - tüm sayfalar için ortak şablon;
- $ data, sayfa içeriği öğelerini içeren bir dizidir. Genellikle modelde doldurulur.
Belirli bir sayfanın içeriğini görüntülemek için.
Bizim durumumuzda genel şablon ü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 controller.php
sınıf Denetleyici ( genel $ modeli; genel $ görünümü; işlev __construct () ($ bu -> görünüm = yeni Görünüm (); )))
Yöntem action_index- bu varsayılan eylemdir, alt sınıfları uygularken onu geçersiz kılacağız.
2.3. Model ve Denetleyici alt sınıflarını uygulama, Görünüm "s oluşturma
Şimdi eğlence başlıyor! Kartvizit sitemiz aşağıdaki sayfalardan oluşacaktır:- ev
- Hizmetler
- portföy
- Kişiler
- Ve ayrıca - sayfa "404"
Önceki şekilde, dosya ayrı ayrı 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:
<html lang = "ru">
<kafa>
<meta karakter kümesi = "utf-8"> <başlık> evbaşlık>
kafa>
<vücut>
$ içerik_görünümü; ?> vücut>
html>
Siteye prezentabl bir görünüm kazandırmak için bir CSS şablonu oluşturuyoruz ve HTML işaretlemesinin yapısını değiştirerek ve CSS ve JavaScript dosyalarını ekleyerek bunu sitemize entegre ediyoruz:
<link rel = "stil sayfası" tipi = "metin / css" href = "/ css / style.css" />
<komut dosyası src = "/ js / jquery-1.6.2.js" type = "metin / javascript">komut dosyası>
Makalenin sonunda, "Sonuç" bölümünde, basit bir şablonu entegre etmek için adımların atıldığı bir proje ile GitHub deposuna bir bağlantı var.
2.3.1. Bir ana sayfa oluşturun
Kontrolör ile başlayalım controller_main.php, işte kodu:class Controller_Main Controller'ı genişletir ( işlev action_index () ($ this -> view-> create ("main_view.php", "template_view.php"); ))
yönteme üretmek View sınıfının bir örneği, genel şablonun dosyalarının adları ve sayfa içeriğine sahip 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 inceledik. Bir içerik dosyası düşünün main_view.php:
<h1> Hoş geldin!h1>
<p>
<img src = "/ resimler / office-small.jpg" hizalama = "sol">
<a href = "/"> OLOLOSHA TAKIMIbir>- Beş ila altı yüzyıl önce Ekvator Afrikalı ustalar tarafından yaratılan Meksika maskeleri, Hindistan ve Seylan'dan bronz ve taş heykeller, kısmalar ve heykeller toplama konusunda yılların deneyimine sahip birinci sınıf web sitesi kurucularından oluşan bir ekip ...p>
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:
- veri soyutlamayı uygulayan kitaplık yöntemleri. Örneğin, PEAR MDB2 kitaplığının yöntemleri;
- ORM yöntemleri;
- NoSQL ile çalışma yöntemleri;
- ve benzeri. Basit olması için burada SQL sorguları veya ORM deyimleri kullanmayacağız. Bunun yerine, gerçek verileri taklit edeceğiz ve hemen bir dizi sonuç döndüreceğiz.
- Controller_Login, bir kullanıcı adı ve şifre girmek için bir form içeren bir görünümün oluşturulduğu, doldurulduktan sonra bir kimlik doğrulama prosedürünün gerçekleştirildiği ve başarılı olması durumunda kullanıcının admin paneline yönlendirildiği.
- Contorller_Admin, kullanıcının sitede daha önce yönetici olarak yetkilendirilip yetkilendirilmediğinin (eğer öyleyse, yönetici panelinin görünümü görüntülenir) kontrol edildiği bir dizin eylemi ve oturumu kapatmak için bir oturum kapatma eylemi ile.
- E. Gamma, R. Helm, R. Johnson, J. Vlissides "Nesne Yönelimli Tasarım Teknikleri. Tasarım desenleri ";
- M. Fowler "Kurumsal Yazılım Uygulamalarının Mimarisi".
- 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. - Uygulama, kullanıcıdan isteği alır ve istenen denetleyiciyi ve eylemi belirler. Kalıp sayfa olması durumunda, varsayılan eylem ( dizin).
- Uygulama, denetleyiciyi başlatır ve eylem yöntemini çalıştırır,
örneğin, veri tabanından bilgileri okuyan model çağrılarını içerir. - Bundan sonra eylem, modelden elde edilen verilerle bir görünüm oluşturur ve sonucu kullanıcıya gösterir.
- Model_Portfolio sınıfını içeren modeller klasöründeki model_portfolio.php dosyasını içerecektir;
- Controller_Portfolio sınıfını içeren controllers klasöründeki controller_portfolio.php dosyasını içerecektir;
- 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.
- $ content_file - sayfa içeriğini gösteren görünümler;
- $ template_file - tüm sayfalar için ortak şablon;
- $ data, sayfa içeriği öğelerini içeren bir dizidir. Genellikle modelde doldurulur.
- ev
- Hizmetler
- portföy
- Kişiler
- Ve ayrıca - sayfa "404"
- yerel pgsql veya mysql kitaplıklarının yöntemleri;
- veri soyutlamayı uygulayan kitaplık yöntemleri. Örneğin, PEAR MDB2 kitaplığının yöntemleri;
- ORM yöntemleri;
- NoSQL ile çalışma yöntemleri;
- ve benzeri.
- Controller_Login, bir kullanıcı adı ve şifre girmek için bir form içeren bir görünümün oluşturulduğu, doldurulduktan sonra bir kimlik doğrulama prosedürünün gerçekleştirildiği ve başarılı olması durumunda kullanıcının admin paneline yönlendirildiği.
- Contorller_Admin, kullanıcının sitede daha önce yönetici olarak yetkilendirilip yetkilendirilmediğinin (eğer öyleyse, yönetici panelinin görünümü görüntülenir) kontrol edildiği bir dizin eylemi ve oturumu kapatmak için bir oturum kapatma eylemi ile.
- Şablon yazanların php'ye aşina olmadığı ve bu nedenle “bu $ this-> ne anlama gelebilir? ".
- Değişkenler için ayrı bir kapsayıcıya sahip olmak, o sınıfa özel olması gereken bazı görünüm özellikleri olduğunda ve kütüphaneciler bunları şablonlara maruz bırakmak istemediğinde de yardımcı olur.
- Şablonlar için yerel görünüm özellikleri ve değişkenleri ile ad çakışmalarını önler.
- Yöntem tabanlı erişim şemalarından çok daha hızlı. Örneğin, smarty oluşturulduğunda olduğu gibi (php4 ile de çalıştı) şimdi alakalı olmayabilir.
model dosyası model_portfolio.php modeller klasörüne atın. İşte içeriği:
class Model_Portfolio, Modeli genişletir ( halka açık fonksiyon get_data() ( dönüş dizisi (dizi ("Yıl" => "2012", "Site" => "http://DunkelBeer.ru", "Açıklama" =>) "SAN InBev bira şirketi tarafından Rusya'da üretilen Alman üretici Löwenbraü'den Dunkel koyu bira için tanıtım sitesi."), dizi ("Yıl" => "2012", "Site" => "http://ZopoMobile.ru", "Açıklama" => "Zopo şirketinden Android işletim sistemine ve aksesuarlarına dayalı Rusça Çince telefon kataloğu."), // yapmak); ))
Model denetleyici sınıfı dosyada bulunur controller_portfolio.php, işte kodu:
class Controller_Portfolio, Controller'ı genişletir (
işlev __construct () ($ bu -> model = yeni Model_Portföy(); $ bu -> görünüm = yeni Görünüm (); ) işlev action_index () ($ veri = $ bu -> model-> get_data(); $ this -> view-> create ("portfolio_view.php", "template_view.php", $ data); ))
bir değişkene veri yöntem tarafından döndürülen dizi yazılır get_data ki daha önce bakmıştık.
Ayrıca, bu değişken yöntemin bir parametresi olarak iletilir. üretmek, bunlar da iletilir: ortak şablona sahip dosyanın adı ve sayfanın içeriğine sahip görünümü içeren dosyanın adı.
Sayfa içeriğini içeren görünüm dosyadadır. portföy_view.php.
portföy
Yıl | proje | Açıklama | ". $ satır [" Yıl "]." | ". $ satır [" Site "]." | ". $ satır [" Açıklama "]." | " ; }
Yıl | proje | Açıklama | ". $ satır [" Yıl "]." | ". $ satır [" Site "]." | ". $ satır [" Açıklama "]." | "; } ?>
Burada her şey basit, görünüm modelden elde edilen verileri gösteriyor.
2.3.3. Sayfaların geri kalanını oluşturun
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 sonunda ne oldu:Ortaya çıkan kartvizit sitesinin ekran görüntüsü
GitHub bağlantısı: https://github.com/vitalyswipe/tinymvc/zipball/v0.1
Ancak bu versiyonda, aşağıdaki sınıfları (ve bunlara karşılık gelen görünümleri) çizdim:
4. Sonuç
MVC modeli, daha kısa sürede daha yüksek kalitede daha karmaşık çözümler 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üzeyindeki artış nedeniyle mümkün oldu.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şturabiliyoruz.
Bu makale, web uygulamanız için temel 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 siz zaten MVC'ye dayalı kendi mikro çerçevenizi veya CMS'nizi yazmayı düşünüyorsunuz. Ancak, bir sonraki bisikleti "blackjack ve fahişeler" ile yeniden icat etmeden önce, tekrar düşünün, belki çabalarınız daha akıllıca geliştirmeye ve mevcut bir projenin topluluğuna yardım etmeye yönlendirilebilir mi?!
Not: Yazı, yorumlarda 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 istekler 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 ve zaman darlığı nedeniyle daha ayrıntılı yazmak mümkün değil ... ama belki de orijinal versiyonu eksilen o gizemli figürler tarafından yapılacak. Projelerinizde iyi şanslar!
5. Konuyla ilgili faydalı linklerden bir seçki
Makale genellikle web çerçeveleri konusuna değinir - bu çok geniş bir konudur, çünkü mikro çerçeveler bile akıllıca birbirine bağlı birçok bileşenden oluşur ve bu bileşenler hakkında konuşmak için birden fazla makale gerekir. Yine de, burada, bir şekilde çerçeveler konusuyla ilgili olan (bu makaleyi yazarken izlediğim) küçük bir bağlantı seçimi vermeye karar verdim.Etiketler: Etiket Ekle
SO ile ilgili hemen hemen tüm öğreticilerde veya yanıtlarda, denetleyiciden görünüme veri göndermenin genel bir yolunu görüyorum, Görünüm sınıfı genellikle aşağıdaki koda benzer:
Sınıf Görünümü (korumalı $ _file; korumalı $ _data = dizi (); genel işlev __construct ($ dosya) ($ bu -> _ dosya = $ dosya;) genel işlev kümesi ($ anahtarı, $ değer) ($ bu -> _ data [ $ key] = $ value;) public function get ($ key) (return $ this -> _ data [$ key];) public fonksiyon çıktısı () (eğer (! file_exists ($ this -> _ file)) (yeni İstisna at ("Şablon". $ Bu -> _ dosya. "Mevcut" değil. ");) Çıkart ($ bu -> _ veri); ob_start (); include ($ bu -> _ dosya); $ çıktı = ob_get_contents (); ob_end_clean (); yankı $ çıktı;))
Neden bir diziye veri koymam ve ardından özü ($ this -> _ data) çağırmam gerektiğini anlamıyorum. Neden bazı özellikleri doğrudan denetleyiciden görünümün içine koymuyorsunuz?
$ this -> _ view-> title = "(! LANG: merhaba dünya"; !}sonra düzen veya şablon dosyamda şunları yapabilirim:
Echo $ this-> başlık;
Görünüm verilerini mantıksal olarak gruplandırmak ve dahili görünüm sınıfının özelliklerinden ayırmak mantıklıdır.
PHP, özellikleri dinamik olarak atamanıza izin verir, böylece View sınıfını kolayca başlatabilir ve verilerinizi özellikler olarak atayabilirsiniz. Şahsen bunu tavsiye etmem. Görünüm verileri üzerinde yineleme yapmak veya yalnızca hata ayıklama için boşaltmak isterseniz ne olur?
Görünüm verilerini bir dizide depolamak veya bir dosn "t nesnesi içermek, ona erişmek için $ this-> get (" x ") kullanmanız gerektiği anlamına gelir. Seçenek, verileri bir dizi olarak depolamanıza izin verecek bir PHP5 özellik aşırı yüklemesi kullanmaktır. dizi, ancak şablondan verilerle $ this-> x arayüzüne sahip olun.
Sınıf Görünümü (korumalı $ _data = dizi (); ... ... public function __get ($ name) (if (array_key_exists ($ name, $ this -> _ data)) (dönüş $ this -> _ data [$ isim] ;)))
Var olmayan bir özelliğe erişmeye çalışırsanız __get() yöntemi çağrılır. Şimdi şunları yapabilirsiniz:
$ görünüm = yeni Görünüm ("home.php"); $ görünüm-> ayarla ("başlık", "Yığın akışı");
Şablonda:
Sanırım sebep sadece "daha az yazarak" olabilir, ancak bazı güzel yan etkileri var:
PHP
file_exists ("test.txt") // Dosya var mı? dosya boyutu ("test.txt"); // Dosya boyutunu öğrenin // Zaman damgasını döndürür: fileatime ("test.txt"); // Dosyaya son erişim tarihi // tarih ("d MY", $ zaman); filemtime ("test.txt"); // Dosya değişiklik tarihi // tarih ("d M Y", $ mtime); filectime ("test.txt"); // Dosyanın oluşturulduğu tarih (Windows) // tarih ("d M Y", $ ctime);Dosyalar: çalışma modları
PHP
source fopen (dize dosya adı, dize modu) // resource - başarı durumunda bir dosya işaretçisi veya hata durumunda FALSE döndürürÇalışma saatleri | Açıklama |
---|---|
r | dosyayı salt okunur aç; |
+ | okuma ve yazma için bir dosya açın; |
w | dosyayı sadece yazmak için açın. Varsa, dosyanın mevcut içeriği yok edilir. Geçerli konum başlangıca ayarlanmıştır; |
+ | dosyayı okumak ve yazmak için açın. Varsa, dosyanın mevcut içeriği yok edilir. Geçerli konum başlangıca ayarlanmıştır; |
a | dosyayı yazmak için açın. Geçerli konum dosyanın sonuna ayarlanır; |
bir + | dosyayı okumak ve yazmak için açın. Geçerli konum dosyanın sonuna ayarlanır; |
B | bir ikili dosyayı işleyin. Bu bayrak, Windows'ta ikili dosyalarla çalışırken gereklidir. |
PHP'de Dosya Açma ve Kapatma
PHP
$ fi = fopen ("test.html", "w +") veya die ("Hata"); // Örnekler $ fi = fopen ("http://www.you/test.html", "r"); $ fi = fopen ("http://ftp.you/test.html", "r"); // fclose ($ fi) kapatPHP'de dosya okuma
PHP
// fread dosyasını oku (int fi, int uzunluk) $ str = fread ($ fi, 5); // İlk 5 karakteri oku echo $str; // imleç hareket ettiğinden beri $ str = fread ($ fi, 12); // Sonraki 12 karakteri oku echo $str; fgets (int fi [, int uzunluk]) // Dosyadan bir satır oku fgetss (int fi, int uzunluk [, izin verilebilir dize]) // Dosyadan bir satır oku ve HTML etiketlerini at // dize izin verilebilir - etiketler bırakılmalıdır fgetc (int fi) // Dosyadan Bir Karakter OkurBaşlangıçta, varsa mevcut verilerin üzerine yazılarak dosyanın başına Yazma işlemi gerçekleşir. Bu nedenle, dosyanın sonuna bir şey yazmanız gerekiyorsa, ilgili dosyayı ayarlamanız gerekir. okuma moduörneğin bir +.
Avatarların psikolojideki değeri
Avatarların psikolojideki değeri
MS Word'de bir harf nasıl vurgulanır
Bir kişinin avatarı ne anlama gelir?
Kendi Twitter Anınızı Nasıl Yaratabilirsiniz?