Sıfırdan bir mvc motoru oluşturun. MVC: nedir ve kullanıcı arayüzü ile ilişkisi. Styling Thanks Görüntüle

      Birçoğu, çok kullanıcılı bir yönetim sistemine dönüşebileceğini ima etmeden, tek bir görevle çalışmak için bir proje yazmaya başlar, diyelim ki içerik veya Tanrı yasaklı üretim. 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. Kod, bazen okunamıyor bile düzen, sorgular ve koltuk değneği ile karıştırılır. Acil bir sorun var: Yeni özellikler eklerken, “orada ne yazıldığını?” Hatırlayarak çok uzun bir süre bu kodla uğraşmak zorundasınız. ve kendinizi geçmişte lanetleyin.

Hatta tasarım desenlerini duymuş ve hatta bu güzel kitaplarda bile yapraklanmış olabilirsiniz:

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides “Objektif tasarım teknikleri. Tasarım Desenleri ”;
  • M. Fowler "Kurumsal yazılım uygulamalarının mimarisi."
  Ve büyük kılavuzlardan ve dokümantasyonlardan korkmayan birçok kişi, modern çerçevelerin herhangi birini incelemeye çalıştı ve anlama güçlüğü ile karşı karşıya kaldı (ustaca birbirine bağlı birçok mimari kavramın varlığı nedeniyle) modern araçların çalışmasını ve uygulanmasını "uzun bir kutuda" erteledi.

Bu makale öncelikle yeni başlayanlar için faydalı olacaktır. Her halükarda, umarım birkaç saat içinde, tüm modern web çerçevelerinin altında yatan MVC modelinin uygulanması hakkında bir fikir edinebilir ve bunun nasıl yapılacağı hakkında daha fazla yansıma için “yiyecek” alabilirsiniz. Makalenin sonunda, (MVC dışında) hangi web çerçevelerinin oluştuğunu ve nasıl çalıştığını anlamanıza yardımcı olacak yararlı bağlantılar bir seçim var.

Sert çekirdekli PHP programcılarının bu makalede kendileri için yeni bir şey bulma olasılığı düşüktür, ancak ana metin hakkındaki yorumları ve yorumları çok yardımcı olacaktır! çünkü teori olmadan uygulama imkansızdır ve uygulama olmadan teori işe yaramaz, önce küçük bir teori olacak, sonra uygulamaya geçeceğiz. MVC kavramını zaten biliyorsanız, teori bölümünü atlayabilir ve doğrudan uygulamaya gidebilirsiniz.

1. Teori

MVC modeli, iş mantığını kullanıcı arayüzünden ayırmak olan bir uygulama yapısı oluşturmanın basit bir yolunu açıklar. Sonuç olarak, uygulamanın ölçeklendirilmesi, test edilmesi, bakımının yapılması ve elbette uygulanması daha kolaydır.

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

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

Bir MVC uygulamasının tipik bir dizisi aşağıdaki gibi tarif edilebilir:

  1. Bir kullanıcı bir web kaynağı girdiğinde, başlatma komut dosyası uygulamanın bir örneğini oluşturur ve yürütme için başlatır.
      Bu, sitenin ana sayfası diyelim bir görünüm görüntüler.
  2. Uygulama kullanıcıdan bir istek alır ve istenen denetleyici ve eylemi belirler. Ana sayfa durumunda, varsayılan eylem gerçekleştirilir ( indeks).
  3. Uygulama denetleyicinin bir örneğini oluşturur ve eylem yöntemini başlatır,
      örneğin, veritabanından bilgi okuyan model çağrıları içerir.
  4. Bundan sonra, eylem modelden elde edilen verilerle bir görünüm oluşturur ve sonucu kullanıcıya görüntüler.
model   - uygulamanın iş mantığını içerir ve seçim yöntemlerini (bunlar ORM yöntemleri olabilir), işlemeyi (örneğin, doğrulama kuralları) ve genellikle çok kalın hale getiren, oldukça normal olan belirli verilerin sağlanmasını içerir.
  Model kullanıcı ile doğrudan etkileşime girmemelidir. Kullanıcı isteğiyle ilgili tüm değişkenler kontrolörde işlenmelidir.
  Model, kullanıcının ihtiyaçlarına bağlı olarak değişebilen HTML veya başka bir ekran kodu oluşturmamalıdır. Bu kod görünümlerde işlenmelidir.
  Aynı model, örneğin: kullanıcı kimlik doğrulama modeli, hem kullanıcı hem de uygulamanın yönetim bölümünde kullanılabilir. Bu durumda, genel kodu ayrı bir sınıfa alabilir ve varislerde uygulamaya özgü yöntemleri tanımlayarak koddan devralınabilirsiniz.

görünüm   - denetleyiciden ve modelden alınan verilerin harici görüntüsünü belirtmek 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şilmemelidir. Bu model 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.
Çıktıya hazır veri elde etmek için kontrolörün veya modellerin özelliklerine ve yöntemlerine doğrudan erişebilir.
  Görünümler genellikle tüm sayfalar (örneğin, üstbilgi ve altbilgi) için ortak işaretleme içeren ve şablonun modelden veri çıktısını görüntülemek veya veri giriş formlarını görüntülemek için kullanılan ortak bir şablona bölünür.

kontrolör   - modelleri, görünümleri ve diğer bileşenleri çalışan bir uygulamaya bağlayan bir bağlantı bağlantısı. Denetleyici, kullanıcı isteklerini işlemekten sorumludur. Denetleyici SQL sorguları içermemelidir. En iyi modellerde tutulurlar. Denetleyici HTML veya başka bir biçimlendirme içermemelidir. Türlere konulmalıdır.
  İyi tasarlanmış bir MVC uygulamasında, kontrolörler genellikle çok incedir ve sadece birkaç düzine kod satırı içerir. Joomla CMS'deki Aptal Yağ Kontrolörleri (SFC) hakkında söyleyemezsiniz. Kontrolörün mantığı oldukça tipiktir ve çoğu temel sınıflarda gerçekleştirilir.
  Aksine modeller çok kalındır ve veri işleme ile ilgili kodun çoğunu içerir, çünkü İçlerinde bulunan veri yapısı ve iş mantığı genellikle belirli bir uygulama için oldukça belirgindir.

1.1. Ön Denetleyici ve Sayfa Denetleyici

  Çoğu durumda, kullanıcının web uygulamasıyla etkileşimi bağlantıları tıklatarak gerçekleştirilir. Şimdi tarayıcının adres çubuğuna bakın - bu metni bu bağlantıdan aldınız. Örneğin, bu sayfanın sağındaki diğer bağlantılar size farklı içerikler sunar. Böylece, bağlantı web uygulamasına özel bir komutu temsil eder.

Umarım farklı sitelerin adres çubuğunu oluşturmak için tamamen farklı biçimlere sahip olabileceğini fark etmişsinizdir. Her biçim bir web uygulamasının mimarisini görüntüleyebilir. Bu her zaman böyle olmasa da, çoğu durumda bu açık bir gerçektir.

Bazı metin ve kullanıcı profilini görüntüleyen adres çubuğu için iki seçenek düşünün.

Bu durumda yaklaşık işlem kodu:
  switch ($ _ GET ["action"]) (case "about": requir_once ("about.php"); // sayfa "Hakkımızda" sonu; case "contacts": requir_once ("contacts.php"); // iletişim sayfası sonu; durum "feedback": requir_once ("feedback.php"); // feedback page break; varsayılan: requir_once ("page404.php"); // sayfa "404" break;)
  Sanırım neredeyse herkes bunu daha önce yaptı.

URL yönlendirme motorunu kullanarak, uygulamayı aynı bilgileri görüntülemek için aşağıdaki istekleri alacak şekilde yapılandırabilirsiniz:
http://www.example.com/contacts/feedback

Burada, kişiler bir denetleyicidir ve geri bildirim, bir geri bildirim formu vb. Gösteren bir kişiler denetleyici yöntemidir. Pratik bölümde bu konuya döneceğiz.

Ayrıca, birçok web çerçevesinin yönlendiricilerinin rastgele URL yolları (URL'nin her bölümünün ne anlama geldiğini belirtmenize) ve bunları işlemeye ilişkin kurallar oluşturmanıza izin verdiğini bilmekte fayda vardır.
  Artık uygulamaya devam etmek için yeterli teorik bilgiye sahibiz.

2. Uygulama

  İlk olarak, aşağıdaki dosya ve klasör yapısını oluşturun:


  İleriye baktığımda, temel Model, Görünüm ve Denetleyici sınıflarının çekirdek klasörde saklanacağını söyleyeceğim.
  Onların torunları yönetmenlerin kontrolörlerinde, modellerinde ve görünümlerinde saklanacak. dosya index.php   Bu uygulamada devam eden nokta. dosya bootstrap.php   uygulamanın indirilmesini, gerekli tüm modüllerin bağlanmasını vb. başlatır.

Sıralı olarak gideceğiz; index.php dosyasını açın ve aşağıdaki kodla doldurun:
  ini_set ("display_errors", 1); requir_once "uygulama / bootstrap.php";
  Burada sorular ortaya çıkmamalıdır.

Sonra, doğrudan yarıya gidelim bootstrap.php:
  requir_once "çekirdek / model.php"; gerektirir_once "çekirdek / view.php"; gerektirir_once "core / controller.php"; gerektirir_once "çekirdek / route.php"; Route :: start (); // yönlendiriciyi başlat
  İlk üç satır henüz mevcut olmayan çekirdek dosyalarını içerecektir. Son satırlar, yönlendiricinin sınıfına sahip dosyayı içerir ve statik başlatma yöntemini çağırarak dosyayı başlatır.

2.1. URL Yönlendirici Uygulaması

  Şimdilik, MVC modelinin uygulanmasından sapıp gidelim. Yapmamız gereken ilk adım, aşağıdaki kodu .htaccess:
  RewriteCond% (REQUEST_FILENAME)! -F RewriteCond% (REQUEST_FILENAME) Üzerinde! - D RewriteRule. * Index.php [L]
  Bu kod, tüm sayfaların işlenmesini şuraya yönlendirir: index.php, ihtiyacımız olan şey bu. Ön Kontrol'den bahsettiğimiz ilk bölümde hatırlıyor musunuz?!

Yönlendirmeyi ayrı bir dosyaya koyacağız route.php   çekirdek dizine. Bu dosyada, denetleyicilerin yöntemlerini çalıştıracak ve sonuçta sayfaların görünümünü oluşturacak olan Route sınıfını açıklıyoruz.

Route.php dosyasının içeriği

class Route (statik işlev start () (// denetleyici ve varsayılan eylem $ controller_name \u003d "Main"; $ action_name \u003d "index"; $ route \u003d explode ("/", $ _SERVER ["REQUEST_URI"]); // (! empty ($ route)) ($ controller_name \u003d $ route;) // ise, denetleyicinin adını alın (! empty ($ route)) ($ action_name \u003d $ route;) // $ model_name \u003d "öneklerini ekleyin Model _ ". $ Controller_name; $ controller_name \u003d" Controller _ ". $ Controller_name; $ action_name \u003d" action _ ". $ Action_name; // dosyayı model sınıfıyla bağlayın (model dosyası olmayabilir) $ model_file \u003d strtolower ($ model_name). ".php"; $ model_path \u003d "uygulama / modeller /".$ model_file; if (file_exists ($ model_path)) (" application / models /".$ model_file;) // dosyayı denetleyici sınıfına dahil et $ controller_file \u003d strtolower ($ kontrol ler_name). ". php"; $ controller_path \u003d "uygulama / denetleyiciler /".$ denetleyici_dosyası; if (dosya_exists ($ denetleyici_yol)) (" uygulama / denetleyiciler /".$ denetleyici_dosyası; ) else (/ * buraya bir istisna atmak doğru olur, ancak basitlik için hemen sayfa 404'e yönlendiririz * / Route :: ErrorPage404 ();) // bir denetleyici oluştur $ controller \u003d new $ controller_name; $ action \u003d $ action_name; if (method_exists ($ controller, $ action)) (// denetleyici eylemini çağırın $ controller -\u003e $ action ();) else (// bir istisna atmak da mantıklı olur Route :: ErrorPage404 ();)) işlevi ErrorPage404 ( ) ($ host \u003d "http: //". $ _ SERVER ["HTTP_HOST"]. "/"; başlık ("HTTP / 1.1 404 Bulunamadı"); başlık ("Durum: 404 Bulunamadı"); başlık (" Konum: ". $ Sunucu." 404 ");))


  Sınıfın (hacimli koda rağmen) çok basitleştirilmiş bir mantık uyguladığını ve muhtemelen güvenlik sorunları olduğunu not ediyorum. Bu kasten yapıldı, çünkü tam teşekküllü bir yönlendirme sınıfı yazmak en azından ayrı bir makaleyi hak eder. Ana noktaları düşünün ...

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

Fonksiyonu kullanma patlamak   adres bileşenlere ayrılmıştır. Sonuç olarak, denetleyicinin adını alırız, verilen örnek için bu denetleyicidir kontaklar   ve davamızın adı, bizim durumumuzda - geribesleme.

Daha sonra, model dosyası bağlanır (model olmayabilir) ve varsa denetleyici dosyası ve son olarak denetleyicinin bir örneği oluşturulur ve denetleyici sınıfında tanımlanmışsa eylem yeniden çağrılır.

Böylece, örneğin adrese giderken:
example.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ündeki model_portfolio.php dosyasını ekleyin;
  2. controller_portfolio.php dosyasını Controller_Portfolio sınıfını içeren controllers klasöründen bağlayın;
  3. controller_Portfolio sınıfının bir örneğini oluşturur ve varsayılan eylem olan action_index'i çağırır.
  Kullanıcı var olmayan bir denetleyicinin adresiyle iletişim kurmaya çalışırsa, örneğin:
example.com/ufo
  "404" sayfasına yönlendirilir:
example.com/404
  Kullanıcı denetleyicide açıklanmayan bir eyleme erişirse de aynı şey olur.

2.2. MVC uygulamasına geri dön

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


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

Dosya içeriği model.php
  sınıf Modeli (genel işlev get_data () ())
  Model sınıfı, alt sınıflarda çakışacak tek boş veri seçim yöntemini içerir. Torun sınıfları yarattığımızda her şey daha net hale gelecek.

Dosya içeriği view.php
  sınıf Görünümü (// public $ template_view; // burada genel varsayılan görünümü belirleyebilirsiniz. function create ($ content_view, $ template_view, $ data \u003d null) (/ * if (is_array ($ data)) (// dizi öğelerini dönüştür değişkenlere ayıklayın ($ data);) * / include "application / views /".$ template_view;))
  Yöntemin ne olduğunu tahmin etmek zor değil üretmek   Bir görünüm oluşturmak için tasarlanmıştır. Aşağıdaki parametreler iletilir:

  1. $ content_file - sayfa içeriğini görüntüleme görünümleri;
  2. $ template_file - tüm sayfalar için ortak bir şablon;
  3. $ data, sayfa içerik öğelerini içeren bir dizidir. Genellikle bir modelde bulunur.
  İçerme işlevi, görünümün katıştırılacağı 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 üstbilgi, menü, kenar çubuğu ve altbilgiyi 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
  class Controller (public $ model; public $ view; işlev __construct () ($ this-\u003e view \u003d yeni Görünüm ();) işlev action_index () ())
  yöntem action_index   - bu varsayılan eylemdir; alt sınıfları uygularken geçersiz kılar.

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

Şimdi eğlence başlıyor! Kartvizit sitemiz aşağıdaki sayfalardan oluşacaktır:
  1. ana
  2. hizmetler
  3. portföy
  4. İletişim bilgileri
  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ı olarak seçilir template_view.php   - Bu, tüm sayfalar için ortak işaretleme içeren bir şablondur. En basit durumda, şöyle görünebilir:
ana
  Sitenin prezentabl görünmesini sağlamak için, HTML işaretlemesinin yapısını değiştirip CSS ve JavaScript dosyalarını bağlayarak CSS şablonunu oluşturur ve web sitemize entegre ederiz:

  Makalenin sonunda, “Sonuç” bölümünde, GitHub deposuna basit bir şablonu entegre etmek için adımların atıldığı bir proje ile bir bağlantı bulunmaktadır.

2.3.1. Bir ana sayfa oluşturun

  Kontrolör ile başlayalım controller_main.php, kodu burada:
  class Controller_Main Denetleyiciyi genişletir (işlev action_index () ($ this-\u003e view-\u003e create ("main_view.php", "template_view.php");))
  Yöntemde üretmek   View sınıfının örneği, genel şablon ve görünümdeki dosyaların adlarını sayfanın içeriğiyle geçirir.
  İndeks eylemine ek olarak, kontrolör elbette başka eylemler de içerebilir.

Dosyayı daha önce genel bir görünümle inceledik. Bir içerik dosyasını düşünün main_view.php:

Hoş geldiniz!

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


  Herhangi bir PHP çağrısı olmadan basit biçimlendirme içerir.
  Ana sayfayı görüntülemek için aşağıdaki adreslerden birini kullanabilirsiniz:

  Modelden elde edilen verileri gösteren bir görünüm kullanan bir örnek daha sonra tartışılacaktır.

2.3.2. Portföy Sayfasını Oluşturun

  Bizim durumumuzda, Portföy sayfası modeli kullanan tek sayfadır.
  Bir model tipik olarak veri örnekleme yöntemlerini içerir, örneğin:
  1. pgsql veya mysql yerel kütüphane yöntemleri
  2. veri soyutlamayı uygulayan kütüphane yöntemleri. Örneğin, PEAR MDB2 kütüphane yöntemleri;
  3. oRM yöntemleri
  4. noSQL ile çalışma yöntemleri;
  5. ve diğerleri
  Basit olması için burada SQL sorguları veya ORM ifadeleri kullanmayacağız. Bunun yerine, gerçek verileri taklit eder ve hemen bir dizi sonuç döndürürüz.
  Model dosyası model_portfolio.php   modeller klasörüne koyun. İçeriği:
class Model_Portfolio Model'i genişletir (public function get_data () (dönüş dizisi (dizi ("Yıl" \u003d\u003e "2012", "Site" \u003d\u003e "http://DunkelBeer.ru", "Açıklama" \u003d\u003e "Koyu renkli tanıtım sitesi) Alman üretici Löwenbraü'den Dunkel birası CAN InBev bira şirketi tarafından Rusya'da üretildi. "), Dizi (" Yıl "\u003d\u003e" 2012 "," Site "\u003d\u003e" http://ZopoMobile.ru "," Açıklama "\u003d\u003e "Android işletim sistemi ve aksesuarlarına dayanan Çince Zopo telefonlarının Rusça kataloğu."), // todo);))

Model denetleyici sınıfı dosyada bulunur controller_portfolio.php, kodu burada:
  class Controller_Portfolio, Controller'ı genişletir (function __construct () ($ this-\u003e model \u003d new Model_Portfolio (); $ this-\u003e view \u003d new View ();) işlev action_index () ($ data \u003d $ this-\u003e model-\u003e get_data ( ); $ this-\u003e view-\u003e create ("portfolio_view.php", "template_view.php", $ data);))
  Değişkene veri   yöntem tarafından döndürülen dizi yazılır get_dataki daha önce düşündük.
  Bu değişken daha sonra yönteme parametre olarak geçirilir. üretmek, buna da aktarılır: ortak bir şablona sahip dosyanın adı ve sayfanın içeriğiyle birlikte görünümü içeren dosyanın adı.

Sayfanın içeriğini içeren görünüm dosyadadır portfolio_view.php.

portföy

  Aşağıdaki tablodaki tüm projeler hayalidir, bu nedenle sağlanan bağlantıları takip etmeye bile çalışmayın. "; } ?>
yılprojetanım
". $ satır [" Yıl "]."". $ satır [" Site "]."". $ row [" Açıklama "]."


  Burada her şey basit, görünüm modelden elde edilen verileri görüntüler.

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

  Kalan sayfalar da aynı şekilde oluşturulur. Kodları "Sonuç" bölümünde makalenin sonunda sağlanan GitHub'daki depoda bulabilirsiniz.

3. Sonuç

  Ve işte sonuç:

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



  GitHub Bağlantısı: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

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

  • Bir kimlik doğrulama prosedürünün gerçekleştirildiği doldurulduktan ve başarılı olursa kullanıcı yönetici paneline yönlendirildikten sonra, bir oturum açma adı ve parola girme formu ile bir görünümün oluşturulduğu Controller_Login.
  • Contorller_Admin, kullanıcının sitede daha önce yönetici olarak yetkilendirilip yetkilendirilmediğini (varsa yönetici görünümü görüntüleniyorsa) ve oturumu kapatmak için çıkış eylemini kontrol ettiği bir dizin eylemiyle.
  Kimlik doğrulama ve yetkilendirme farklı bir konudur, bu nedenle burada dikkate alınmaz, ancak sadece yukarıda belirtilen bağlantı sağlanır, böylece başlayacak bir şey vardır.

4. Sonuç

MVC şablonu, daha kısa sürede niteliksel olarak daha karmaşık çözümler geliştirmek için oluşturulan birçok çerçevede 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üzeyini artırarak 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çevelerinin kullanılması her zaman tavsiye edilmez. Artık Php, Html, CSS ve JavaScript kodlarını tek bir dosyada karıştırmamak için güzel bir MVC modeli oluşturabiliyoruz.

Bu makale, web uygulamanız için bir temel olarak alabileceğiniz gerçekten doğru bir şeyden çok CMF öğrenmek için bir başlangıç \u200b\u200bnoktasıdır. Belki de size ilham verdi ve zaten MVC'ye dayalı mikro çerçevenizi veya CMS'nizi yazmayı düşünüyorsunuz. Ancak, blackjack ve fahişelerle başka bir bisiklet icat etmeden önce, bir kez daha düşünün, mevcut bir projenin topluluğunu geliştirmeye ve yardım etmeye yönelik çabalarınızı yönlendirmek akıllıca olabilir mi?

Not: Makale, yorumlarda kalan bazı yorumlar dikkate alınarak yeniden yazılmıştır. Eleştiri çok yardımcı oldu. Yanıttan yola çıkarak: yorumlar, PM'deki itirazlar ve bu gönderiyi yazmak için favorilerinize bir gönderi ekleyen kullanıcı sayısı o kadar da kötü değildi. Ne yazık ki, tüm dilekleri hesaba katmak ve zaman eksikliği nedeniyle daha ayrıntılı olarak yazmak mümkün değildir ... ama belki de orijinal sürümü eksi yapan gizemli bireyler bunu yapacaktır. Projelerinizde bol şanslar!

5. Konu için yararlı linklerin seçimi

  Makale genellikle web çerçeveleri konusuna değinir - bu çok kapsamlı bir konudur, çünkü mikro çerçeveler bile ustaca 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 bu ya da başka bir şekilde çerçeve temasıyla ilgili olan küçük bir bağlantı seçimi (bu makaleyi yazarken izlediğim) vermeye karar verdim.

etiketler:

  • php
  • iskelet
  • cmf
  • mVC
  • yer
   Etiket ekle

Herkese merhaba! Kendimizi inşa etmeye devam ediyoruz MVC uygulamasıve bugün sayfa çıktılarıyla uğraşmaya başlayacağız.

Dosya oluştur View.php   klasörde libs.

   sınıf Görünümü (

   echo "Bu bir görünümdür";
}
}
?>

Şimdi ana dosyamızı açın index.php   ve bağlayın.

"Libs / View.php" gerektir;

Sayfayı açtıktan sonra, "Bu bir görünümdür" yazısını görmeliyiz.

Şimdi bir yöntem ekleyerek görünüm sınıfımızı değiştirelim kılmaksonuç ile ilgilenecek.

   sınıf Görünümü (
   kamu işlevi __construct () (
   echo "Bu bir görünümdür";
}

Genel işlev oluşturma ($ name) (
   "views /".$ adı" gerektirir. php ";
}
}
?>

Şimdi klasörler oluşturun indeks   ve hata   klasörde görünümler. Sunumdan onlar sorumlu olacaklar. indeks   sayfaları ve hata sayfaları. Klasörde hata   yeni oluştur index.php   dosya ve aşağıdakileri yazın


  Bu hata sayfası!

Şimdi bir dosya oluştur header.php   klasörün kendisinde görünümler   böyle bir içerikle


  Başlık

Hadi dosyaya gidelim error.phpklasörde bulunan hata   ve kurucuya bir yöntem çağrısı ekleyin kılmak.

   kamu işlevi __construct () (
   // kod
   $ this-\u003e view-\u003e render ("hata / dizin");
}
?>

Şimdi sayfada "Başlık Bu hata sayfası!"

Yöntemi çağırmadan önce kontrol cihazımızı ekleyerek kontrol cihazımızı biraz geliştirelim kılmak   aşağıdaki:

   kamu işlevi __construct () (
   // kod
   $ this-\u003e view-\u003e msg \u003d "Sayfa mevcut değil!";
   $ this-\u003e view-\u003e render ("hata / dizin");
}
?>

Ve şimdi dosyada index.phpyazıtımız yerine hata türünden sorumlu olan "Bu hata sayfasıdır!" mülkte depolananları yazdır msg.




msg; ?\u003e

Şimdi yazıtımızı aldık.

Şimdi bir model oluşturalım help_model.php   klasörde modeller.

   sınıf Help_Model Modeli genişletir (
   kamu işlevi __construct () (
   echo "Model help_model";
}
}
?>

Şimdi denetleyiciyi açın help.php   klasörden kontrolörleri   ve modelimize bir çağrı ekleyin

   sınıf Yardımı Denetleyiciyi (
   // kod

Genel işlev diğer ($ arg \u003d false) (
   // kod

"Modeller / help_model.php" gerektir;
   $ model \u003d yeni Help_Model ();
}
}
?>

   sınıf modeli (
   kamu işlevi __construct () (
   // $ this-\u003e database \u003d yeni Veritabanı ();
}
}
?>

Modelimiz veritabanı ile çalışacak, ancak şimdilik buna yorum yapıyorum, çünkü henüz bir veritabanımız yok.

Temel modelimizi ana dosyamıza bağlayın index.php.

"Libs / Bootstrap.php" gerektir; "libs / Controller.php" gerektirir; "libs / model.php" gerektirir; "libs / View.php" gerektirir;

Öyleyse bugün bunun üzerinde duralım. Sayfada zaten bazı sonuçlar verdik ve gelecekteki makalelerde bunu geliştirmeye devam edeceğiz. İlginiz ve iyi kodlama için teşekkür ederiz!

Tasarım Deseni Model-Görünüm-Denetleyici (MVC)   Verilerin, verilerle etkileşime giren yöntemlerden ayrı olarak sunulmasına yönelik olarak oluşturulmuş bir yazılım mimarisi şablonudur.

MVC şemasının başlangıçta kişisel bilgisayarlar için geliştirilmesine rağmen, görevlerin tam olarak farklılaşması ve kodun yeniden kullanılması olasılığı nedeniyle web geliştiricileri tarafından yaygın olarak kullanılmaktadır. Şema, geliştiricilerin işlevselliği hızlı bir şekilde güncellemesine, eklemesine veya kaldırmasına izin veren modüler sistemlerin geliştirilmesini teşvik eder.

Bu yazıda temel ilkeleri açıklayacağım ve bir inşaat şemasının tanımını ve basit bir MVC PHP örneğini de ele alacağım.

MVC nedir?

Tasarım deseninin adı üç ana bileşeni tarafından belirlenir: Model, Görünüm ve Denetleyici. MVC şablonunun görsel temsili, aşağıdaki grafik:


  Şekilde, tek yönlü bir veri akışının yapısı ve çeşitli bileşenler arasındaki yolu ve bunların etkileşimi gösterilmektedir.

model

Bir modele yapı boyunca kullanılan verilerin kalıcı olarak depolanması denir. Görüntüleme, seçim veya kayıt için verilere erişim sağlamalıdır. Genel yapıda, Model, Görünüm ve Denetleyici bileşenleri arasındaki köprüdür.

Aynı zamanda, “Model” in “Görünüm” veya “Kontrolör” bileşenlerine iletildiğinde verilere ne olduğu hakkında hiçbir bağlantısı veya bilgisi yoktur. “Model” in tek görevi, verilerin kalıcı bir depolamada işlenmesi, MVC'nin diğer bileşenlerine iletilen verilerin araştırılması ve hazırlanmasıdır.

“Model” veri ambarının yanında duran ve soru sormayan, ancak gelen tüm talepleri kabul eden bir “kapı bekçisi” gibi davranmalıdır. Bu genellikle bir MVC sisteminin en karmaşık parçasıdır. “Model” bileşeni tüm yapının zirvesidir, çünkü onsuz “Kontrolör” ve “Görünüm” arasındaki bağlantı mümkün değildir.

Fikir

Görünüm, Modelden istenen verilerin çıktılarının son biçimine ayarlandığı sistemin bir parçasıdır. MVC tabanlı web uygulamalarında “Görünüm”, HTML'nin oluşturulduğu ve görüntülendiği bileşendir.

Görünüm, daha sonra Denetleyiciye iletilen kullanıcı eylemini de yakalar. Bunun tipik bir örneği, Görünüm tarafından oluşturulan düğmedir. Kullanıcı tıklattığında, "Denetleyici" deki eylem başlatılır.

Sunu bileşeniyle ilgili sık rastlanan yanlış kavramlar vardır. Örneğin, birçoğu yanlışlıkla "Görünüm" ün "Model" ile bağlantısı olmadığına ve görüntülenen tüm verilerin "Kontrolör" den aktarıldığına inanmaktadır. Aslında, böyle bir veri akışı şeması MVC mimarisinin altında yatan teoriyi dikkate almaz. Fabio Chevasko makalesinde, geleneksel MVC PHP çerçevelerinden birini kullanarak bu yanlış yaklaşımı örnek olarak açıklamaktadır:

“MVC mimarisini doğru bir şekilde uygulamak için,“ Model ”ile“ Görünüm ”arasında etkileşim olmamalıdır: tüm mantık“ Denetleyici ”tarafından işlenir.

Ayrıca, şablon dosyası olarak “Görünüm” tanımı da yanlıştır. Ancak bu bir kişinin hatası değildir, ancak çeşitli geliştiricilerin ortak bir yanlış anlamaya yol açan birçok hatanın sonucudur. Sonra yanlış başkalarına açıklar. Aslında, "Görünüm" sadece bir şablondan çok daha fazlasıdır. Ancak modern MVC odaklı çerçeveler, bu yaklaşımı, doğru MVC yapısının desteklenip desteklenmediğini hiç kimsenin umursamayacağı ölçüde benimsemiştir.

View bileşeni hiçbir zaman doğrudan Denetleyici tarafından iletilmez. "Görünüm" ile "Denetleyici" arasında doğrudan bir bağlantı yoktur - bunlar "Model" kullanılarak bağlanır.

kontrolör

Görevi, kullanıcının girdiği verileri işlemek ve "Model" i güncellemektir. Bu, devrenin kullanıcı etkileşimi gerektiren tek parçasıdır.

“Kontrolör” bir bilgi toplayıcı olarak tanımlanabilir ve daha sonra depolama için daha sonraki organizasyonla “Model” e aktarılır. Gelen verileri toplama ihtiyacından başka bir mantık içermez. Bir “kontrolör” ayrıca yalnızca bir “Görünüm” ve bir “Model” e bağlanır. Bu, veri alışveriş noktalarında bir giriş ve bir çıkış ile tek yönlü veri akışına sahip bir sistem oluşturur.

“Denetleyici” yalnızca kullanıcı “Görünüm” ile etkileşime girdiğinde yürütme görevlerini alır ve her işlev kullanıcının “Görünüm” ile etkileşimine bağlıdır. Geliştiriciler tarafından yapılan en yaygın hata, "Denetleyici" yi ağ geçidi ile karıştırmalarıdır, bu nedenle "Görünüm" ile ilgili işlevler ve görevler atarlar.

Bir diğer yaygın hata, “Kontrolör” e yalnızca verilerin “Model” den “Görünüm” e işlenmesinden ve aktarılmasından sorumlu fonksiyonlarla donatılmasıdır. Ancak MVC modelinin yapısına göre bu etkileşim “Model” ve “Görünüm” arasında olmalıdır.

PHP'de MVC

PHP'de mimarisi MVC tabanlı bir web uygulaması yazacağız. Örnek bir tel kafes ile başlayalım:

string \u003d "MVC + PHP \u003d Harika!"; ))denetleyici \u003d $ denetleyici; $ this-\u003e model \u003d $ model; ) genel işlev çıkışı () (return "

". $ this-\u003e model-\u003e string."

"; } } model \u003d $ model; ))

Şablonun her bölümü için birkaç ana sınıf içeren bir projemiz var. Şimdi aralarındaki ilişkiyi yapılandırmanız gerekiyor:

çıktı ();

Yukarıdaki PHP MVC örneğinde, kullanıcı etkileşimleri uygulamada tanımlanmadığından, denetleyici için belirli bir işlevsellik yoktur. Örneğimiz yalnızca tanıtım amaçlı olduğu için görünüm tüm işlevleri içermektedir.

Kontrolör işlevselliğini nasıl ekleyeceğimizi göstermek için örneği genişletelim, böylece uygulamaya etkileşimler ekleyelim:

string \u003d “MVC + PHP \u003d Harika, buraya tıklayın!”; ))denetleyici \u003d $ denetleyici; $ this-\u003e model \u003d $ model; ) genel işlev çıkışı () (return "

model-\u003e dize. "

"; } } model \u003d $ model; ) public function clicked () ($ this-\u003e model-\u003e string \u003d “MVC ve PHP sayesinde Güncellenmiş Veriler!”;))

Programı temel işlevlerle genişlettik. Bileşenler arasında etkileşimler oluşturmak artık şuna benziyor:

($ _GET ["action"]) (); ) echo $ view-\u003e output ();

Herkese merhaba! Bugün ilk makaleyi kendime ait bir dizide yazıyorum MVC uygulamaları.

İlk olarak, eğer birisi bilmiyorsa mVC nedirsonra önce bu makaleyi okuyun:

Sonunda ne olacak? Sahip olacağız kaydırıcıkullanılarak oluşturuldu mVC Tasarım Deseni. Bu motor çok basit olacak, kontroller bir yere atlanacak, ancak bunların hepsi, uygulamaların nasıl oluşturulacağını anlamanız için yapıldı. MVCve daha sonra motorumuzu tamamladıktan sonra, projeleriniz için kullanabilirsiniz. Temel işlevselliğe sahip olacağız:

  • yetki
  • küçük sohbet
  • makale ekleme
  • makale düzenleme
  • makaleleri sil
  • kullanıcı yönetimi

Her şey klasör yapısıyla başlar. Biz böyle olacak:

  • index.php
  • .htaccess
  • kontrolörleri
  • modeller
  • görünümler
  • libs

Sanırım burada her şey açık. Klasörlerde kontrolörleri, modeller, görünümler   ve libs   tutulacak kontrolörleri, model, türleri   ve diğer dosyalar. Oluşturma sürecinde ihtiyacımız olan klasörleri ve dosyaları ekleyeceğiz.

Motorumuzu oluşturmak için kullanılacak nesne yönelimli yaklaşım. Onu iyi tanımıyorsanız, önce bu makaleyi sitede de okumalısınız.

Bu yüzden tanıtım makalesini bitirdiğim yer ve bir sonraki bölümde mVC motoru. Yakında görüşürüz!

model Model-Görünüm-Denetleyici (MVC)1970'lerin sonlarında açılan, asıl görevi veri işlevlerini sunumlarından ayırmak olan bir yazılım mimarisi tasarım modelidir. Teorik olarak, iyi tasarlanmış bir MVC uygulaması, ön uç ve arka uç geliştiricilerinin çalışma sırasında birbirlerinin sorumluluk alanlarına müdahale etmemelerine izin verecektir, yani bir ön uç geliştiricinin arka uç meslektaşının “mutfağı” hakkında hiçbir şey bilmesine gerek yoktur.

MVC başlangıçta masaüstü uygulamaları geliştirmek için tasarlanmış olsa da, modern görevler için uyarlanmıştır ve web geliştiricileri arasında çok popülerdir, çünkü sorumlulukların bölünmesi nedeniyle daha net, kullanıma hazır kod oluşturmak mümkün hale gelmiştir. MVC modeli, geliştiricilerin mevcut kodda çok hızlı bir şekilde değişiklik yapmalarına izin veren net, modüler sistemlere yol açar.

Bu makalede, bir model tanımlamaktan ve küçük bir örnekte uygulanmasına devam etmekle birlikte, MVC'nin temel ilkelerini ele alacağız. Bu makale öncelikle yaşamda bu kalıpla hiç karşılaşmamış olanlar ve belki de MVC bilgilerini yenilemek isteyenler için yararlı olacaktır.

MVC'yi anlama

Daha önce de belirtildiği gibi, desenin adı üç kelimenin kısaltmasından gelir: Modeli (modeli) Görünüm (View)   ve Denetleyici (PLC). Kısaca, kalıbın prensibi bir şema ile gösterilebilir (Wikipedia'da bulunabilir):

Bu diyagram, bir örüntüdeki tek yönlü bilgi akışını gösterir ve ayrıca her bileşenin rollerini açıklar.

model

Model verilere erişmek ve bunları değiştirmek için kullanılır. Çoğu durumda, bir veri deposuna (örneğin bir veritabanına) erişmek için kullanılan modeldir. Model, veri aramak, oluşturulması, değiştirilmesi ve depodan kaldırılması için bir arayüz sağlar. MVC modeli bağlamında, model görünüm ve kontrolör arasında aracılık eder.

Modelin son derece önemli bir özelliği, teknik olarak, kontrolör ve görünümdeki verilere ne olduğu hakkında hiçbir bilgiye sahip olmamasıdır. Bir model, kalıbın diğer bileşenlerine / modellerinden hiçbir istekte bulunmamalı veya beklememelidir.

Bununla birlikte, bir modelin sadece bir veri tabanına veya başka bir sisteme erişmek için sadece bir kapı olmadığını, bu da sadece verinin ileri geri aktarımıyla ilgilidir. Model bir veri kontrol noktasıdır. Çoğu durumda model, kısmen modelin kendisinin diğer tüm parçalar için bir bağlantı bağlantısı olması nedeniyle sistemin en karmaşık parçasıdır.

Fikir

Görünüm, modelden alınan verilerin istenen formda görüntülendiği yerdir. MVC modelinin bir parçası olarak geliştirilen geleneksel web uygulamalarında sunum, HTML'nin üretildiği sistemin bir parçasıdır. Bu görünüm aynı zamanda kullanıcıdan denetleyiciye gönderilmesi için eylem almaktan da sorumludur. Örneğin, görünüm kullanıcı arabiriminde bir düğme görüntüler ve bastıktan sonra ilgili denetleyici eylemini çağırır.

Sunumun amacı konusunda, özellikle de MVC kullanarak uygulamalarını geliştirmeye yeni başlayan web geliştiricileri arasında bazı yanlış düşünceler vardır. En yaygın ihlal edilen kurallardan biri sunum hiçbir şekilde modelle iletişim kurmamalıdırve hepsi görünüm tarafından alınan veriler sadece kontrolörden gelmelidir. Uygulamada, geliştiriciler genellikle MVC modelinin kalbinde yer alan bu kavramı göz ardı eder. Fabio Cevasco'nun makalesi, birçok standart dışı MVC çerçevesinden biri olan CakePHP çerçevesiyle bu kafa karıştırıcı MVC yaklaşımını göstermektedir:

Doğru MVC mimarisini elde etmek için görüşler ve modeller arasında doğrudan bir etkileşim olmaması gerektiğini anlamak zorunludur. Aralarındaki tüm veri alışverişi mantığı denetleyicilere uygulanmalıdır.

Ayrıca, bir görünümün yalnızca bir şablon dosyası olduğu konusunda yaygın bir yanlış anlama vardır. Tom Butler'ın belirttiği gibi, bu yanlış anlama, birçok geliştiricinin MVC'nin yapısını en başından itibaren yanlış anlaması nedeniyle, daha sonra bu “bilgiyi”, geliştiricilerin kitlelerini daha fazla dökmeye başladıkları için büyük bir ölçeğe sahiptir. Aslında, bir sunum sadece bir şablondan çok daha fazlasıdır, ancak, MVC deseni temelinde inşa edilen birçok çerçeve sunum kavramını o kadar çarpıtır ki, hiç kimse uygulamalarının MVC deseni açısından ne kadar doğru olduğunu umursamaz.

Bir başka önemli nokta, görünümün asla kontrolörden “saf” verilerle çalışmamasıdır, yani kontrolör asla modeli atlayarak görünümle çalışmaz. Kontrolör ve görünüm etkileşimi sürecinde, model her zaman aralarında olmalıdır.

kontrolör

Denetleyici, MVC paketinin son kısmıdır. Kontrolörün görevi kullanıcıdan veri almak ve modeli manipüle etmektir. Sistemin kullanıcı ile etkileşen kısmı sadece o denetleyicidir.

Özetle, kontrolör, bilgi işlemek ve depolamak için modele ileterek bir bilgi toplayıcı olarak tanımlanabilir. Verilerle hiçbir şey yapmamalı, sadece kullanıcıdan alabilmelidir. Kontrolör bir görünüm ve bir model ile ilişkilidir, böylece tek yönlü bir veri akışı düzenler ve her aşamada kontrol eder.

Denetleyicinin, yalnızca denetleyicinin ilgili işlevini çağıran görünümle kullanıcı etkileşiminin bir sonucu olarak çalışmaya başladığını hatırlamak çok önemlidir. Geliştiriciler arasında en yaygın hata, denetleyicinin sadece görünüm ve model arasında bir geçit olarak görülmesidir. Sonuç olarak, denetleyiciye görünüm tarafından gerçekleştirilmesi gereken işlevler verilir (bu arada, fikrin bacakları buradan gelir, görünüm sadece bir şablon dosyasıdır). Bunun da ötesinde, birçoğu genel olarak veri işleme mantığının tamamını dökerek modelin MVC modelinde ne için olduğunu unutur.

PHP'de MVC

Yukarıdakileri küçük bir uygulamada uygulamaya çalışmanızı öneririm. Model, görünüm ve denetleyici sınıflarını oluşturarak başlayalım:

string \u003d "MVC + PHP \u003d Harika!"; ))denetleyici \u003d $ denetleyici; $ this-\u003e

". $ this-\u003e model-\u003e string."

"; } } model \u003d $ model; ))

Temel sınıflar hazır. Şimdi onları birbirine bağlayalım ve uygulamamızı başlatalım:

çıktı ();

Gördüğünüz gibi, kullanıcı uygulama ile etkileşime girmediği için denetleyicinin herhangi bir işlevi yoktur. Uygulamamız yalnızca veri çıkışı için tasarlandığından, tüm işlevler görünüme yerleştirilir.

Denetleyicinin nasıl çalıştığını görmek için biraz etkileşim ekleyerek uygulamayı biraz genişletelim:

string \u003d “MVC + PHP \u003d Harika, buraya tıklayın!”; ))denetleyici \u003d $ denetleyici; $ this-\u003e model \u003d $ model; ) genel işlev çıkışı () (return "

model-\u003e dize. "

"; } } model \u003d $ model; ) public function clicked () ($ this-\u003e model-\u003e string \u003d “MVC ve PHP sayesinde Güncellenmiş Veriler!”))

Ve son olarak, ara katman yazılımını biraz yükseltiriz:

($ _GET ["action"]) (); ) echo $ view-\u003e output ();

sonuçlar

Bu kısa makalede, MVC tasarım modelinin temel kavramlarını inceledik ve buna dayanan basit bir uygulama geliştirdik, ancak elbette, bunu gerçek hayatta kullanmaktan hala çok uzaktayız. Bir sonraki makalede, MVC modeline dayanarak uygulamanın mimarisini daha yakından oluşturmakla karşılaşırsanız karşılaşacağınız temel zorlukları ele alacağız. Bizi izlemeye devam edin!


üst