Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Sfat
  • Înapoi la implementarea MVC. Creați un formular de feedback

Înapoi la implementarea MVC. Creați un formular de feedback

Mulți încep să scrie un proiect care să lucreze cu o singură sarcină, fără a presupune că poate crește într-un sistem de management multi-utilizator, ei bine, să spunem, conținut sau, Doamne ferește, producție. Și totul pare să fie cool și cool, totul funcționează până începi să înțelegi că codul care este scris este format în întregime din cârje și hardcode. Cod amestecat cu aspect, solicitări și cârje, uneori chiar ilizibile. Apare o problemă urgentă: atunci când adăugați noi funcții, trebuie să vă chinuiți acest cod pentru o perioadă foarte lungă de timp, amintindu-vă „ce a fost scris acolo?” și blestemă-te pe tine în trecut.

Poate că ați auzit chiar de modele de design și chiar ați răsfoit aceste cărți excelente:

  • E. Gamma, R. Helm, R. Johnson, J. Vlissides „Tehnici de proiectare orientate pe obiecte. Modele de design ";
  • M. Fowler „Arhitectura aplicațiilor software pentru întreprinderi”.
Și mulți, fără să se teamă de manuale și documentație uriașă, au încercat să studieze oricare dintre cadrele moderne și s-au confruntat cu dificultatea de înțelegere (datorită prezenței multor concepte arhitecturale legate inteligent între ele) au pus studiul și aplicarea instrumentelor moderne. pe arzătorul din spate.

Articolul prezentat va fi util în primul rând pentru începători. Oricum, sper că în câteva ore vă veți putea face o idee despre implementarea modelului MVC care stă la baza tuturor cadrelor web moderne, precum și să obțineți ceva „hrană” pentru a vă gândi în continuare la „cum să faceți”. aceasta." La sfârșitul articolului este o selecție de Link-uri utile care vă va ajuta, de asemenea, să înțelegeți din ce sunt alcătuite cadrele web (pe lângă MVC) și cum funcționează.

Este puțin probabil ca programatorii PHP de bază să găsească ceva nou pentru ei înșiși în acest articol, dar observațiile și comentariile lor asupra textului principal ar fi de mare ajutor! pentru că fără teorie, practica este imposibilă, iar fără practică, teoria este inutilă, atunci mai întâi va fi puțină teorie și apoi vom trece la practică. Dacă sunteți deja familiarizat cu conceptul de MVC, puteți sări peste secțiunea teorie și să treceți direct în practică.

1. Teorie

Modelul MVC descrie o modalitate ușoară de a construi structura unei aplicații, cu scopul de a separa logica de afaceri de interfața cu utilizatorul. Ca rezultat, aplicația este mai ușor de scalat, testat, întreținut și, desigur, implementat.

Să aruncăm o privire la schema conceptuală a modelului MVC (în opinia mea, aceasta este cea mai de succes schemă pe care am văzut-o):

În arhitectură Model MVC furnizează date și reguli de logica de afaceri, vedere este responsabilă interfața cu utilizatorul iar controlerul se ocupă de interacțiunea dintre model și vedere.

Un flux de lucru tipic pentru o aplicație MVC poate fi descris după cum urmează:

  1. Când un utilizator introduce o resursă web, scriptul de inițializare creează o instanță a aplicației și o lansează pentru execuție.
    Aceasta afișează o vedere, să zicem pagina principala site-ul.
  2. Aplicația primește o solicitare de la utilizator și determină controlerul și acțiunea solicitate. În cazul unei pagini master, acțiunea implicită ( index).
  3. Aplicația instanțează controlerul și rulează metoda de acțiune,
    care, de exemplu, conține apeluri model care citesc informații din baza de date.
  4. După aceea, acțiunea generează o vizualizare cu datele obținute din model și afișează rezultatul utilizatorului.
Model- conține logica de business a aplicației și include metode de preluare (acestea pot fi metode ORM), procesare (de exemplu, reguli de validare) și furnizare de date specifice, ceea ce o face adesea foarte groasă, ceea ce este destul de normal.
Modelul nu trebuie să interacționeze direct cu utilizatorul. Toate variabilele legate de solicitarea utilizatorului trebuie procesate în controler.
Modelul nu trebuie să genereze HTML sau alt cod de afișare care se poate modifica în funcție de nevoile utilizatorului. Un astfel de cod trebuie procesat în vizualizări.
Același model, de exemplu: modelul de autentificare a utilizatorului poate fi utilizat atât în ​​partea de utilizator, cât și în partea administrativă a aplicației. În acest caz, puteți muta codul comun într-o clasă separată și puteți moșteni din acesta, definind metode specifice sub-aplicației în moștenitori.

Vedere- folosit pentru a seta afișarea externă a datelor primite de la controler și model.
Vizualizările conțin markup HTML și mici inserții de cod PHP pentru a parcurge, formata și afișa datele.
Nu ar trebui să acceseze direct baza de date. Acest lucru ar trebui să fie făcut de modele.
Nu ar trebui să funcționeze cu datele obținute dintr-o solicitare a utilizatorului. Această sarcină trebuie îndeplinită de controlor.
Poate accesa direct proprietățile și metodele controlerului sau modelelor pentru a obține date gata de ieșire.
Vizualizările sunt de obicei împărțite într-un șablon comun care conține marcajul comun tuturor paginilor (de exemplu, un antet și un subsol) și părți ale șablonului care sunt utilizate pentru afișarea datelor de ieșire din model sau pentru afișarea formularelor de introducere a datelor.

Controlor- lipiciul care conectează modele, vederi și alte componente în aplicație de lucru... Controlorul este responsabil pentru gestionarea cererilor utilizatorilor. Controlerul nu trebuie să conțină interogări SQL. Cel mai bine sunt păstrate în modele. Controlerul nu trebuie să conțină HTML sau alte markupuri. Ar trebui scos la specie.
Într-o aplicație MVC bine proiectată, controlerele sunt de obicei foarte subțiri și conțin doar câteva zeci de linii de cod. The Stupid Fat Controllers (SFC) în CMS Joomla... Logica controlerului este destul de tipică și cea mai mare parte este realizată în clase de bază.
Modelele, pe de altă parte, sunt foarte groase și conțin cea mai mare parte a codului de procesare a datelor. structura datelor și logica de afaceri pe care le conține sunt de obicei destul de specifice aplicației.

1.1. Controler frontal și controler de pagină

În cele mai multe cazuri, interacțiunea utilizatorului cu aplicația web are loc prin clic pe linkuri. Uită-te acum la bara de adrese a browserului tău - acest link ai primit acest text. Alte link-uri, cum ar fi cel din dreapta acestei pagini, vă vor oferi conținut diferit. Astfel, linkul reprezintă o comandă specifică aplicației web.

Sper că ați observat deja că diferite site-uri pot fi perfecte diferite formate construirea barei de adrese. Fiecare format poate reprezenta arhitectura unei aplicații web. Deși nu este întotdeauna cazul, în majoritatea cazurilor este un fapt clar.

Luați în considerare două opțiuni pentru bara de adrese, care arată un fel de text și profil de utilizator.

Cod de procesare aproximativ în acest caz:
comutați ($ _ GET ["acțiune"]) (case "despre": require_once ("about.php"); // Despre noi pauză de pagină; case "contacts": require_once ("contacts.php"); // pagină „Contacte” pauză; caz „feedback”: require_once („feedback.php”); // pauză de pagină „Feedback”; implicit: require_once („page404.php”); // pagina „404” pauză;)
Cred că aproape toată lumea a făcut asta înainte.

Folosind motorul de rutare URL, vă puteți configura aplicația să accepte aceste solicitări pentru a afișa aceleași informații:
http://www.example.com/contacts/feedback

Aici contactele este controlerul și feedbackul este metoda controlorului de contacte care redă formularul părere etc. Vom reveni asupra acestei probleme în partea practică.

De asemenea, merită să știți că multe routere cadru web vă permit să creați rute URL arbitrare (specificați ce înseamnă fiecare parte a adresei URL) și cum să le gestionați.
Acum avem suficiente cunoștințe teoretice pentru a trece la practică.

2. Practică

Mai întâi, să creăm următoarea structură de fișiere și foldere:


Privind în viitor, voi spune că folderul de bază va stoca clasele de bază Model, View și Controller.
Descendenții lor vor fi stocați în directoarele de controlere, modele și vizualizări. Fişier index.php acesta este un punct în rândul aplicației. Fişier bootstrap.php inițiază descărcarea aplicației, conectând toate modulele necesare etc.

Vom merge consecvent; deschideți fișierul index.php și completați-l cu următorul cod:
ini_set („erori de afișare”, 1); require_once "aplicație / bootstrap.php";
Nu ar trebui să existe întrebări.

Apoi, să trecem direct la fișier bootstrap.php:
require_once "core / model.php"; require_once "core / view.php"; require_once "core / controller.php"; require_once "core / route.php"; Traseu :: start (); // pornește routerul
Primele trei linii se vor conecta deocamdată fisiere inexistente miezuri. Ultimele linii conectează fișierul cu clasa routerului și îl pornesc pentru execuție apelând metoda de pornire statică.

2.1. Implementarea ruterului URL

Să ne abatem de la implementare pentru moment Modele MVCși hai să facem rutare. Primul pas pe care trebuie să-l facem este să scriem următorul cod .htaccess:
RewriteEngine On RewriteCond% (REQUEST_FILENAME)! -F RewriteCond% (REQUEST_FILENAME)! -D RewriteRule. * Index.php [L]
Acest cod va redirecționa procesarea tuturor paginilor către index.php, care este ceea ce avem nevoie. Vă amintiți că în prima parte am vorbit despre Front Controller?!

Vom pune rutarea într-un fișier separat traseu.php la directorul de bază. În acest fișier, vom descrie clasa Route, care va rula metodele controlerului, care la rândul lor vor genera vizualizarea paginii.

Conținutul fișierului Route.php

clasa Route (funcția statică start () (// controler și acțiune implicită $ controller_name = "Main"; $ action_name = "index"; $ rute = explode ("/", $ _SERVER ["REQUEST_URI"]); // obține numele controlerului dacă (! gol ($ rute)) ($ nume_controller = $ rute;) // obține numele acțiunii dacă (! gol ($ rute)) ($ nume_acțiune = $ rute;) // adaugă prefixele $ model_name = " Model _ ". $ Controller_name; $ controller_name = " Controller _ ". $ Controller_name; $ action_name =" action _ ". $ Action_name; // conectați fișierul cu clasa de model (s-ar putea să nu existe un fișier model) $ model_file = strtolower ($ model_name). ".php"; $ model_path = "aplicație / modele /".$ model_file; if (fișier_există ($ model_path)) (include" aplicație / modele /".$ model_file ;) // conectează fișierul cu clasa controler $ controller_file = strtolower ($ controller_name). ". php"; $ controller_path = "application / controllers /".$ controller_file; if (file_exists ($ controller_path)) (include" aplicație / controllers /".$ controller_f ile; ) else (/ * ar fi corect să aruncăm o excepție aici, dar pentru simplitate, să redirecționăm imediat la o pagină 404 * / Route :: ErrorPage404 ();) // creăm un controller $ controller = new $ controller_name; $ action = $ action_name; if (method_exists ($ controller, $ action)) (// apelează acțiunea controlerului $ controller -> $ acțiune ();) else (// aici ar fi, de asemenea, mai rezonabil să se arunce o excepție Route :: ErrorPage404 (); )) Funcția ErrorPage404 ( ) ($ gazdă = "http: //". $ _ SERVER ["HTTP_HOST"]. "/"; antet ("HTTP / 1.1 404 Nu a fost gasit"); antet (" Stare: 404 Nu a fost găsit "); antet (" Locație: ". $ gazdă." 404 ");))


Rețineți că clasa implementează o logică foarte simplificată (în ciuda codului voluminos) și poate avea chiar probleme de securitate. Acest lucru a fost făcut intenționat, deoarece scrierea unei clase de rutare cu drepturi depline merită cel puțin un articol separat. Să luăm în considerare punctele principale...

Elementul matricei globale $ _SERVER ["REQUEST_URI"] conține adresa completă la care a contactat utilizatorul.
De exemplu: example.ru/contacts/feedback

Folosind funcția exploda adresa este împărțită în componente. Ca rezultat, obținem numele controlerului, pentru exemplul dat, acesta este controlerul contacteși numele acțiunii, în cazul nostru - părere.

Apoi, fișierul model este conectat (modelul poate fi absent) și fișierul controler, dacă există și, în final, controlerul este instanțiat și acțiunea este apelată, din nou dacă a fost descrisă în clasa controlerului.

Astfel, când mergi, de exemplu, la adresa:
exemplu.com/portfolio
sau
exemplu.com/portfolio/index
routerul va face următoarele:

  1. va include fișierul model_portfolio.php din folderul modele care conține clasa Model_Portfolio;
  2. va include fișierul controller_portfolio.php din folderul controllers care conține clasa Controller_Portfolio;
  3. va crea o instanță a clasei Controller_Portfolio și va invoca acțiunea implicită - action_index descrisă în aceasta.
Dacă utilizatorul încearcă să contacteze adresa unui controler inexistent, de exemplu:
exemplu.com/ufo
apoi va fi redirecționat către pagina „404”:
exemplu.com/404
Același lucru se va întâmpla dacă utilizatorul întreprinde o acțiune care nu este descrisă în controler.

2.2. Înapoi la implementarea MVC

Să mergem la folderul de bază și să adăugăm încă trei fișiere în fișierul route.php: model.php, view.php și controller.php


Permiteți-mi să vă reamintesc că vor conține clase de bază, pe care acum vom începe să le scriem.

Conținutul fișierului model.php
Model de clasă (funcția publică get_data () ())
Clasa de model conține o singură metodă de preluare a datelor goală care se va suprapune în clasele descendente. Când creăm clase de descendență, totul va deveni mai clar.

Conținutul fișierului vizualizare.php
Vizualizare clasă (// public $ template_view; // aici puteți specifica vizualizarea generală implicită.funcția genera ($ content_view, $ template_view, $ data = null) (/ * if (is_array ($ data)) (// transforma elemente matrice la variabile extrage ($ date);) * / include "aplicație / vizualizări /".$ template_view;))
Nu este greu de ghicit că metoda Genera conceput pentru a forma o vedere. Ii sunt trecuți următorii parametri:

  1. $ content_file - vizualizări care afișează conținutul paginii;
  2. $ template_file - șablon comun pentru toate paginile;
  3. $ data este o matrice care conține elemente de conținut ale paginii. De obicei, completați modelul.
Funcția include conectează în mod dinamic șablonul general (vizualizarea), în care va fi încorporată vizualizarea
pentru a afișa conținutul unei anumite pagini.

În cazul nostru, șablonul general va conține antet, meniu, bară laterală și subsol, iar conținutul paginilor va fi conținut în formă separată... Din nou, acest lucru este făcut pentru simplitate.

Conținutul fișierului controller.php
Class Controller (model public $; vizualizare $ public; funcția __construct () ($ this-> view = new View ();) function action_index () ())
Metodă action_index- aceasta este acțiunea implicită, o vom suprascrie atunci când implementăm clasele descendente.

2.3. Implementarea claselor descendente Model și Controller, crearea View "s

Acum începe distracția! Site-ul nostru de cărți de vizită va consta din următoarele pagini:
  1. Acasă
  2. Servicii
  3. Portofoliu
  4. Contacte
  5. Și, de asemenea, - pagina „404”
Fiecare pagină are propriul controler din folderul controlere și o vizualizare din folderul vizualizări. Unele pagini pot folosi modelul sau modelele din folderul modele.


În figura anterioară, fișierul este evidențiat separat. template_view.php este un șablon care conține un marcaj comun tuturor paginilor. În cel mai simplu caz, ar putea arăta astfel:
Acasă
Pentru a oferi site-ului un aspect prezentabil, ne compensăm Șablon CSSși să-l integrăm în site-ul nostru prin modificarea structurii de marcare HTML și conexiuni CSSși fișiere JavaScript:

La sfârșitul articolului, în secțiunea „Rezultat”, există un link către depozitul GitHub cu un proiect în care s-au făcut pași pentru integrarea unui șablon simplu.

2.3.1. Creați o pagină de pornire

Să începem cu controlerul controller_main.php, iată codul său:
clasa Controller_Main extinde Controller (funcția action_index () ($ this-> view-> generate ("main_view.php", "template_view.php");))
În metodă Genera sunt transmise o instanță a clasei View, numele fișierelor șablonului general și vizualizarea cu conținutul paginii.
Pe lângă acțiunea de index, controlerul poate conține, desigur, și alte acțiuni.

Fișier cu vedere generala am acoperit mai devreme. Luați în considerare un fișier de conținut main_view.php:

Bine ati venit!

OLOLOSHA TEAM este o echipă de specialiști de top în dezvoltarea de site-uri web cu ani de experiență în colectarea măștilor mexicane, statui din bronz și piatră din India și Ceylon, basoreliefuri și statui create de maeștrii Africii Ecuatoriale în urmă cu cinci până la șase secole...


Conține un marcaj simplu, fără apeluri PHP.
A afișa Pagina principală puteți folosi una dintre următoarele adrese:

Vom lua în considerare un exemplu folosind o vizualizare care afișează datele obținute din modelul de mai jos.

2.3.2. Creați o pagină de portofoliu

În cazul nostru, pagina Portofoliu este singura pagină care folosește modelul.
Modelul include de obicei metode pentru preluarea datelor, de exemplu:
  1. metode de biblioteci native pgsql sau mysql;
  2. metode ale bibliotecilor care implementează abstractizarea datelor. De exemplu, metodele bibliotecii PEAR MDB2;
  3. metode ORM;
  4. metode de lucru cu NoSQL;
  5. si etc.
Pentru simplitate, nu vom folosi aici interogări SQL sau instrucțiuni ORM. În schimb, vom emula date reale și vom returna imediat o serie de rezultate.
Fișier model model_portfolio.php pune înăuntru folderul modelelor... Iată conținutul acestuia:
clasa Model_Portfolio extinde Model (funcția publică get_data () (matrice de returnare (matrice ("Anul" => "2012", "Site" => "http://DunkelBeer.ru", "Descriere" => "Bere neagră Dunkel de la producătorul german Löwenbraü produs în Rusia de către compania de bere „SAN InBev”. „), matrice („ Anul „=>” 2012 "," Site-ul "=>" http://ZopoMobile.ru "," Descrierea "=> „Catalog în limba rusă Telefoane chinezești de Zopo pe Baza Android OS și accesoriile acestora. "), // tot);))

Clasa de controler model este conținută în fișier controller_portfolio.php, iată codul său:
clasa Controller_Portfolio extinde Controller (funcția __construct () ($ this-> model = new Model_Portfolio (); $ this-> view = new View ();) function action_index () ($ data = $ this-> model-> get_data (); ); $ this-> view-> generate ("portfolio_view.php", "template_view.php", $ date);))
Într-o variabilă date se scrie matricea returnată de metodă Obțineți date la care ne-am uitat mai devreme.
În plus, această variabilă este transmisă ca parametru al metodei Genera, care se transmit și: numele fișierului cu șablonul comun și numele fișierului care conține vizualizarea cu conținutul paginii.

Vizualizarea care conține conținutul paginii se află în fișier portfolio_view.php.

Portofoliu

Toate proiectele din următorul tabel sunt fictive, așa că nici măcar nu încercați să urmați linkurile furnizate. "; } ?>
AnProiectDescriere
". $ rând [" Anul "]."". $ rând [" Site "]."". $ rând [" Descriere "]."


Totul este simplu aici, vizualizarea afișează datele obținute din model.

2.3.3. Creați restul paginilor

Restul paginilor sunt create în același mod. Codul lor este disponibil în depozitul de pe GitHub, un link către care este furnizat la sfârșitul articolului, în secțiunea „Rezultat”.

3. Rezultat

Și iată ce s-a întâmplat până la urmă:

Captură de ecran a site-ului de cărți de vizită rezultat



Link GitHub: https://github.com/vitalyswipe/tinymvc/zipball/v0.1

Dar în această versiune, am schițat următoarele clase (și vederile lor corespunzătoare):

  • Controller_Login în care se generează o vizualizare cu un formular pentru introducerea unui login și a parolei, după completare care se realizează o procedură de autentificare și, dacă reușește, utilizatorul este redirecționat către panoul de administrare.
  • Contorller_Admin cu o acțiune de index, în care se verifică dacă utilizatorul a fost autorizat anterior pe site ca administrator (dacă a fost, atunci se afișează vizualizarea panoului de administrare) și o acțiune de logout pentru deconectare.
Autentificarea și autorizarea este un subiect diferit, așa că nu este tratat aici, ci este furnizat doar linkul indicat mai sus, astfel încât să existe de la care să plecăm.

4. Concluzie

Modelul MVC este folosit ca bază arhitecturală în multe cadre și CMS-uri, care au fost create pentru a putea dezvolta soluții mai complexe de calitate superioară într-o perioadă mai scurtă de timp. Acest lucru a devenit posibil datorită creșterii nivelului de abstractizare, deoarece există o limită a complexității structurilor pe care creierul uman poate opera.

Dar, utilizarea cadrelor web precum Yii sau Kohana, constând din câteva sute de fișiere, atunci când se dezvoltă aplicații web simple (de exemplu, site-uri de cărți de vizită) nu este întotdeauna recomandabilă. Acum putem crea un model MVC frumos pentru a nu amesteca PHP, Html, CSS și Cod JavaScriptîntr-un singur dosar.

Acest articol este mai mult un punct de plecare pentru a învăța CMF decât un exemplu de ceva cu adevărat corect pe care îl puteți lua ca bază pentru aplicația dvs. web. Poate chiar ea te-a inspirat și deja te gândești să-ți scrii propriul micro-cadru sau CMS bazat pe MVC. Dar, înainte de a reinventa următoarea bicicletă cu „blackjack și curve”, mai gândește-te, poate eforturile tale pot fi îndreptate mai înțelept spre dezvoltarea și să ajute comunitatea unui proiect existent?!

P.S .: Articolul a fost rescris ținând cont de unele dintre comentariile lăsate în comentarii. Critica a fost de mare ajutor. Judecând după răspuns: comentarii, solicitări personale și numărul de utilizatori care au adăugat postarea la favorite, ideea de a scrie această postare s-a dovedit a nu fi atât de rea. Din păcate, nu se poate ține cont de toate dorințele și de a scrie din ce în ce mai în detaliu din lipsă de timp... dar poate că va fi făcut de acele figuri misterioase care minus versiunea originală. Mult succes cu proiectele tale!

5. O selecție de link-uri utile pe subiect

Articolul abordează foarte des subiectul cadrelor web - acesta este un subiect foarte larg, deoarece chiar și micro-framework-urile constau din multe componente interconectate inteligent și ar fi nevoie de mai mult de un articol pentru a vorbi despre aceste componente. Cu toate acestea, am decis să ofer aici o mică selecție de link-uri (pe care le-am urmărit când am scris acest articol), care într-un fel sau altul se referă la subiectul cadrelor.

Etichete: Adăugați etichete

Acest tutorial vă va arăta cum să creați cel mai simplu formular de contact HTML.

Mai întâi de toate creați 2 fișiere: contact_form.htmlși contact.php... Primul fișier va conține codul formularului dumneavoastră de contact, iar al doilea va prelucra datele acestui formular.

HTML

Mai jos este un exemplu de cod HTML pentru un formular de contact:

Numele dumneavoastră

Email-ul tau

Mesaj

Câmpurile marcate cu un asterisc (*) trebuie completate.> 8 & 0xff; ) else $ rezultat = (mail ($ destinatari, $ subiect, $ corp, "de la:". $ de la. "rn". $ anteturi)? FALSE: ADEVĂRAT); if ($ rezultat) echo "Mesajul nu a fost trimis!"; else echo "Vă mulțumesc, mesajul dvs. a fost trimis. Administratorul vă va contacta în curând!"; ?>

Acum să aruncăm o privire la cum funcționează acest program. Execuția începe cu linia „dacă (! $ A) show_form ();”, pentru că înainte a fost specificată o funcție care, desigur, nu este executată. În această linie, verificăm dacă a existat o încercare de completare a formularului (din formular, după cum puteți vedea, este trecută variabila $ a, care este bifată în această linie). Dacă nu există o astfel de încercare, este apelată funcția show_form (), care afișează formularul.

Top articole similare