Dosya - Bir dosyanın içeriğini okur ve onu bir diziye yerleştirir. PHP MVC uygulamasında denetleyiciden Görünüm'e veri geçirme Kurgusal görünüm php dosyası

  • 03.11.2019
Birçoğu, tek bir görevle çalışacak bir proje yazmaya başlar, bunun çok kullanıcılı bir yönetim sistemine, diyelim ki, içerik veya Tanrı korusun üretime dönüşebileceğini ima etmez. Ve her şey havalı 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. Düzen, istekler ve koltuk değnekleriyle karışık kod, 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 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".
Ve birçoğu, büyük 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ı) modern araçların incelenmesini ve uygulanmasını koydu. Arka brülörde.

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:

  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 isteği alır ve istenen denetleyiciyi ve eylemi belirler. Kalıp sayfa olması durumunda, varsayılan eylem ( dizin).
  3. 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.
  4. Bundan sonra eylem, modelden elde edilen verilerle bir görünüm oluşturur ve sonucu kullanıcıya gösterir.
modeli- uygulamanın iş mantığını içerir ve getirme (bunlar ORM yöntemleri olabilir), işleme (örneğin doğrulama kuralları) ve genellikle onu çok kalın yapan belirli verileri sağlama yöntemlerini içerir, bu oldukça normaldir.
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:

  1. www.example.com/article.php?id=3
  2. www.example.com/user.php?id=4
Burada, her komut dosyası belirli bir komutu yürütmekten sorumludur.

İkinci seçenek:

  1. www.example.com/index.php?makale=3
  2. www.example.com/index.php?user=4
Ve burada tüm aramalar tek bir senaryoda gerçekleşir. index.php.

Ç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:

  1. Model_Portfolio sınıfını içeren modeller klasöründeki model_portfolio.php dosyasını içerecektir;
  2. Controller_Portfolio sınıfını içeren controllers klasöründeki controller_portfolio.php dosyasını içerecektir;
  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 adresiyle iletişim kurmaya çalışırsa, örneğin:
ö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:

  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, sayfa içeriği öğelerini içeren bir dizidir. Genellikle modelde doldurulur.
Dahil etme işlevi, görünümün içine yerleştirileceği genel ş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 ü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:
  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ündeki modeli veya modelleri kullanabilir.


Ö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.
    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

    Aşağıdaki tablodaki tüm projeler hayal ürünüdür, bu yüzden verilen linkleri takip etmeye bile çalışmayın. " ; }


    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:

    • 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.
    Kimlik doğrulama ve yetkilendirme farklı bir konudur, bu nedenle burada ele alınmaz, ancak başlamak için bir şey olması için yalnızca yukarıda belirtilen bağlantı sağlanır.

    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.

    Kalıpların, mvc, kayıt defteri. İstekler için, yönlendirme için küçük bir soyutlama katmanı yazdım - isteği ayrıştırmak için kendi işlevim.
    Web uygulamasının yapısı şöyle olacak

    Uygulama klasörü

    index.php giriş dosyası, bootstrap.php dosyasını içerir. Bu da çekirdeği, yapılandırma dosyasını, bazı kitaplıkları birbirine bağlar ve yönlendiriciyi başlatır.

    Çekirdek \ Rotayı Kullan; require_once "lib / kayıt.php"; require_once "config.php"; require_once "lib / veri tabanı.php"; require_once "çekirdek / model.php"; require_once "çekirdek / görünüm.php"; require_once "çekirdek / controller.php"; require_once "çekirdek / route.php"; $ yönlendirici = yeni Rota (); $ yönlendirici-> başlat (); // yönlendiriciyi başlat

    Kayıt defteri basittir:

    Ad Alanı Lib'i; sınıf Lib_Registry (statik özel $ veri = dizi (); statik genel işlev seti ($ anahtarı, $ değer) (self :: $ veri [$ anahtar] = $ değer;) statik genel işlev get ($ anahtarı) (dönüş isset ( self :: $ data [$ key])? self :: $ data [$ key]: null;) statik genel fonksiyon kaldırma ($ tuşu) (if (isset (self :: $ data [$ anahtar])) (ayarlanmadı (self :: $ veri [$ anahtar]);)))

    İşte global değerleri depolamak için alıcılar ve ayarlayıcılar.

    Lib \ Lib_Registry'yi kullanın; define ("PATH_SITE", $ _SERVER ["DOCUMENT_ROOT"]); define ("HOST", "localhost"); tanımla ("KULLANICI", "kök"); define ("ŞİFRE", "parolam"); define ("NAME_BD", "makaleler"); tanımla ("DS", DIRECTORY_SEPARATOR); $ mysqli = new mysqli (HOST, USER, PASSWORD, NAME_BD) or die ("Veritabanına bağlanılamıyor". $ mysqli-> connect_errno ()); Lib_Registry :: ayarla ("mysqli", $ mysqli); $ mysqli-> sorgu ("SET adları" utf8 ""); // veritabanı, veritabanındaki veri kodlamasını ayarla

    İsteği görüntüle http://domen.ru/articles/index Controller - Action'a dönüştürüldü. Denetleyicinin ve eylemin adı Zend çerçeve stilinde belirtilir, deve durumu - Denetleyici_Adı, işlev eylem_adı (). Denetleyicinin, modelin, sıralamaların dosyası, denetleyicinin adıyla küçük harflerle Denetleyici_ veya Model_ öneki olmadan eşleşmelidir.

    Model sınıfı aynı şekilde ayarlanır - Model_Name, görünüm dosyasını zaten bulduk - eylem adıyla veya açıkça oluşturma (ad) yönteminde

    Gelecekte bir yönetici paneli oluşturacağımız için, istemci ve yönetici klasörlerini oluşturacağız. Bu arada, yönlendiricimiz alt klasörleri, yani. denetleyicilerde (örneğin /about/contacts/contacts.php) alt klasörler oluşturmak ve yolu boyunca buna başvurmak mümkün olacaktır / about / contact /
    Böylece yönlendiriciyi başlattık

    / ** * * / public function start () (// AJAX request if ($ this-> getIsAjaxRequest ()) () session_start (); $ this-> sevk ();) / ** * * / public function sevk() (// gönderici, denetleyicinin adı, eylem ve argümanlarla eşleşen bir dosya alır $ this-> getDirections ($ file, $ controller, $ action, $ args); / * ****** ****** * Controller dahil - Model * / if (is_readable ($ file) == false) (die ("File $ file 404 Not Found");) // controller dahil ($ file); $ model = str_replace ("controller" , "model", $ file); // Model ek if (is_readable ($ model)) (// dahil ($ model) modelini dahil et);) / * ****** class ** * / $ controller = ucfirst ($ controller); $ class = ucfirst ($ this-> ad alanı). "\ Controller_". $ controller; // bir örnek oluştur $ controller = yeni $ class ($ this-> controller_path_folder); if (is_callable (array ( $ controller, $ action)) == false) (die ("Action $ action 404 Not Found");) // action $ controller -> $ action ($ args); )

    Dağıtıcı getDirections() yöntemini çağırır, yani. istek yönergeleri alın. Varsayılan olarak, varsayılan denetleyici makalelerdir, eylem dizindir.

    / ** * @param $ file * @param $ controller * @param $ action * @param $ args * / private function getDirections (& $ file, & $ controller, & $ action, & $ args) ($ route = ( boş ($ _ SERVER ["REQUEST_URI"]))? "": $ _SERVER ["REQUEST_URI"]; unset ($ _ SERVER ["REQUEST_URI"]); $ route = trim ($ route, "/ \\") ; $ controller_path = $ this-> path; if (boş ($ route)) (/ * ******************* Varsayılan yönler ******** * / $ controller = "makaleler"; $ action = "action_index"; $ controller_path = $ this-> controller_path_folder = "application / controllers / $ this-> namespace /"; $ file = $ controller_path. $ controller. ". php "; ) else ($ parçalar = patlat ("/", $ rota); / * ************** ad alanı ********** * / if ($ parçalar = = "yönetici") ($ this-> ad alanı = "yönetici"; array_shift ($ kısım);) / * ******************** klasörler ve alt klasörler *** ** ** * / $ fullpath = $ this-> controller_path_folder = $ controller_path. $ this-> namespace; foreach ($ part as $ part) ($ fullpath. = DS. $ part; if (is_dir ($ fullpath)) (array_shift ($ par ts); devam et; ) if (is_file ($ fullpath. ".php")) (array_shift ($ part); $ file = "$ fullpath.php"; break;)) / * ************* ** Controller, Action, Params ******** * / if (! Isset ($ part)) $ part = "makaleler"; $ kontrolör = $ kısım; if (! $ dosya) $ dosya = $ fullpath. "/ $ part.php"; $ action = array_shift ($ parçalar); if (! $ action) $ action = "action_index"; başka $ eylem = "eylem_ $ eylem"; $ argümanlar = $ parçalar; ))

    Bir sonraki derste, temel bir denetleyici, modeller ve görünümler oluşturmayı ve sorgular yazmayı ele alacağız.

    1. ders dosyaları burada

    https://github.com/vaajnur/create_php_application
    Ana dal 1. ders olacak, daha sonra her ders için aynı isimli dal ders1, ders2, 3 ..

    Birçoğu, tek bir görevle çalışacak bir proje yazmaya başlar, bunun çok kullanıcılı bir yönetim sistemine, diyelim ki, içerik veya Tanrı korusun üretime dönüşebileceğini ima etmez. Ve her şey havalı 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. Düzen, istekler ve koltuk değnekleriyle karışık kod, 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 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".
    Ve birçoğu, büyük 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ı) modern araçların incelenmesini ve uygulanmasını koydu. Arka brülörde.

    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 temeli olan MVC modelinin uygulanması hakkında bir fikir edinebilir ve daha fazla düşünmek için "yiyecek" elde edebilirsiniz. nasıl yapılır." 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:

    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 isteği alır ve istenen denetleyiciyi ve eylemi belirler. Kalıp sayfa olması durumunda, varsayılan eylem ( dizin).
    3. 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.
    4. Bundan sonra eylem, modelden elde edilen verilerle bir görünüm oluşturur ve sonucu kullanıcıya gösterir.
    modeli- uygulamanın iş mantığını içerir ve getirme (bunlar ORM yöntemleri olabilir), işleme (örneğin doğrulama kuralları) ve genellikle onu çok kalın yapan belirli verileri sağlama yöntemlerini içerir, bu oldukça normaldir.
    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.

    Bu durumda yaklaşık işleme kodu:
    switch ($ _ GET ["action"]) (case "about": require_once ("about.php"); // Hakkımızda sayfa sonu; case "contacts": request_once ("contacts.php"); // sayfa "Kişiler" sonu; durum "geri bildirim": require_once ("feedback.php"); // sayfa "Geri bildirim" sonu; varsayılan: require_once ("sayfa404.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

    class Route (statik fonksiyon start () (// controller ve varsayılan eylem $ controller_name = "Main"; $ action_name = "index"; $ route = patlat ("/", $ _SERVER ["REQUEST_URI"]); // get denetleyicinin adı if (! boş ($ rotalar)) ($ controller_name = $ rotalar;) // eylemin adını al if (! boş ($ rotalar)) ($ eylem_adı = $ rotalar;) // ekle $ model_name = " Model _ ". $ Controller_name; $ controller_name =" Controller _ ". $ Controller_name; $ action_name =" action _ ". $ Action_name; // dosyayı model sınıfıyla bağlayın (olmayabilir bir model dosyası) $ model_file = strtolower ($ model_name). ".php"; $ model_path = "application / modeller /".$ model_file; if (file_exists ($ model_path)) ("uygulama / modeller /".$ model_file içerir) ;) // dosyayı, $ controller_file = strtolower ($ controller_name) controller sınıfıyla bağla. ". php"; $ controller_path = "application / controllers /".$ controller_file; if (file_exists ($ controller_path)) (include" application / kontrolörler /".$ controller_f ile; ) else (/ * buraya bir istisna atmak doğru olur, ancak basitlik için hemen 404 sayfaya yönlendirelim * / Route :: ErrorPage404 ();) // bir controller oluştur $ controller = new $ controller_name; $eylem = $eylem_adi; if (method_exists ($ controller, $ action)) (// controller eylemini çağırın $ controller -> $ action ();) else (// burada ayrıca bir istisna atmak daha mantıklı olacaktır Route :: ErrorPage404 (); )) function ErrorPage404 ( ) ($ host = "http://". $ _ SERVER ["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:

    1. Model_Portfolio sınıfını içeren modeller klasöründeki model_portfolio.php dosyasını içerecektir;
    2. Controller_Portfolio sınıfını içeren controllers klasöründeki controller_portfolio.php dosyasını içerecektir;
    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 adresiyle iletişim kurmaya çalışırsa, örneğin:
    ö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 Model (genel işlev 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
    class Görünüm (// public $ template_view; // burada varsayılan genel görünümü belirtebilirsiniz. function oluşturma ($ content_view, $ template_view, $ data = null) (/ * if (is_array ($ data)) (// dönüşümü dizi öğelerini değişkenlere ayıklayın ($ data);) * / "application / view /" 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, sayfa içeriği öğelerini içeren bir dizidir. Genellikle modelde doldurulur.
    Dahil etme işlevi, görünümün içine yerleştirileceği genel ş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 ü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 () ($ this-> görünüm = yeni Görünüm ();) işlev action_index () ())
    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:
    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ündeki modeli veya modelleri kullanabilir.


    Önceki şekilde, dosya ayrı ayrı vurgulanmıştır. template_view.php tüm sayfalarda ortak olan işaretlemeyi 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şturuyoruz ve HTML işaretlemesinin yapısını değiştirerek ve CSS ve JavaScript dosyalarını ekleyerek bunu sitemize entegre ediyoruz:

    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 (action_index() işlevi ($ 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:

    Hoş geldin!

    OLOLOSHA TEAM, beş ila altı yüzyıl önce Ekvator Afrika'sının 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 geliştirme uzmanlarından oluşan bir ekiptir.


    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:

    Aşağıdaki modelden elde edilen verileri gösteren bir görünüm kullanan bir örnek ele alacağız.

    2.3.2. Portföy Sayfası Oluşturun

    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 taklit edeceğiz ve hemen bir dizi sonuç döndüreceğiz.
    model dosyası model_portfolio.php modeller klasörüne atın. İşte içeriği:
    class Model_Portfolio Model'i genişletir (genel fonksiyon get_data () (dönüş dizisi ("Yıl" => "2012", "Site" => "http://DunkelBeer.ru", "Açıklama" => "Dunkel'den koyu bira Alman üretici Löwenbraü, Rusya'da "SAN InBev" bira şirketi tarafından üretildi. "), 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."), // 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-> görünüm-> üret ("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ılprojeAçıklama
    ". $ satır [" Yıl "]."". $ satır [" Site "]."". $ satır [" Açıklama "]."
    Aşağıdaki tablodaki tüm projeler hayal ürünüdür, bu yüzden verilen linkleri takip etmeye bile çalışmayın. "; } ?>
    YılprojeAçı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:

    • 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.
    Kimlik doğrulama ve yetkilendirme farklı bir konudur, bu nedenle burada ele alınmaz, ancak başlamak için bir şey olması için yalnızca yukarıda belirtilen bağlantı sağlanır.

    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:

    <?php echo $this->Başlık; ?>

    Sanırım sebep sadece "daha az yazarak" olabilir, ancak bazı güzel yan etkileri var:

    • Ş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.

    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) kapat

    PHP'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 Okur

    Baş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 +.

    PHP dosyalarında imleç manipülasyonu

    PHP

    int fseek (int fi, int ofset [, int nereden]) // İmleci ayarlama // int fi - dosyaya bir işaretçi // offset - taşınacak karakter sayısı. // nereden: // SEEK_SET - hareket dosyanın başından başlar; // SEEK_CUR - hareket mevcut konumdan başlar; // SEEK_END - hareket dosyanın sonundan başlar. fseek ($ fi, -10, SEEK_END); // Son 10 karakteri oku $ s = fread ($ fi, 10); $ konum = ftel ($ fi); // Geçerli konumu geri sarmayı bulun ($ f) // imleç bool feof'u sıfırlayın ($ f) // dosyanın sonu

    Dosyalarla (veriler) doğrudan PHP'de çalışma

    PHP

    dizi dosyası (dize dosya adı) // Dosyanın içeriğini dizi olarak al // Verilerle doğrudan çalışmak için başka bir seçenek file_get_contents (dize dosya adı) // Okuma (tüm dosyayı bir satırda alırız) // Dosyaya yazma (başlangıçta üzerine yazılır) file_put_contents (dize dosya adı, karışık veri [, int bayrağı]); // FILE_APPEND // Dosyanın sonuna yazılıyor: file_put_contents ("test.txt", "data", FILE_APPEND); // Bir dizi yazarsak, $ dizi = dizi ("I", "canlı"); file_put_contents ("test.txt", $ dizisi); // sonra "Ilive" alırız

    php dosya yönetimi

    PHP

    kopyala (dize kaynağı, dize hedefi); // Dosya adını kopyalayın (str eskiadı, str yeniadı); // Bağlantıyı kaldır dosyasını yeniden adlandırın (dize dosya adı); // Dosyayı sil

    PHP sunucusuna dosya yükleme

    // PHP.ini ayarları file_uploads (açık | kapalı) // etkinleştir Dosya yüklemeyi devre dışı bırak upload_tmp_dir // Yüklenen dosyalar için geçici klasör. varsayılan geçici klasör upload_max_filesize (varsayılan = 2 Mb) // max. yüklenen dosyanın boyutu post_max_size // gönderilen formun toplam boyutu (load_max_filesize'den büyük olmalıdır) // Basit yükleme

    HTML

    Sunucudaki dosyalarla çalışıyoruz

    PHP

    // Veri al $ tmp = $ _FILES ["userfile"] ["tmp_name"]; $ isim = $ _FILES ["kullanıcı dosyası"] ["isim"]; // move_uploaded_file ($ tmp, isim) dosyasını taşıyın; move_uploaded_file ($ tmp, "yükleme /". isim); // dosyayı yükleme klasörüne yönlendir // geçerli dosyaya göre // $ _FILES dizisinde neler var $ _FILES ["userfile"] ["name"] // dosya adı, örneğin, test.html $ _FILES [ "userfile"] [" tmp_name "] // geçici dosya adı (yol) $ _FILES [" kullanıcı dosyası "] [" boyut "] // dosya boyutu $ _FILES [" kullanıcı dosyası "] [" tür "] // dosya türü $ _FILES [" kullanıcı dosyası "] ["hata"] // 0 - hata yok, sayı - evet