Kako postaviti pametne telefone i računala. Informativni portal

Što je MVC uzorak dizajna u Javi? MVC: što je i kako se odnosi na korisničko sučelje.

U ovom članku ćemo napisati "kostur" našeg projekta. Pod riječju "framework" mislim na radni kod koji će se temeljiti na MVC pristupu, odnosno imat će jasnu podjelu logike na kontrolere, akcije, predloške (poglede) i modele.

I zato krenimo, kao što sam već napisao u prethodnom članku, MVC uzorak podrazumijeva jednu ulaznu točku - index.php, svi zahtjevi će prolaziti kroz ovu skriptu, kroz nju će raditi sva projektna logika. Za implementaciju ovog pristupa potrebno je konfigurirati poslužitelj, pretpostavlja se da stranica radi na apache poslužitelju, pa samo trebamo kreirati .htaccess datoteku u kojoj specificiramo pravila usmjeravanja URL-a. Osim definiranja ulazne točke, usmjeravanje vam omogućuje stvaranje CNC (ljudski čitljivih URL-ova). Odnosno, nakon ispravnih postavki, adrese stranica će izgledati ovako: site.ru/article/new.
Prvo, napravimo .htaccess koji će preusmjeriti obradu svih stranica na skriptu index.php. Kod izgleda ovako:

RewriteEngine na RewriteCond% (REQUEST_FILENAME)! -F RewriteCond% (REQUEST_FILENAME)! -D RewriteRule ^ (. *) $ Index.php? Route = $ 1

Datoteka .htaccess mora se nalaziti u korijenskoj mapi stranice, a odmah je potrebno kreirati skriptu index.php koja je ulazna točka. Stavimo jedan redak u index.php da provjerimo radi li preusmjeravanje:

Echo "test";

Sada možete provjeriti radi li preusmjeravanje, unesite bilo koju adresu i vidite što će se dogoditi: test-mvc.web / sdf / sdf / ili test-mvc.web / sdf / sdf / 2342 / nije važno, u svakom slučaju, "Test". Ako ste vidjeli ovaj natpis, to znači da smo uspjeli.
Nastavimo, radi praktičnosti, napravimo config.php datoteku u korijenu stranice u kojoj ćemo postaviti razne konstante koje olakšavaju prilagođavanje stranice. To mogu biti različiti putovi do skripti, pristup bazi podataka i tako dalje. Sada u konfiguraciji postavimo sljedeće:

// Postavi konstante: define ("DS", DIRECTORY_SEPARATOR); // separator za puteve datoteke $ sitePath = realpath (dirname (__ FILE__). DS); definirati ("SITE_PATH", $ sitePath); // put do korijenske mape stranice // za povezivanje s bazom podataka define ("DB_USER", "root"); definirati ("DB_PASS", ""); definirati ("DB_HOST", "localhost"); definirati ("DB_NAME", "blog_mvc");

Kako bi se konstante i drugi konfiguracijski podaci koristili tijekom cijelog projekta, potrebno je uključiti skriptu config.php u datoteku index.php.
Osim povezivanja datoteke s postavkama, u index.php trebate stvoriti vezu s bazom podataka, povezati skriptu s jezgrom stranice i pokrenuti router u kojem će se odvijati usmjeravanje.
Sada, redom, kreiranje veze s bazom podataka bit će u index.php tako da se veza otvara samo jednom. Nakon što smo jednom otvorili vezu, možemo je koristiti u svim kontrolerima i modelima, ali o tome kasnije. Za sada samo stvorimo vezu s bazom. Za rad s bazom podataka odlučio sam koristiti PDO. Možete pročitati više o PDO-u.
Smjestit ćemo jezgru stranice u mapu core i nazvati skriptu core.php, ovdje ćemo napisati funkciju koja će se sama povezati, klase su neophodne za rad. Takva funkcija uvelike će nam olakšati i pojednostaviti rad s kontrolerima, modelima itd. Jer, gledajući unaprijed, reći ću da će svaki kontroler i svaki model biti zasebna klasa.
Osim auto-povezujućih klasa, u jezgru izrade spremišta ćemo dodati i spremište (registrator) u koje ćemo pohraniti sve potrebne objekte i varijable koje mogu biti korisne bilo gdje u projektu.
Također povezujemo usmjerivač u datoteci indeksa, on će analizirati URL i povezati potreban kontroler i radnju. Što je kontroler napisao sam u prethodnom članku, ali sam namjerno preskočio informaciju o akciji, a da se nisam opteretio nepotrebnim informacijama. Dakle, što je akcija?
Kontroler je klasa koja sadrži različite metode, s MVC pristupom, svaka metoda će biti akcija. To jest, akcija je metoda klase koja će obraditi podatke i proslijediti ih pogledu (predlošku). Možda još nije sasvim jasno, ali nakon primjera sve će doći na svoje mjesto.
U ovoj fazi, teorija je dovoljna, prijeđimo na praksu. Dat ću kod datoteka, čiji rad sam gore opisao.
Index.php kod skripte:

// omogući prikaz svih grešaka error_reporting (E_ALL); // uključuje konfiguraciju include ("/config.php"); // Povezivanje s bazom podataka $ dbObject = novi PDO ("mysql: host =". DB_HOST. "; Dbname =". DB_NAME, DB_USER, DB_PASS); // uključuje jezgru stranice uključuje (SITE_PATH. DS. "core". DS. "core.php"); // Učitaj usmjerivač $ router = novi usmjerivač ($ registar); // zapis podataka u registar $ registry-> set ("usmjerivač", $ router); // postavlja put do mape kontrolera. $ router-> setPath (SITE_PATH. "kontroleri"); // pokretanje usmjerivača $ router-> start ();

Core.php skripta:

// Učitaj klase u pokretu funkcija __autoload ($ className) ($ filename = strtolower ($ className). ".Php"; // definiraj klasu i pronađi put za nju $ expArr = explode ("_", $ className) ) ; if (prazno ($ expArr) ILI $ expArr == "Osnova") ($ mapa = "klase";) else (preklopnik (strtolower ($ expArr)) (slučaj "kontroler": $ folder = "kontroleri"; break ; case "model": $ folder = "models"; break; default: $ folder = "classes"; break;)) // put do klase $ file = SITE_PATH. $ mapa. DS. $ filename; // provjeriti za datoteku dostupnosti if (file_exists ($ datoteka) == false) (vrati false;) // uključiti datoteku s klasom include ($ datoteka);) // pokrenuti registar (pohranu) $ registry = novi registar;

Klasa spremišta Registry.php nalazit će se u mapi / classes /

// Registar klasa klase pohrane (privatni $ vars = array (); // upiši skup funkcija podataka ($ ključ, $ var) (if (isset ($ this-> vars [$ ključ]) == true) (baci novi Iznimka ("Nije moguće postaviti var` ". $ Key." `. Već postavljeno.");) $ This-> vars [$ key] = $ var; vrati true;) // get data function get ($ ključ) (if (isset ($ this-> vars [$ ključ]) == false) (vrati null;) vrati $ this-> vars [$ ključ];) // ukloniti funkciju podataka ukloniti ($ var) (poništiti ($ ovo-> vars [$ ključ];))

Kôd za datoteku router.php koja se nalazi u mapi / classes /

// klasa usmjerivača Class Router (privatni $ registry; privatni $ put; privatni $ args = array (); // dobiti funkciju pohrane __construct ($ registry) ($ this-> registry = $ registry;) // postaviti put do mape s funkcijom kontrolera setPath ($ path) ($ path = trim ($ path, "/ \\"); $ path. = DS; // ako put ne postoji, signalizirajte ga ako (is_dir ( $ path) == false ) (dobaci novu iznimku ("Invalid controller path:` ". $ path." '");) $ this-> path = $ path;) // definicija kontrolera i radnje iz privatne funkcije url-a getController (& $ datoteka, & $ kontroler, & $ akcija, & $ args) ($ route = (prazno ($ _ GET ["route"]))? "": $ _GET ["route"]; poništeno ($ _ GET ["route"]); if (prazno ($ route)) ($ route = "index";) // Dobiti dijelove url-a $ route = trim ($ route, "/ \\"); $ dijelovi = eksplodirati ("/", $ route); // Pronađite kontroler $ cmd_path = $ this-> path; foreach ($ dijelovi kao $ dio) ($ fullpath = $ cmd_path. $ Part; // Provjerite postoji li mapa if (is_dir ($ fullpath)) ($ cmd_path. = $ dio DS; array_shift ($ dijelova); nastaviti; ) // Pronađite datoteku if (is_file ($ fullpath. ".Php")) ($ controller = $ part; array_shift ($ parts); break;)) // ako url ne navodi kontroler, tada upotrijebite zadani indeks if (prazan ($ kontroler)) ($ kontroler = "indeks";) // Dobiti akciju $ action = array_shift ($ dijelovi); if (prazno ($ akcija)) ($ akcija = "indeks";) $ datoteka = $ cmd_path. $ kontroler. ".php"; $ args = $ dijelovi; ) funkcija start () (// Parsiraj put $ this-> getController ($ datoteka, $ kontroler, $ akcija, $ args); // Provjerite postoji li datoteka, inače 404 if (is_readable ($ datoteka) == false) ) (die ("404 Not Found");) // Uključi datoteku include ($ datoteka); // Stvori instancu kontrolera $ class = "Controller_". $ Controller; $ kontroler = nova $ klasa ($ ovo -> registry); // Ako radnja ne postoji - 404 if (is_callable (niz ($ kontroler, $ akcija)) == false) (die ("404 Not Found");) // Izvrši radnju $ kontroler -> $ akcija (;))

Sada trebamo kreirati mape za pohranu kontrolera, predložaka i modela - u korijenu ćemo kreirati tri mape kontrolera, pogleda i modela. I napravimo neke testne datoteke /controllers/index.php, /views/index/index.php i /models/model_users.php, a sada popunite datoteke:
Za kontroler:

// klasa kontrolera Controller_Index proširuje Controller_Base (// predložak public $ layouts = "first_layouts"; // indeks funkcije akcije () ($ model = new Model_Users (); $ userInfo = $ model-> getUser (); $ this-> template-> vars ("userInfo", $ userInfo); $ this-> template-> view ("index");))

Za prikaz (/views/index/index.php)

Testni prikaz
iskaznica:
Ime:

I model:

// model Class Model_Users (javna funkcija getUser () (povratni niz ("id" => 1, "name" => "test_name");))

Kao što ste možda primijetili, klasa kontrolera nasljeđuje roditeljsku klasu Controller_Base. To je učinjeno kako bi se pojednostavila klasa kontrolera. Budući da još uvijek trebamo povezati klasu za rad s predlošcima, njena veza se premješta na Controller_Base.
Dat ću njegov kod, nalazi se u mapi / classes / i zove se controller_base.php:

// klasa apstraktnog kontrolera Abstract Class Controller_Base (zaštićeni $ registry; zaštićeni $ predložak; zaštićeni $ rasporedi; // predložak public $ vars = array (); // uključi predloške u funkciju konstruktora __construct ($ registry) ($ this-> registry = $ registry; // predlošci $ this-> template = new Template ($ this-> layouts, get_class ($ this));) indeks apstraktne funkcije ();)

Sada ostaje samo pozabaviti se predlošcima. U apstraktnoj klasi Controller_Base zovemo klasu Template i prosljeđujemo joj naziv predloška i ime kontrolera.
Kod klase Template, koji se nalazi ovdje / classes / i zove se template.php

// klasa za povezivanje predložaka i prosljeđivanje podataka na prikaz Class Template (privatni $ predložak; privatni $ kontroler; privatni $ rasporedi; privatni $ vars = array (); funkcija __construct ($ rasporedi, $ controllerName) ($ this-> layouts = $ rasporedi; $ arr = eksplodirati ("_", $ controllerName); $ this-> controller = strtolower ($ arr);) // postavljanje varijabli za prikaz funkcija vars ($ varname, $ vrijednost) (if (isset ( $ this-> vars [$ varname]) == true) (trigger_error ("Nije moguće postaviti var` ". $ varname." `. Već postavljeno, a prepisivanje nije dopušteno.", E_USER_NOTICE); vrati false;) $ this -> vars [$ varname] = $ vrijednost; vrati true;) // prikaz funkcije prikaza ($ ime) ($ pathLayout = SITE_PATH. "pregledi". DS. "izgledi". DS. $ this-> izgledi. ". php "; $ contentPage = SITE_PATH." pogledi ". DS. $ this-> kontroler. DS. $ name." .php "; if (file_exists ($ pathLayout) == false) (trigger_error (" Layout `". $ this-> izgledi. "'ne postoji.", E_USER_NOTICE); vrati false;) if (file_exists ($ contentPage) == false) (trigger_error ("Predložak` ". $ ime. "` ne postoji. ", E_USER_NOTICE); vratiti false; ) foreach ($ this-> vars kao $ ključ => $ vrijednost) ($$ ključ = $ vrijednost;) uključiti ($ pathLayout); ))

Ako ste pažljivo pročitali kod, vjerojatno ste shvatili da za prikazivanje na stranicama koristimo predložak first_layouts i index.php pogled (prikaz) - dao sam njegov kod malo iznad. Sve što nam je preostalo je stvoriti datoteku predloška first_layouts. Stavite ga u mapu /views/layouts/first_layouts.php
Predložak će sadržavati sljedeći kod:

Zaglavlje

podnožje

To je sve, ovim je dovršeno stvaranje "okvira". Sada imamo najjednostavniju strukturu temeljenu na MVC uzorku. U ovom članku se nisam doticao rada s bazom podataka, samo sam to spomenuo usput, budući da je članak već bio dugačak. Izravan rad s bazom podataka opisat ću u sljedećem članku.
Ovim je članak završen, izvore možete preuzeti u arhivi.

Uzorak Model-View-Controller (MVC), otkriven kasnih 1970-ih, uzorak je dizajna softverske arhitekture koji se usredotočuje na odvajanje funkcija podataka od njihove prezentacije. U teoriji, dobro osmišljena MVC aplikacija omogućit će front-end i back-end programerima da se ne miješaju u područja odgovornosti jedni drugih tijekom njihovog rada, odnosno front-end developer ne mora znati ništa o "kuhinji". “ njegovog back-end kolege i obrnuto.

Iako je izvorno dizajniran za razvoj desktop aplikacija, MVC je prilagođen današnjim potrebama i iznimno je popularan među web programerima jer je razdvajanje briga omogućilo stvaranje jasnijeg koda koji se može ponovno koristiti. MVC uzorak rezultira jasnim, modularnim sustavima koji programerima omogućuju vrlo brzo izmjene postojećeg koda.

U ovom članku ćemo vas provesti kroz osnove MVC-a, počevši od definiranja uzorka i nastavljajući s malim primjerom. Ovaj će članak prvenstveno biti koristan za one koji se nikada u životu nisu susreli s ovim obrascem, a također, moguće, i za one koji žele nadopuniti svoje znanje o MVC-u.

Razumijevanje MVC-a

Kao što je već spomenuto, naziv uzorka dolazi od kratice od tri riječi: Model Pogled i Kontrolor... Ukratko, princip uzorka može se ilustrirati jednim dijagramom (može se naći na Wikipediji):

Ovaj dijagram jasno pokazuje jednosmjerni tok informacija u obrascu, a također opisuje uloge svake komponente.

Model

Model se koristi za pristup i manipulaciju podacima. U većini slučajeva, model je ono što se koristi za pristup spremištu podataka (kao što je baza podataka). Model pruža sučelje za dohvaćanje, kreiranje, modificiranje i brisanje podataka iz pohrane. U kontekstu MVC uzorka, model posreduje između pogleda i kontrolera.

Iznimno važna značajka modela je da tehnički nema znanja o tome što se događa s podacima u kontroleru i prikazu. Model nikada ne smije postavljati niti očekivati ​​bilo kakve zahtjeve prema/od drugih komponenti uzorka.

Međutim, uvijek zapamtite da model nije samo pristupnik baze podataka ili drugog sustava koji ne radi ništa osim prosljeđivanja podataka naprijed-natrag. Model je poput pristupnika podataka. Model je u većini slučajeva najsloženiji dio sustava, dijelom zato što je sam model ljepilo za sve ostale dijelove.

Zastupanje

Pogled je mjesto gdje se podaci primljeni iz modela prikazuju u željenom obliku. U tradicionalnim web aplikacijama razvijenim s MVC uzorkom, pogled je dio sustava u kojem se generira HTML. Pogled je također odgovoran za primanje radnji od korisnika kako bi ih poslao kontroloru. Na primjer, pogled prikazuje gumb u korisničkom sučelju, a nakon klika na njega, poziva odgovarajuću radnju kontrolera.

Postoje neke zablude o svrsi prikaza, posebno među web programerima koji tek počinju graditi svoje aplikacije koristeći MVC. Jedno od najčešće kršenih pravila je da pogled ne bi trebao ni na koji način komunicirati s modelom, i sve podaci primljeni pregledom trebaju dolaziti samo od kontrolora... U praksi, programeri često zanemaruju ovaj koncept, koji je u srži MVC uzorka. Članak Fabija Cevasca ilustrira ovaj zbunjujući pristup MVC-u koristeći CakePHP, jedan od mnogih nestandardnih MVC okvira:

Iznimno je važno razumjeti da kako bi se dobila ispravna MVC arhitektura, ne bi trebalo biti izravnih interakcija između pogleda i modela. Sva logika razmjene podataka između njih mora biti implementirana u kontrolorima.

Osim toga, postoji uobičajena zabluda da je pogled samo datoteka predloška. Kao što je Tom Butler primijetio, ova zabluda ima ogromne razmjere zbog činjenice da mnogi programeri krivo razumiju MVC strukturu od samog početka, nakon čega to "znanje" počinju sipati dalje, masama početnika. U stvarnosti, pogled je puno više od običnog predloška, ​​međutim, mnogi okviri izgrađeni na temelju MVC obrasca toliko su iskrivili koncept pogleda da nikoga nije briga koliko su njihove aplikacije ispravne sa stajališta MVC uzorak.

Također je važno da pogled nikada ne radi s "čistim" podacima iz kontrolera, odnosno kontroler nikada ne radi s pogledom zaobilazeći model. U procesu interakcije između kontrolera i pogleda, model uvijek mora biti između njih.

Kontrolor

Kontroler je posljednji dio MVC grupe. Zadaća kontrolora je primanje podataka od korisnika i upravljanje modelom. Kontrolor je, i samo on, dio sustava koji komunicira s korisnikom.

Ukratko, kontroler se može opisati kao sakupljač informacija koji ih prenosi u model za obradu i pohranu. On ne bi trebao ništa raditi s podacima, već ih samo moći primiti od korisnika. Kontroler je povezan s jednim pogledom i jednim modelom, organizirajući tako jednosmjerni protok podataka, kontrolirajući ga u svakoj fazi.

Vrlo je važno zapamtiti da kontroler započinje svoj rad samo kao rezultat interakcije korisnika s pogledom, koji poziva odgovarajuću funkciju kontrolera. Najčešća pogreška među programerima je tretiranje kontrolera jednostavno kao pristupnika između pogleda i modela. Kao rezultat toga, kontroler je obdaren funkcijama koje bi pogled trebao obavljati (usput rečeno, otud dolazi ideja da je pogled samo datoteka predloška). Povrh toga, mnogi ljudi potpuno izbacuju svu logiku obrade podataka, zaboravljajući čemu je model namijenjen u MVC uzorku.

MVC u PHP-u

Predlažem da pokušate implementirati gore navedeno u malu aplikaciju. Započnimo stvaranjem klasa Model, View i Controller:

string = "MVC + PHP = Strašno!"; ))kontroler = $ kontroler; $ ovo->

". $ ovo-> model-> niz."

"; } } model = $ model; ))

Glavni razredi su spremni. Sada ih povežimo i pokrenimo našu aplikaciju:

izlaz ();

Kao što vidite, kontroler nema funkcionalnost jer korisnik ni na koji način ne komunicira s aplikacijom. Sve funkcionalnosti su smještene u prikaz, budući da je naša aplikacija isključivo za prikaz podataka.

Proširimo malo aplikaciju dodavanjem neke interaktivnosti da vidimo kako kontroler radi:

string = "MVC + PHP = Sjajno, kliknite ovdje!"; ))kontroler = $ kontroler; $ this-> model = $ model; ) izlaz javne funkcije () (povratak "

model-> niz. "

"; } } model = $ model; ) kliknuta javna funkcija () ($ this-> model-> string = "Ažurirani podaci, zahvaljujući MVC-u i PHP-u!"))

Konačno, ažurirajmo malo kod ljepila:

($ _GET ["radnja"]) (); ) echo $ pogled-> izlaz ();

Ishodi

U ovom kratkom članku pokrili smo osnovne koncepte MVC obrasca dizajna i razvili jednostavnu aplikaciju temeljenu na njemu, iako smo, naravno, još uvijek jako daleko od korištenja u stvarnom životu. U sljedećem članku pogledat ćemo glavne poteškoće s kojima ćete se suočiti ako ste više usredotočeni na izgradnju arhitekture aplikacije temeljene na MVC uzorku. Ostanite s nama!

U ovom vodiču naučit ćete kako izgraditi jednostavan sustav arhitekture MVC (Model-View-Controller) u PHP-u 5.1 koristeći mogućnosti biblioteke SPL (Standard PHP Library).

Uvod

Dobrodošli u prvi cjeloviti vodič za PHP 5. Trebat će vam PHP 5.1 s instaliranim SPL-om jer ćemo koristiti neke od najnovijih značajki PHP 5.

U ovom vodiču pokazat ću vam kako izgraditi jednostavan MVC sustav (MVC arhitektura je najčešći obrazac dizajna za velike web aplikacije). Provest ću vas kroz sve korake od početka do kraja stvaranja cjelovitog MVC sustava.

Jedna ulazna točka

Jedna od važnih stvari o MVC-u je jedna ulazna točka u aplikaciju umjesto hrpe PHP datoteka koje rade nešto poput ovoga:

Imat ćemo jednu datoteku za obradu svih zahtjeva. To znači da ne moramo brinuti o povezivanju global.php svaki put kada trebamo stvoriti novu stranicu. Ova "jedinstvena ulazna točka" će se zvati index.php i za sada će biti:

Kao što vidite, ova skripta još ne radi ništa, ali pričekajte malo.

Za usmjeravanje svih zahtjeva na početnu stranicu, koristit ćemo mod_rewrite i postaviti direktivu RewriteRule u .htaccess. Zalijepimo sljedeći kod u .htaccess datoteku i spremimo je u isti direktorij kao index.php:

RewriteEngine na RewriteCond% (REQUEST_FILENAME)! -F RewriteCond% (REQUEST_FILENAME)! -D RewriteRule ^ (. *) $ Index.php? Route = $ 1

Prvo provjeravamo postoji li tražena datoteka pomoću direktive RewriteCond, a ako ne, onda preusmjeravamo zahtjev na index.php. Ova provjera postojanja datoteke je neophodna, jer će u protivnom index.php pokušati obraditi sve zahtjeve prema stranici, uključujući zahtjeve za slike. A ovo nam jednostavno ne treba.

Ako ne možete koristiti .htaccess ili mod_rewrite, morat ćete ručno adresirati sve zahtjeve na index.php. Drugim riječima, sve veze trebaju biti u obliku "index.php? Route = [zahtjev ide ovdje]". Na primjer, "index.php? Route = chat / index".

Sada kada svi zahtjevi prolaze kroz istu ulaznu točku, možemo početi pisati skriptu index.php. Prvo što trebamo učiniti je inicijalizirati sustav. Kreirajmo direktorij include, a u njemu datoteku startup.php (imat ćemo je kao datoteku za inicijalizaciju). Zalijepimo sljedeći kod u index.php:

U ovom primjeru deklariramo neku konstantu, saznajemo gdje se nalaze sistemske datoteke i također provjeravamo je li verzija PHP-a, pa, barem 5.1.

Sljedeće što treba učiniti je Registry objekt za pohranu globalnih vrijednosti. Bit će proslijeđen zasebnim objektima u sustavu i korišten za pristup globalnim vrijednostima, bez potrebe za označavanjem varijabli kao "globalnih" ili pristupom nizu $GLOBALS. Pogledajte članak "Korištenje globalnih vrijednosti u PHP-u" za više informacija o objektu registra.

Dodajte sljedeći kod u svoju startup.php datoteku nakon prethodnog primjera:

$ registry = novi registar;

Ako sada pokušate pokrenuti sustav, možete vidjeti sljedeću pogrešku:

Fatalna pogreška: Klasa "Registry" nije pronađena u g: \ Projects \ PHP \ content \ simple mvc php5 \ demo \ uključuje \ startup.php on line 12

To, naravno, nije veliko iznenađenje za nas, budući da još nismo napisali samu klasu Registry. Datoteka s klasom može se jednostavno uključiti pomoću funkcije include () (napomena: usput, include () nije takva funkcija, ali ipak jezični izraz, kontrolna struktura, ako pogledate priručnik), ali upotrijebimo jednu od novih značajki u PHP-u 5: __autoload ().

Čarobna funkcija __autoload () koristi se za dinamičko učitavanje klasa. Kada PHP otkrije nepostojeću klasu, prvo poziva funkciju __autoload () i tek onda ispušta pogrešku. Možemo iskoristiti ovu priliku za učitavanje nastave u hodu.

Zalijepite ovaj kod prije koda iz prethodnog primjera:

// Učitaj klase u pokretu funkcija __autoload ($ class_name) ($ filename = strtolower ($ class_name). ".Php"; $ file = site_path. "Classes". DIRSEP. $ Filename; if (file_exists ($ file) = = false) (vrati false;) uključiti ($ datoteku);)

Naša funkcija __autoload () uzima ime klase koje joj je proslijeđeno kao argument i provjerava postoji li datoteka sa sličnim imenom u direktoriju klase. Ako nema datoteke, funkcija će jednostavno vratiti false i pojavit će se fatalna pogreška. Ali ako datoteka postoji, bit će učitana. Oni. potrebna klasa će biti deklarirana i neće biti greške.

Još nismo stvorili samu klasu Registry, tako da će se pogreška i dalje pojaviti. Prijeđimo na to.

Kreiranje klase Registry

Klasa Registry se koristi za prosljeđivanje globalnih vrijednosti između pojedinačnih objekata. To je zapravo prilično jednostavna klasa koja treba implementirati nekoliko malih metoda.

Prvo, napravimo direktorij klasa i datoteku registry.php u njemu. Zalijepimo sljedeći kod u registry.php:

Sada imamo "kostur" klase Registry i moramo ga učitati metodama. Napišimo 2 metode: set () za postavljanje vrijednosti i get () za dobivanje vrijednosti. Također možete napisati metodu remove () za uklanjanje vrijednosti. Dodajmo ove metode klasi Registry:

Skup funkcija ($ ključ, $ var) (if (isset ($ this-> vars [$ ključ]) == true) (dobaci novi izuzetak ("Nije moguće postaviti var` ". $ ključ." `. Već postavljeno. ");) $ this-> vars [$ ključ] = $ var; vrati true;) funkcija get ($ ključ) (if (isset ($ this-> vars [$ ključ]) == false) (vrati null; ) vrati $ this-> vars [$ ključ];) funkcija remove ($ var) (poništi ($ this-> vars [$ ključ]);)?>

Ove metode su jednostavne, postavljaju, dobivaju i uklanjaju elemente iz niza $ vars, koji je atribut klase. U metodi set () također provjeravamo postoji li vrijednost s navedenim ključem, a ako postoji, onda izbacujemo iznimku. Ovo je kako bi se izbjeglo slučajno prepisivanje vrijednosti.

Sada imamo kompletnu klasu Registry, ali na tome se nećemo zadržavati. Upotrijebimo jednu od značajki SPL biblioteke: ArrayAccess. SPL (skraćenica od Standard PHP Library) je zbirka sučelja i klasa dizajniranih za rješavanje uobičajenih problema. Jedno od SPL sučelja, ArrayAccess, može se koristiti za pružanje pristupa objektu poput običnog niza. Pogledajmo ovakav primjer:

set ("ime", "Dennis Pallett"); // Dobivanje vrijednosti pomoću get () echo $ registry-> get ("name"); // Dobivanje vrijednosti koristeći pristup nizu echo $ registry ["name"]?>

Trik je u tome što $ registry postaje poput niza, a zapravo je objekt. Naravno, ArrayAccess ne pruža nikakve posebne prednosti, ali vam omogućuje da smanjite količinu koda, budući da ne morate svaki put pisati "-> get ()". Da biste koristili ovo sučelje, morate popraviti prvi redak klase ("Class Registry") na sljedeći način:

Registar klasa implementira ArrayAccess (

Ključna riječ Implements govori tumaču da je ovo klasa u kojoj implementiramo sučelje, što je ArrayAccess.

Klasa koja implementira sučelje ArrayAccess mora imati sljedeće metode:

Funkcija offsetExists ($ offset) (povratak isset ($ this-> vars [$ offset]);) funkcija offsetGet ($ offset) (povratak $ this-> get ($ offset);) funkcija offsetSet ($ offset, $ vrijednost) ($ this-> set ($ offset, $ value);) funkcija offsetUnset ($ offset) (unset ($ this-> vars [$ offset]);)

Ove metode trebale bi biti jasne. Više informacija možete pronaći u SPL dokumentaciji.

Sada kada smo implementirali sučelje ArrayAccess, možemo pristupiti objektu kao da je običan niz. To je jasno prikazano, kako u prethodnom tako iu ovom primjeru:

dobiti ("ime"); // Dobivanje vrijednosti koristeći pristup nizu echo $ registry ["name"]?>

Klasa Registry je sada završena i ako pokušate pokrenuti sustav, sve bi trebalo raditi (iako se još ništa neće ispisati). Završili smo s inicijalizacijskom datotekom i možemo prijeći na sljedeći korak u pisanju našeg MVC sustava: implementacija pristupa bazi podataka, koji se u MVC arhitekturi naziva “Model”.

Model

"M" ili model je dio MVC sustava koji je odgovoran za ispitivanje baze podataka (ili drugog vanjskog izvora) i pružanje informacija kontroloru. Bilo bi moguće učitati traženi model ovisno o zahtjevu, ali ja radije malo brišem granice između modela i kontrolera upravo u ovom trenutku, t.j. kontroler radi s bazom podataka izravno kroz knjižnicu interakcije baze podataka, a ne kroz zasebni model. Možda želite drugačije, to je stvar ukusa.

Moramo napisati kod potreban za uspostavljanje veze s bazom podataka i staviti ga u index.php. Postoji mnogo sjajnih knjižnica za rad s bazama podataka (uključujući moju, AutoCRUD), ali PHP 5 već ima takvu biblioteku - PDO. Stoga nema potrebe koristiti bilo koji drugi.

Ubacimo sljedeći kod u datoteku index.php (nakon povezivanja inicijalizacijske datoteke):

# Povežite se s bazom podataka $ db = novi PDO ("mysql: host = localhost; dbname = demo", "", ""); $ registry-> set ("db", $db);

U ovom primjeru prvo stvaramo novu instancu PDO biblioteke i povezujemo se s našom MySQL bazom podataka. Zatim činimo varijablu $ db globalno dostupnom koristeći našu klasu Registry.

Komponenta modela našeg sustava je spremna, pa prijeđimo na pisanje kontrolera.

Pisanje kontrolera također znači pisanje klase Router koja je odgovorna za učitavanje željenog kontrolera ovisno o zahtjevu (zapamtite, u index.php, varijabla rute $ se prosljeđuje kroz URL).

Klasa usmjerivača

Klasa usmjerivača će analizirati zahtjev i zatim učitati potrebni kontroler. Napravimo "kostur" klase:

registar = $ registar; ))?>

Zatim dodajte sljedeće retke u index.php:

# Učitaj usmjerivač $ router = novi usmjerivač ($ registar); $ registry-> set ("usmjerivač", $ router);

Prva stvar koju ćemo napisati je metoda setPath () za postavljanje direktorija u kojem će se nalaziti svi naši kontroleri. Metoda izgleda ovako i treba je dodati klasi Router:

Funkcija setPath ($ path) ($ path = trim ($ path, "/ \\"); $ path. = DIRSEP; if (is_dir ($ path) == false) (dobaci novu iznimku ("Nevažeći put kontrolera:` ". $ path." `");) $ this-> path = $ path;)

Zatim dodajte sljedeće retke u index.php:

$ router-> setPath (site_path. "kontrolori");

Sada kada smo postavili put do naših kontrolera, napisat ćemo samu metodu odgovornu za učitavanje kontrolera. Ova metoda će se zvati delegate () i analizirat će zahtjev. Prvi dio ove metode je sljedeći:

Delegat funkcije () (// Parsiraj put $ this-> getController ($ datoteka, $ kontroler, $ akcija, $ args);

Kao što možete vidjeti, koristi drugu metodu, getController (), da dobije naziv kontrolera i nekoliko drugih varijabli. Ova metoda izgleda ovako:

Privatna funkcija getController (& $ datoteka, & $ kontroler, & $ akcija, & $ args) ($ route = (prazno ($ _ GET ["route"]))? "": $ _GET ["route"]; ako (prazno ($ route)) ($ route = "index";) // Dobiti podijeljene dijelove $ route = trim ($ route, "/ \\"); $ dijelovi = eksplodirati ("/", $ route); // Pronađite ispravan kontroler $ cmd_path = $ this-> path; foreach ($ dijelovi kao $ dio) ($ fullpath = $ cmd_path. $ Part; // Postoji li mapa s ovom stazom? If (is_dir ($ fullpath) ) ($ cmd_path . = $ part. DIRSEP; array_shift ($ dijelovi); nastavak;) // Pronađite datoteku if (is_file ($ fullpath. ".php")) ($ kontroler = $ dio; array_shift ($ dijelovi) ; break;)) if (prazno ($ kontroler)) ($ controller = "index";); // Dobiti radnju $ action = array_shift ($ dijelova); if (prazno ($ akcija)) ($ action = " index";) $ datoteka = $ cmd_path. $ kontroler. ".php"; $ args = $ dijelovi;)

Idemo preko ove metode. Prvo uzima vrijednost varijable rute $ iz zahtjeva, a zatim je rastavlja na dijelove pomoću funkcije explode (). Na primjer, zahtjev "članovi / pregled" bi se pretvorio u niz poput ovog: niz ('članovi', 'pogled').

Zatim prolazi kroz svaki dio koristeći foreach petlju i provjerava je li taj dio direktorij. Ako jest, onda ga prilaže putu do datoteke i provjerava sljedeći dio. To vam omogućuje da stavite kontrolere u poddirektorije i tako dobijete hijerarhiju kontrolera. Ako trenutni dio zahtjeva nije direktorij, već datoteka, on se sprema u varijablu $ kontrolera i izlazimo iz petlje jer je pronađen kontroler koji nam je potreban.

Nakon petlje provjeravamo varijablu s nazivom kontrolera. Ako je prazan, tada koristimo "indeks" kontroler, koji će biti naš zadani kontroler. Metoda tada određuje radnju koju treba poduzeti. Kontroler je klasa koja se sastoji od nekoliko metoda. Radnja ukazuje na određenu metodu. Ako nije navedena radnja, koristit ćemo "indeks" - zadanu radnju.

Konačno, dobivamo puni put do datoteke kontrolera spajanjem tri varijable: staze, naziva kontrolera i ekstenzije "php".

Sada kada smo analizirali zahtjev, vrijeme je da pozovemo metodu delegate () da učitamo kontroler i izvršimo radnju. Kompletna metoda delegata () izgleda ovako:

Delegat funkcije () (// Parsirajte put $ this-> getController ($ datoteka, $ kontroler, $ akcija, $ args); // Je li datoteka dostupna? Ako je (is_readable ($ datoteka) == false) (umri ( "404 Not Found ");) // Uključi datoteku uključuje ($ datoteku); // Stvori instancu kontrolera $ class =" Controller_ ". $ Controller; $ kontroler = nova $ klasa ($ this-> registry) ; // Je li akcija dostupna? If (is_callable (niz ($ controller, $ action)) == false) (die ("404 Not Found");) // Izvrši akciju $ controller -> $ action (); )

Nakon analize zahtjeva metodom getController () provjeravamo postoji li datoteka, a ako ne, vraćamo jednostavnu poruku o pogrešci.

Nakon toga povezujemo datoteku s kontrolerom i stvaramo instancu njegove klase, koja bi se trebala zvati "Controller_ [name]". Kasnije ćemo detaljnije govoriti o kontrolerima.

Zatim provjeravamo postoji li navedena radnja (tj. metoda) i je li je moguće pozvati (za to koristimo funkciju is_callable ()). Konačno, izvodimo samu radnju, koja je uloga klase Router i završava.

Sada kada smo napisali cijelu metodu delegate (), dodajte sljedeći redak našoj index.php datoteci:

$ usmjerivač-> delegat ();

Ako sada pokušamo pokrenuti sustav, vidjet ćemo sljedeću pogrešku (naravno, ako direktorij kontrolera još ne postoji):

Fatalna pogreška: Neuhvaćena iznimka "Iznimka" s porukom "Nevažeći put kontrolera:` g: \ Projekti \ PHP \ sadržaj \ simple mvc php5 \ demo \ kontroleri \ `" u g: \ Projekti \ PHPit \ content \ simple mvc php5 \ demo \ classes \ router.php: 18 Praćenje steka: # 0 g: \ Projekti \ PHP \ content \ simple mvc php5 \ demo \ index.php (13): Router-> setPath ("g: \ Projekti \ PHP ... ") # 1 (glavni) ubačen u g: \ Projects \ PHP \ content \ simple mvc php5 \ demo \ classes \ router.php on line 18

Ili ćemo vidjeti pogrešku "404 Not Found" jer još nema kontrolera. Ali ovo je ono što ćemo sada učiniti.

Kontrolor

Kontroleri u našem MVC sustavu bit će prilično jednostavni i trebat će vrlo malo vremena. Prvo provjerite postoji li direktorij kontrolera. Kreirajmo datoteku controller_base.php u direktoriju classes i zalijepimo sljedeći kod u nju:

registar = $ registar; ) indeks apstraktne funkcije (); )?>

Ova apstraktna klasa bit će roditeljska klasa za sve naše kontrolere. Učinit će samo dvije stvari: zadržati lokalnu kopiju klase Registry i koristiti metodu apstraktnog indeksa () kako bi prisilio sve kontrolere djece da implementiraju ovu metodu.

Napišimo naš prvi kontroler. Kreirajmo datoteku index.php u direktoriju kontrolera i zalijepimo sljedeći kod u nju:

Upravo smo kreirali naš prvi kontroler, a ako pokušate pokrenuti sustav, možete vidjeti sljedeće:

To znači da je klasa Router obavila svoj posao i pokrenula potrebnu akciju od potrebnog kontrolera. Napišimo još jedan kontroler koji odgovara zahtjevu "članovi / pregled". Kreirajmo datoteku members.php u direktoriju kontrolera i umetnimo sljedeći kod u nju:

Sada idemo na naš MVC sustav na zahtjev "members / view" ili "index.php? Route = members / view". Trebali bismo vidjeti ovakav rezultat:

Samo pisanjem novog kontrolera i dodavanjem metode na njega, uspjeli smo stvoriti novu stranicu, a u samom sustavu ništa nije trebalo mijenjati. Također, naši kontroleri ne moraju uključivati ​​global.php datoteku ili nešto slično.

Sada kada imamo svoje kontrolere, preostaje samo jedna stvar: "V" ili "View".

Prikaz

Kao i kod modela, postoji nekoliko različitih opcija za stvaranje View komponente u MVC sustavu. Mogli bismo naučiti klasu Router da automatski učitava drugu datoteku pod nazivom nešto poput "view_ (name) .php". Ali da bi vodič bio jasniji, napišimo klasu Template koja će upravljati prikazivanjem predložaka.

Prvo stvorite datoteku template.php u direktoriju classes i zalijepite sljedeći kod u nju:

registar = $ registar; ))?>

Sada imamo glavnu strukturu za našu klasu Template. Sljedeći korak je dodavanje ovog koda u našu datoteku index.php, neposredno prije redaka povezanih s klasom Router:

# Kreirajte objekt predloška $ template = new Template ($ registry); $ registry-> set ("template", $ template);

Budući da trebamo koristiti vrijednosti iz modela i kontrolera, napisat ćemo set () metodu za postavljanje varijabli dostupnih u predlošcima. Pogledajmo primjer:

Skup funkcija ($ varname, $ value, $ overwrite = false) (if (isset ($ this-> vars [$ varname]) == true I $ overwrite == false) (trigger_error ("Nije moguće postaviti var` ". $ varname. "'. Već postavljeno, i prepisivanje nije dopušteno.", E_USER_NOTICE); vrati false;) $ this-> vars [$ varname] = $ vrijednost; vrati true;) funkcija uklanjanje ($ varname) (poništeno ($ this-> vars [$ varname]); vrati true;)

Metode set () i remove () prilično su jednostavne i koriste se za postavljanje i uklanjanje varijabli.

Počnimo pisati show () metodu koja će prikazati predloške. Najjednostavniji način je stvoriti poseban direktorij predložaka za pohranu svih datoteka predložaka i koristiti include () za renderiranje predloška. Naravno, vaša vlastita metoda show () može biti potpuno drugačija i učitavati predloške iz baze podataka ili raditi nešto drugo. Pogledajmo kuso

Glasova: 745 | Pregledi: 8080

Unatoč činjenici da bi vam značenje izraza "arhitektura stranice" moglo biti intuitivno, pokušajmo proučiti niz definicija u vlasništvu renomiranih izvora.

Arhitektura- to je osnovna organizacija sustava, utjelovljena u njegovim komponentama, njihovim međusobnim odnosima i s okolinom, kao i principima koji određuju dizajn i razvoj sustava.

Arhitektura program ili računalni sustav je struktura ili strukture sustava koji uključuju elemente programa, svojstva tih elemenata vidljivih izvana i odnos između njih [bas].

Arhitektura je struktura organizacije i povezano ponašanje sustava. Arhitektura se može rekurzivno rastaviti na dijelove koji međusobno djeluju kroz sučelja, odnose koji povezuju dijelove i uvjete sastavljanja za dijelove. Dijelovi koji međusobno djeluju putem sučelja uključuju klase, komponente i podsustave.

Arhitektura Softverski sustav ili skup sustava sastoji se od svih važnih dizajnerskih odluka o strukturama programa i interakcijama između tih struktura koje čine sustav. Odluke o dizajnu pružaju željeni skup svojstava koje sustav mora podržavati da bi bio uspješan. Dizajnerska rješenja pružaju konceptualni okvir za projektiranje, podršku i održavanje sustava.

Dakle, što je arhitektura programa?

Definicije dane u prethodnom odjeljku su suviše suhe za njihovu percepciju od strane nepripremljenog čitatelja. Pokušat ćemo što jednostavnije objasniti bit.

Kada program postane dovoljno velik, programer ga dijeli u više datoteka. Ako ne razmišljate o izolaciji grupa sličnih funkcija i stavljanju u zasebne module, takva podjela neće biti od male koristi. Kôd se neće moći ponovno koristiti i bit će teško navigirati. Program će biti teško proširiti i modificirati.

Stoga se postavlja prvo pitanje: kako podijeliti program u datoteke. Datotečna arhitektura programa jedan je aspekt njegove strukture.

Ističući module sustava, potrebno je razumjeti u kakvom će međusobnom odnosu biti. Primjerice, moduli za pristup bazi podataka i obradu grafičkih slika jedva da moraju znati išta o postojanju jedni drugih. Ali UI modul će znati za njih oboje (a neće).

Odnos između komponenti sustava također je određen njegovom arhitekturom.

Općenito, sve značajne odluke usmjerene na organizaciju programa, a ne na probleme koji se rješavaju uz njegovu pomoć, mogu se pripisati arhitekturi.

Razine apstrakcije

Prilikom projektiranja modula (odabir grupa funkcija i njihova distribucija među datotekama u slučaju proceduralnog pristupa), važno je odabrati apstrakcije i pokušati ih dekomponirati na nekoliko razina.

Moduli niske razine su što autonomniji, ne ovise o drugim dijelovima programa. Dobro osmišljeni moduli izoliraju "vanjski svijet" od zamršenosti zadatka. Pozivatelj poznaje samo sučelje modula (vanjske funkcije), unutarnji dio mu je zatvoren.

Uzmimo za primjer galeriju fotografija. Podaci o slikama i korisnicima pohranjeni su u bazi podataka, korisničko sučelje je podijeljeno na klijentski dio i admin panel.

Struktura programa mogla bi biti kao što je prikazano na donjoj slici:


Ovaj primjer prati tri razine apstrakcije.

Svaki program namijenjen ljudskoj upotrebi može se podijeliti na najmanje dvije razine: korisničko sučelje i model. Modul korisničkog sučelja dizajniran je za predstavljanje i vizualizaciju podataka, te za obradu reakcija korisnika. Model sadrži logiku problema koji se rješava i ne bi trebao ni na koji način ovisiti o načinu na koji su podaci prikazani. Model bi trebao biti lako prenosiv između različitih vrsta korisničkog sučelja.

MVC arhitektura

Popularno sada MVC uzorak dizajna... Služi za odvajanje logike aplikacije od korisničkog sučelja. Ali prvo, razjasnimo što je uzorak dizajna.

Ovo je skup tipičnih dizajnerskih rješenja, okvir arhitekture ili njezin fragment. Ako je knjižnica paket koda za višekratnu upotrebu, tada je uzorak dizajna paket rješenja za višekratnu upotrebu.

Dakle, što nam MVC nudi da odvojimo logiku aplikacije od korisničkog sučelja?

Uzorak MVC vam omogućuje razdvajanje podatke, prezentaciju i obradu radnji korisnika u tri odvojene komponente:

  1. Model... Model pruža podatke (obično za Pogled) i također odgovara na zahtjeve (obično od Kontrolora) promjenom svog stanja;
  2. Pogled... Odgovoran za prikaz informacija (korisničko sučelje);
  3. Kontrolor... Tumači korisnički unos i informira model i pogled o potrebi za odgovarajućim odgovorom.

Slika ispod prikazuje odnose između komponenti žičanog okvira. Ilustrirajmo sliku malim primjerom.


Zamislite obrazac u koji možete unijeti tekst, kliknite gumb Uredi i dobijete njegovu transliteraciju:


Ponovimo korake prikazane na dijagramu:

  1. Korisnik klikne gumb Uredi i Zastupanje(Prikaz) šalje poruku Kontrolor(Kontroler): "Naredba: uredi"
  2. Kontrolor prihvaća poruku i pristupa modelu pozivanjem metode Edit ().
  3. Kao rezultat promjene modela njegovo stanje (transliterirani tekst pohranjen u njemu) i obavještava pogled o tome: "Događaj: promijenjen".
  4. Podnošenje traje signal i upućuje na model za novu vrijednost rezultata pozivanjem metode Get ().

MVC implementacija

MVC implementacija pretpostavlja objektno orijentirani pristup (OOP). Međutim, uzorak dizajna samo je zbirka rješenja. Prilagodimo ih za PHP bez korištenja OOP-a. Pojednostavljenje je učinjeno kako bi se koncentriralo na bit odvajanja logike, a također i kako bi gradivo mogao primijeniti čitatelj koji nije upoznat s OOP-om.

Razmislite ponovno primjer s galerijom fotografija.
Ima dva načina prikaza:

  1. Način prikaza sličica (sve odjednom);
  2. Način prikaza fotografija u punoj veličini (jedna).

Postoji i mogućnost prenijeti fotografije na poslužitelj. Dodatno ćemo implementirati podršku za vrste vizualizacije kako bismo cijenili fleksibilnost okvira.

Stranica će dvije ulazne točke:

  1. index.php (pogledaj galeriju);
  2. photo.php (pogledajte fotografiju u punoj veličini).
Ove dvije datoteke će se uzeti u obzir Kontrolori.

Kao Modeli postojat će modul koji omogućuje rad sa pohranom slika. nazovimo to galerija.php i stavi u mapu model.

U ulozi Zastupanje HTML predlošci će biti predstavljeni, oni će se nalaziti u mapi predlošci... Što su šabloni i čemu služe - vidjet ćemo dalje.

Stranice za prikaz galerije i fotografije imat će zajedničko zaglavlje i podnožje, samo će se središnji dio razlikovati.

Prikaz galerije imat će dvije vrste vizualizacija:

  1. Kao tablica (zadano);
  2. Prikaz popisa.
Potrebna su nam četiri šablona:
  1. main.php (kostur stranice);
  2. content_index_table.php (tabelarni prikaz sadržaja galerije);
  3. content_index_list.php (popisni prikaz sadržaja galerije);
  4. content_photo.php (sadržaj stranice za pregled fotografija).

Ispada sljedeća struktura stranice:


Struktura datoteke podijeljena je s dvije vodoravne linije koje čine tri dijela. Datoteke u gornjem dijelu odnose se na Model, datoteke u srednjem dijelu na Pogled, datoteke u donjem dijelu na Controller.

Model

Krenimo od implementacije Modela. Kôd u nastavku nije u potpunosti dat radi minimiziranja i bolje jasnoće primjera.

Definirali smo samo sučelje modela, a implementacija je preskočena. Međutim, za primjer implementacije MVC okvira, on uopće nije potreban.

Zastupanje

Pogledajmo sada šablone. Počnimo s općim kosturom stranice:

<?=$title?>

Ne bi vas trebala zbuniti činjenica da predložak koristi neki nepoznati izvor varijabli $ title i $ content. Njih će zamijeniti Kontrolor. Ali više o tome kasnije.

je skraćena oznaka .

Zgodno ga je koristiti u predlošcima. Također je prikladnije koristiti alternativne varijante pisanja konstrukcija if-else, foreach, for, while u predlošcima. izgledaju ovako:

ako (<условие>): <тело>završi ako; za svakoga (<инициализация цикла>): <тело>endforeach;

Ostali predlošci bit će umetnuti u main.php na ovaj način:

U primjerima ispod prikazan je njihov kod:

Predlošci / content_index_table.php

stol| Popis

"> " />



Predlošci / content_index_list.php

Tablica | Popis

"> " />



predlošci / content_photo.php: Natrag

" />

Kontrolor

Na kraju, skupimo sve zajedno opisujući naša dva Controllera. Njihov zadatak je obraditi zahtjev, odabrati predložak i zamijeniti podatke koje predložak zahtijeva. Podaci se u pravilu uzimaju iz modela.

Kontroler galerije prenosi fotografiju ako je korisnik prenio datoteku. Inače, iz modela izdvaja popis fotografija, odabire željeni predložak (ovisno o želji korisnika) i prikazuje ovaj predložak, prosljeđujući mu popis fotografija:

Index.php kod

Kontroler za pregled fotografija još je jednostavniji:

Photo.php kod

Konačno

Pokušajte posvetiti dovoljno pažnje arhitekturi svoje aplikacije. Ako u početku stvorite snažan i proširiv okvir, trud će se isplatiti stostruko.

Za implementaciju MVC modela, bolje je odabrati objektno orijentirani pristup .

Postoji mnogo gotovih okvirnih rješenja, na primjer u Zend Frameworku. Međutim, informacije u trenutnoj lekciji dovoljne su za razumijevanje MVC arhitektonskih rješenja i početak njihove upotrebe.

Što je MVC?

Dakle, MVC se odnosi na korisničko sučelje (UI). Ne nužno grafički, glasovno upravljanje također je u redu. Ne zaboravimo da program možda nema korisničko sučelje, može imati programsko sučelje (API), ili ga uopće nema, a ipak biti koristan.

Ali ako imamo korisnika, onda mora postojati i korisničko sučelje. Što je sučelje? Ovo je susjedna granica između dva sustava. U našem slučaju: s jedne strane - program, s druge - korisnik. Evo ih.

Program je potpuno apstraktan, bilo koji predmetni kod. Ona zna napraviti nešto korisno, a korisnik ima potrebe koje može zadovoljiti ovim programom. Tada se pojavljuju dijelovi logike koji "znaju" kako, koristeći ovaj program, izravno raditi ono što korisnik želi. Komadi nisu predmet, predmetna logika u programu. Više se odnose na korisnika s njegovim specifičnim potrebama, a predstavljaju kombinacije poziva i poziva u program.

Slučajevi korištenja

Kao primjer, zamislite terminal za trgovanje na burzi. Korisnik terminala postavlja aplikaciju u kojoj navodi da želi kupiti 20 dionica tvrtke Svetlyi put po cijeni od 1500 RUB po dionici. Također ukazuje da aplikacija vrijedi četiri sata, te s kojeg njegovog računa treba teretiti novac, u slučaju uspješne transakcije.

Opipljiv broj atributa. Prođe neko vrijeme i on shvaća da se neće moći kupiti po takvoj cijeni i spreman je podići cijenu na 1550 rubalja, ostavljajući sve ostale vrijednosti. Zatim odabere ovu aplikaciju, klikne gumb "promijeni", naznači novu cijenu, da. Udoban je.

Ali redoslijed se ne može mijenjati na burzi, ne postoji takav koncept u predmetnom području. Prijavu je moguće samo postaviti i otkazati. Kako bi korisniku omogućili promjenu aplikacije u jednom kliku, potrebno je zapamtiti stare vrijednosti, otkazati aplikaciju, dati na uređivanje ono što je zapamtio i poslati novu prijavu. Takva kombinacija. Ali korisniku to izgleda kao jedna jednostavna radnja: promjena ulaznice. To se zove slučaj upotrebe.

Dopunimo naš dijagram mjestom za slučajeve upotrebe.

Korisniku također treba dati priliku da izvuče ove slučajeve upotrebe i dobije rezultat. To mogu biti gumbi i drugi grafički ulazno-izlazni elementi, geste, prepoznavanje i sinteza govora. Bilo koja opcija za razmjenu podataka i naredbi. voila:

Korisnik povlači neke od slučajeva korištenja, što zauzvrat manipulira programom. Program objavljuje rezultat ili promjene u njegovom stanju.

Pa gdje je svejedno MVC?

Sve što je preostalo je dati poznata imena rezultirajućim komponentama.

Kad model objavi izmjene, ne zanima ga za koga, ne zna ništa o Viewu. Umjesto ili zajedno s View, na drugom kraju može postojati drugi podsustav.

Sada nekoliko detalja.

Bila je to klasična MVC varijanta – Active Model. Također se događa da model ne obavještava o promjenama. Tada tu odgovornost preuzima kontrolor. On zna kakve manipulacije izvodi na modelu i očito zna kakve promjene u stanju modela mogu uslijediti. Ovo je pasivni model.

I jedan trenutak. Podjela koda na subjekt i nesubjekt je uvjetna i ovisi o tome koliko pedantno želimo modelirati predmetno područje. Ponekad je racionalna odluka uključiti neki slučaj upotrebe u model. Možda će to smanjiti količinu koda općenito i pojednostaviti ga.

Za materijal zahvaljujemo našem pretplatniku Stanislavu Iljičevu

Vrhunski povezani članci