Kako podesiti pametne telefone i računare. Informativni portal

Šta je MVC obrazac dizajna u Javi? MVC: šta je to i kakve veze ima sa korisničkim interfejsom.

U ovom članku ćemo napisati „okvir“ našeg projekta. Pod riječju “framework” mislim na radni kod koji će biti baziran na MVC pristupu, odnosno imat će jasnu podelu logike na kontrolere, akcije, šablone (poglede) i modele.

I tako da počnemo, kao što sam već napisao u prethodnom članku, MVC obrazac podrazumijeva jednu ulaznu tačku - index.php, svi zahtjevi će proći kroz ovu skriptu, sva projektna logika će raditi kroz nju. Za implementaciju ovog pristupa potrebno je konfigurisati server, pretpostavlja se da sajt radi na Apache serveru, tako da samo treba da kreiramo .htaccess fajl u kome ćemo specificirati pravila rutiranja URL-a. Pored određivanja ulazne tačke, rutiranje vam omogućava da kreirate CNC (ljudski čitljive URL-ove). Odnosno, nakon odgovarajuće konfiguracije, adrese stranica će izgledati ovako: site.ru/article/new.
Prvo, napravimo .htaccess, koji će preusmjeriti obradu svih stranica na index.php skriptu. Kod izgleda ovako:

RewriteEngine na RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule ^(.*)$ index.php?route=$1

Datoteka .htaccess mora biti locirana u root folderu stranice i morate odmah kreirati index.php skriptu, koja je ulazna tačka. Napišimo jedan red u index.php da testiramo preusmjeravanje:

Echo "test";

Sada možete provjeriti preusmjeravanje, uneti bilo koju adresu i vidjeti što se događa: test-mvc.web/sdf/sdf/ ili test-mvc.web/sdf/sdf/2342/nije bitno, u svakom slučaju, “ Testiraj ". Ako ste vidjeli ovaj natpis, to znači da smo uspjeli.
Nastavimo, radi pogodnosti, napravimo config.php datoteku u korijenu stranice, u kojoj ćemo postaviti razne konstante koje će olakšati konfiguraciju stranice. To mogu biti različite staze do skripti, pristupi bazi podataka itd. Sada u konfiguraciji postavimo sljedeće:

// Postavi konstante: define ("DS", DIRECTORY_SEPARATOR); // separator za putanje datoteka $sitePath = realpath(dirname(__FILE__) . DS); define("SITE_PATH", $sitePath); // put do korijenskog foldera stranice // za povezivanje s bazom podataka define("DB_USER", "root"); define("DB_PASS", ""); define("DB_HOST", "localhost"); define("DB_NAME", "blog_mvc");

Da bismo koristili konstante i druge konfiguracijske podatke u cijelom projektu, moramo uključiti config.php skriptu u datoteku index.php.
Osim povezivanja datoteke postavki, potrebno je da kreirate vezu sa bazom podataka u index.php, povežete skriptu sa jezgrom sajta i pokrenete ruter u kojem će se odvijati rutiranje.
Sada, po redu, kreiranje veze baze podataka će biti u index.php tako da se veza otvara samo jednom. Kada otvorimo vezu, možemo je koristiti u svim kontrolerima i modelima, ali o tome kasnije. Sada samo kreirajmo vezu sa bazom podataka. Za rad s bazom podataka odlučio sam koristiti PDO. Možete pročitati više o PDO.
Smestićemo jezgro sajta u core folder i pozvati skriptu core.php, ovde ćemo napisati funkciju koja će se sama povezivati, klase su neophodne da bi radila. Ova funkcija će nam uvelike olakšati i pojednostaviti rad sa kontrolerima, modelima itd. Jer, gledajući unaprijed, reći ću da će svaki kontroler i svaki model predstavljati posebnu klasu.
Osim automatskog povezivanja klasa, u jezgru ćemo dodati i kreiranje spremišta (registra), u koje ćemo pohraniti sve potrebne objekte i varijable koje mogu biti korisne bilo gdje u projektu.
Također ćemo povezati ruter u indeksnoj datoteci; on će analizirati URL i povezati potreban kontroler i akciju. O tome šta je kontroler sam pisao u prethodnom članku, a namjerno sam izostavio informaciju o akciji, a da je ne opterećujem nepotrebnim informacijama. Dakle, šta je akcija?
Kontroler je klasa koja sadrži različite metode; sa MVC pristupom, svaka metoda će biti akcija. To jest, akcija je metoda klase koja će obraditi podatke i prenijeti ih u prikaz (šablon). Možda još nije sasvim jasno, ali nakon primjera sve će doći na svoje mjesto.
U ovoj fazi, teorija je dovoljna, pređimo na praksu. Dat ću kod datoteka čije sam rad opisao gore.
Index.php kod skripte:

// omogući prikaz svih grešaka error_reporting (E_ALL); // povezivanje konfiguracije uključuje ("/config.php"); // Povezivanje na bazu podataka $dbObject = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS); // povezujemo jezgro stranice uključuje (SITE_PATH . DS . "core" . DS . "core.php"); // Učitavanje rutera $router = new Router($registry); // upisuje podatke u registar $registry->set ("router", $router); // postavlja putanju do foldera kontrolera. $router->setPath(SITE_PATH . "kontrolori"); //pokreni ruter $router->start();

Core.php skripta:

// Učitavanje klasa u funkciji letenja __autoload($className) ( $filename = strtolower($className) . ".php"; // definirajte klasu i pronađite putanju za nju $expArr = explode("_", $className) ) ;if(empty($expArr) ILI $expArr == "Baza")( $folder = "klase"; )else( switch(strtolower($expArr))( case "controller": $folder = "controllers"; break ; case "model": $folder = "models"; break; default: $folder = "classes"; break; ) ) // put do klase $file = SITE_PATH . $folder . DS . $filename; // provjerite datoteku dostupnosti if (file_exists($file) == false) ( return false; ) // uključuje datoteku sa klasom include ($file); ) // pokreće registar (skladište) $registry = new Registry;

Klasa skladištenja Registry.php će se nalaziti u folderu /classes/

// Registar klasa klase pohrane (privatno $vars = array(); // funkcija za snimanje podataka set($key, $var) ( if (isset($this->vars[$key]) == true) ( ​​. throw new Exception("Nije moguće postaviti var `" . $key . "`. Već postavljeno."); ) $this->vars[$key] = $var; return true; ) // dobivanje funkcije podataka get($ ključ) ( if (isset($this->vars[$key]) == false) (vrati null; ) vrati $this->vars[$key]; ) // ukloni funkciju podataka remove($var) (poništi ($ this->vars[$key]); ) )

Šifra datoteke router.php koja se nalazi u folderu /classes/

// klasa usmjerivača Class Router (privatni $registry; privatni $path; private $args = array(); // dobijemo funkciju pohrane __construct($registry) ( $this->registry = $registry; ) // postavi putanju u fasciklu sa funkcijom kontrolera setPath($path) ( $path = trim($path, "/\\"); $path .= DS; // ako putanja ne postoji, signalizirajte ako (is_dir($path ) == false ) ( izbaci novi izuzetak ("Neispravna putanja kontrolera: `" . $path . "`"); ) $this->path = $path; ) // definiranje kontrolera i radnje iz URL privatne funkcije getController (&$file, & $controller, &$action, &$args) ( $route = (prazno($_GET["route"])) ? "" : $_GET["route"]; unset($_GET[ "route"]); if (prazno($route)) ( $route = "index"; ) // Dobijte dijelove URL-a $route = trim($route, "/\\"); $parts = explode( "/", $route); // Pronađite kontroler $cmd_path = $this->path; foreach ($parts kao $part) ( $fullpath = $cmd_path . $part; // Provjerite postoji li folder ako (is_dir ($fullpath)) ( $cmd_path .= $ part .DS;array_shift($parts); nastaviti; ) // Pronađite datoteku if (is_file($fullpath . ".php")) ( $controller = $part; array_shift($parts); break; ) ) // ako URL ne navodi kontroler, tada koristite default indeks if (prazan ($controller)) ( $controller = "index"; ) // Dobivamo akciju $action = array_shift($parts); if (prazno($action)) ( $action = "indeks"; ) $file = $cmd_path. $controller. ".php"; $args = $dijelovi; ) function start() ( // Analizirajte putanju $this->getController($file, $controller, $action, $args); // Provjerite postoji li datoteka, inače 404 if (is_readable($file) == false ) ( die ("404 Not Found"); ) // Uključi uključenu datoteku ($file); // Kreiraj instancu kontrolera $class = "Controller_" . $controller; $controller = new $class($this ->registry); // Ako akcija ne postoji - 404 if (is_callable(array($controller, $action)) == false) ( die ("404 Not Found"); ) // Izvrši akciju $controller ->$action(); ) )

Sada trebate kreirati mape za pohranjivanje kontrolera, šablona i modela - u korijenu ćemo kreirati tri mape kontrolera, pogleda i modela. I hajde da napravimo nekoliko test fajlova /controllers/index.php, /views/index/index.php i /models/model_users.php, i sada popunimo fajlove:
Za kontroler:

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

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

Testni prikaz
id:
ime:

I model:

// Model Class Model_Users( javna funkcija getUser())( return array("id"=>1, "name"=>"test_name"); ) )

Kao što ste možda primijetili, klasa kontrolera nasljeđuje od roditeljske klase Controller_Base. Ovo se radi kako bi se pojednostavila klasa kontrolera. Pošto još uvijek trebamo povezati klasu za rad sa predlošcima, njena veza je smještena u Controller_Base.
Daću njegov kod, nalazi se u folderu /classes/ i zove se controller_base.php:

// klasa apstraktnog kontrolera Apstraktna klasa Controller_Base ( zaštićeni $registry; zaštićeni $template; zaštićeni $layouti; // predložak public $vars = array(); // povezivanje predložaka u funkciji konstruktora __construct($registry) ( $this-> registry = $registry; // predlošci $this->template = new Template($this->layouts, get_class($this)); ) indeks apstraktne funkcije(); )

Sada ostaje samo da shvatite šablone. U apstraktnoj klasi Controller_Base pozivamo klasu Template i prosljeđujemo joj ime šablona i ime kontrolera.
Kod za klasu Template, koji se nalazi ovdje /classes/ i zove se template.php

// klasa za povezivanje predložaka i prosljeđivanje podataka na displej Class Template (privatni $template; privatni $controller; privatni $layouts; privatni $vars = array(); funkcija __construct($layouts, $controllerName) ( $this->layouts = $layouts; $arr = explode("_", $controllerName); $this->controller = strtolower($arr); ) // postavljanje varijabli za funkciju prikaza vars($varname, $value) (if ( isset( $this->vars[$varname]) == true) (trigger_error ("Nije moguće postaviti var `" . $varname . "`. Već postavljeno, a prepisivanje nije dozvoljeno.", E_USER_NOTICE); vrati false . ; ) $this ->vars[$varname] = $value; vrati true; ) // prikaz funkcije view($name) ( $pathLayout = SITE_PATH . "views" . DS . "layouts" . DS . $this-> rasporedi . ". php"; $contentPage = SITE_PATH . "pregledi" . DS . $this->controller . DS . $name . ".php"; if (file_exists($pathLayout) == false) ( trigger_error ("Layout `" . $ this->layouts . "` ne postoji.", E_USER_NOTICE); vrati false; ) if (file_exists($contentPage) == false) ( trigger_error ("Template `" . $name . "` ne postoji.", E_USER_NOTICE); return false; ) foreach ($this->vars kao $key => $value) ($$key = $value; ) uključuje ($pathLayout); ) )

Ako ste pažljivo pročitali kod, vjerovatno ste shvatili da za prikaz na stranicama koristimo šablon first_layouts i view (display) index.php - dao sam njegov kod malo viši. Sve što nam preostaje je da kreiramo first_layouts šablonski fajl. Postavimo ga u folder /views/layouts/first_layouts.php
Šablon će sadržavati sljedeći kod:

header

footer

To je sve, ovim je dovršeno stvaranje „okvira“. Sada imamo najjednostavniju strukturu zasnovanu na MVC obrascu. U ovom članku se nisam dotakao rada sa bazom podataka, samo sam to pomenuo usput, pošto je članak već bio dugačak. Rad sa bazom podataka ću opisati direktno u sljedećem članku.
Ovaj članak je završen, možete preuzeti izvorne datoteke u arhivi.

Uzorak Model-View-Controller (MVC), otkriven kasnih 1970-ih, je obrazac dizajna softverske arhitekture čiji je glavni cilj da odvoji funkcije podataka od prezentacije podataka. Teoretski, dobro dizajnirana MVC aplikacija će omogućiti front-end i back-end programerima da se ne miješaju u područja odgovornosti jedni drugih tokom svog rada, odnosno front-end programer neće morati znati ništa o "kuhinji" njegovog back-end kolege i obrnuto.

Iako je MVC prvobitno bio dizajniran za razvoj desktop aplikacija, prilagođen je modernim zadacima i izuzetno je popularan među web programerima jer omogućava kreiranje čistijeg koda koji se višekratno koristi odvajanjem odgovornosti. MVC obrazac rezultira čistim, modularnim sistemima koji omogućavaju programerima da izvrše promjene u postojećem kodu vrlo brzo.

U ovom članku ćemo pogledati osnovne principe MVC-a, počevši od definicije obrasca i nastavljajući s njegovom primjenom na malom primjeru. Ovaj članak će prvenstveno biti koristan onima koji se nikada u životu nisu susreli s ovim obrascem, a možda i onima koji žele nadopuniti svoje znanje o MVC-u.

Razumijevanje MVC-a

Kao što je već spomenuto, naziv uzorka dolazi od skraćenice od tri riječi: model (model), Pogled I Kontroler. Ukratko, princip rada šablona može se ilustrovati jednim dijagramom (može se naći na Wikipediji):

Ovaj dijagram jasno pokazuje jednosmjerni tok informacija u obrascu i 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 skladištu podataka (kao što je baza podataka). Model pruža interfejs za pretraživanje podataka, njihovo kreiranje, modifikovanje i brisanje iz memorije. U kontekstu MVC obrasca, model je posrednik između pogleda i kontrolera.

Izuzetno važna karakteristika modela je da tehnički nema znanja o tome šta se dešava sa podacima u kontroleru i prikazu. Model nikada ne bi trebao postavljati ili čekati bilo kakve zahtjeve prema/od drugih komponenti uzorka.

Međutim, uvijek imajte na umu da model nije samo kapija do baze podataka ili drugog sistema koji ne radi ništa osim prijenosa podataka naprijed-nazad. Model je poput prolaza do podataka. Model je u većini slučajeva najsloženiji dio sistema, dijelom i zbog činjenice da je sam model povezujuća karika za sve ostale dijelove.

Performanse

Pogled je mjesto gdje se podaci primljeni od modela prikazuju u željenom obliku. U tradicionalnim web aplikacijama razvijenim koristeći MVC obrazac, pogled je dio sistema u kojem se generira HTML kod. Pogled je također odgovoran za primanje radnji od korisnika kako bi ih poslao kontroloru. Na primjer, pogled prikazuje dugme u korisničkom sučelju i, kada se klikne, poziva odgovarajuću radnju kontrolera.

Postoje neke zablude o svrsi pogleda, posebno među web programerima koji tek počinju graditi svoje aplikacije koristeći MVC. Jedno od pravila koja se najčešće krše je to pogled ne bi trebao ni na koji način komunicirati s modelom, i sve podaci koje prima pogled treba da dolaze samo od kontrolora. U praksi, programeri često zanemaruju ovaj koncept, koji je u srži MVC obrasca. Članak Fabija Cevasca ilustruje ovaj zbunjujući pristup MVC-u koristeći CakePHP, jedan od mnogih nestandardnih MVC okvira:

Izuzetno je važno shvatiti da za dobijanje odgovarajuće MVC arhitekture ne bi trebalo postojati direktne interakcije između pogleda i modela. Sva logika za razmjenu podataka između njih mora biti implementirana u kontrolerima.

Osim toga, postoji uobičajena zabluda da je pogled samo šablonska datoteka. Kao što je Tom Butler primijetio, ova zabluda je ogromna zbog činjenice da mnogi programeri pogrešno razumiju MVC strukturu od samog početka, nakon čega počinju da sipaju ovo "znanje" dalje u mase programera početnika. U stvarnosti, pogled je mnogo više od običnog šablona, ​​ali mnogi okviri izgrađeni na vrhu MVC obrasca su toliko iskrivili koncept pogleda da nikoga nije briga da li su njihove aplikacije ispravne u smislu MVC šablona.

Još jedna važna stvar je da pogled nikada ne radi sa “čistim” podacima iz kontrolera, odnosno kontroler nikada ne radi sa pogledom bez zaobilaženja modela. Tokom interakcije između kontrolera i pogleda, model bi uvijek trebao biti između njih.

Kontroler

Kontroler je posljednji dio MVC paketa. Posao kontrolora je da prima podatke od korisnika i manipuliše modelom. Kontrolor, i samo on, je dio sistema koji komunicira sa korisnikom.

Ukratko, kontroler se može opisati kao sakupljač informacija koji ih prosljeđuje modelu za obradu i pohranu. Ne bi trebao ništa raditi s podacima, već samo moći da ih primi od korisnika. Kontroler je povezan s jednim pogledom i jednim modelom, organizirajući tako jednosmjerni tok 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 greška među programerima je da posmatraju kontroler kao jednostavno prolaz između pogleda i modela. Kao rezultat toga, kontroler je obdaren onim funkcijama koje treba da obavlja pogled (usput rečeno, otuda dolazi ideja da je pogled samo šablonska datoteka). Povrh toga, mnogi ljudi potpuno izbacuju svu logiku obrade podataka, zaboravljajući za šta je model namijenjen u MVC obrascu.

MVC u PHP-u

Predlažem da pokušate implementirati gore navedeno u malu aplikaciju. Počnimo kreiranjem klasa modela, pogleda i kontrolera:

string = "MVC + PHP = Sjajno!"; ) )kontroler = $kontroler; $this->

" . $this->model->string ."

"; } } model = $model; ) )

Glavni časovi su spremni. Sada ih povežimo zajedno i pokrenemo našu aplikaciju:

output();

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

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

string = “MVC + PHP = Sjajno, kliknite ovdje!”; ) )kontroler = $kontroler; $this->model = $model; ) javna funkcija output() ( povratak "

model->string . "

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

I na kraju, hajde da malo modernizujemo kod za povezivanje:

($_GET["akcija"])(); ) echo $view->output();

Rezultati

U ovom kratkom članku pogledali smo osnovne koncepte MVC obrasca dizajna i razvili jednostavnu aplikaciju zasnovanu na njemu, iako smo, naravno, još daleko od upotrebe u stvarnom životu. U sljedećem članku ćemo pogledati glavne poteškoće na koje ćete naići ako se više uključite u izgradnju arhitekture aplikacije zasnovane na MVC obrascu. Stay tuned!

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

Uvod

Dobrodošli u prvi kompletan tutorijal za PHP 5. Trebaće vam PHP 5.1 sa instaliranom SPL bibliotekom, jer ćemo iskoristiti neke od najnovijih karakteristika PHP-a 5.

U ovom tutorijalu pokazaću vam kako da napravite jednostavan MVC sistem (MVC arhitektura je najčešći obrazac dizajna za velike veb aplikacije). Provest ću vas kroz sve korake od početka do kraja stvaranja kompletnog MVC sistema.

Jedna ulazna tačka

Jedna od važnih stvari u vezi sa MVC-om je da postoji jedna ulazna tačka u aplikaciju umesto gomile PHP fajlova koji rade nešto poput ovoga:

Imat ćemo jedan fajl koji obrađuje sve zahtjeve. To znači da nećemo morati da se mučimo sa povezivanjem global.php svaki put kada treba da kreiramo novu stranicu. Ova "jedinstvena ulazna tačka" će se zvati index.php i za sada će biti ovako:

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

Za usmjeravanje svih zahtjeva na glavnu stranicu, koristićemo mod_rewrite i postaviti direktivu RewriteRule u .htaccess. Zalijepimo sljedeći kod u .htaccess fajl i spremimo ga u isti direktorij kao index.php:

RewriteEngine na RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule ^(.*)$ index.php?route=$1

Prvo provjeravamo da li traženi fajl postoji pomoću RewriteCond direktive, a ako ne, preusmjeravamo zahtjev na index.php. Ova provjera postojanja datoteke je neophodna, jer će u suprotnom index.php pokušati obraditi sve zahtjeve prema stranici, uključujući zahtjeve za slike. A ovo je upravo ono što nam ne treba.

Ako nemate mogućnost korištenja .htaccess ili mod_rewrite, onda ćete morati ručno adresirati sve zahtjeve na index.php. Drugim riječima, sve veze će morati izgledati kao “index.php?route=[request-here]”. Na primjer, "index.php?route=chat/index".

Sada kada svi zahtjevi prolaze kroz jednu ulaznu tačku, možemo početi pisati index.php skriptu. Prva stvar koju treba da uradimo je da inicijalizujemo sistem. Kreirajmo direktorij uključuje, iu njemu datoteku startup.php (to će biti naš inicijalizacijski fajl). Ubacimo sljedeći kod u index.php:

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

Sljedeća stvar koju trebate učiniti je kreirati Registry objekt za pohranjivanje globalnih vrijednosti. Biće prosleđen pojedinačnim sistemskim objektima i korišćen za pristup globalnim vrednostima, bez potrebe za označavanjem promenljivih kao „globalnih“ ili pristupanjem nizu $GLOBALS. Pročitajte članak "Korišćenje globalnih vrijednosti u PHP-u" za više informacija o objektu registra.

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

$registry = novi registar;

Ako sada pokušate pokrenuti sistem, vidjet ćete sljedeću grešku:

Fatalna greška: Klasa "Registry" nije pronađena u g:\Projects\PHP\content\simple mvc php5\demo\includes\startup.php na liniji 12

Ovo, naravno, nije veliko iznenađenje za nas, jer još nismo napisali samu klasu Registry. Datoteka sa klasom se jednostavno može uključiti pomoću funkcije include() (napomena o ravni: usput, include() nije takva funkcija, ali ipak izraz jezika, kontrolna struktura, ako je pogledate u osoba), ali hajde da koristimo jednu od novih karakteristika PHP-a 5: __autoload().

Magična funkcija __autoload() se koristi za dinamičko učitavanje klasa. Kada PHP naiđe na nepostojeću klasu, prvo poziva funkciju __autoload() i tek onda ispušta grešku. Možemo iskoristiti ovu mogućnost za učitavanje klasa 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či ($file); )

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 klasa. Ako datoteka ne postoji, funkcija će jednostavno vratiti false i pojavit će se fatalna greška. Ali ako datoteka postoji, bit će preuzeta. One. potrebna klasa će biti deklarisana i neće biti greške.

Još nismo kreirali samu klasu Registry, tako da će se greška i dalje pojaviti. Hajdemo do toga.

Kreiranje klase registra

Klasa Registry se koristi za prosljeđivanje globalnih vrijednosti između pojedinačnih objekata. Ovo je zapravo prilično jednostavna klasa sa samo nekoliko malih metoda za implementaciju.

Prvo, napravimo direktorij klasa i datoteku registry.php u njemu. Ubacimo 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 primanje vrijednosti. Također možete napisati metodu remove() za uklanjanje vrijednosti. Dodajmo ove metode u klasu Registry:

Funkcija set($key, $var) ( if (isset($this->vars[$key]) == true) ( ​​baci novi izuzetak("Nije moguće postaviti var `" . $key . "`. Već set. "); ) $this->vars[$key] = $var; vrati true; ) funkcija get($key) ( if (isset($this->vars[$key]) == false) ( return null; ) vrati $this->vars[$key]; ) funkcija remove($var) ( unset($this->vars[$key]); ) ?>

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

Sada imamo punopravnu klasu Registry, ali nećemo stati na tome. Koristimo jednu od karakteristika SPL biblioteke: ArrayAccess. SPL (skraćenica od Standard PHP Library) je kolekcija interfejsa i klasa dizajniranih za rešavanje uobičajenih problema. Jedno od SPL sučelja, ArrayAccess, može se koristiti za pružanje pristupa objektu kao da je običan niz. Pogledajmo ovaj primjer:

set("name", "Dennis Pallett"); // Dobivamo vrijednost koristeći get() echo $registry->get("name"); // Dobijte vrijednost koristeći pristup nizu echo $registry["name"] ?>

Trik je u tome što $registry postaje kao niz, iako je u stvari objekat. Naravno, ArrayAccess ne pruža nikakve posebne prednosti, ali vam omogućava da smanjite količinu koda, jer ne morate svaki put pisati “->get()”. Da biste koristili ovo sučelje, morate popraviti prvi red klase (“Class Registry”) na ovaj način:

Registar klasa implementira ArrayAccess (

Ključna riječ "Implements" govori tumaču da sa ovom klasom implementiramo interfejs, što je ArrayAccess zapravo.

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

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

Ove metode treba da budu jasne. Više informacija možete pronaći u SPL dokumentaciji.

Sada, nakon implementacije interfejsa ArrayAccess, možemo pristupiti objektu kao da je običan niz. Ovo je jasno pokazano i u prethodnom i u ovom primjeru:

get("name"); // Dobijte vrijednost koristeći pristup nizu echo $registry["name"] ?>

Klasa Registry je sada završena i ako pokušate da pokrenete sistem, sve bi trebalo da radi (iako ništa još neće biti izlazno). Završili smo sa inicijalizacionom datotekom i možemo da pređemo na sledeći korak pisanja našeg MVC sistema: implementacija pristupa bazi podataka, koji se u MVC arhitekturi naziva “Model”.

Model

"M" ili model je dio MVC sistema koji je odgovoran za ispitivanje baze podataka (ili drugog vanjskog izvora) i pružanje informacija kontroloru. Bilo bi moguće učitati potreban model ovisno o zahtjevu, ali ja više volim da na ovom mjestu malo zamaglim granice između modela i kontrolera, tj. Kontroler radi sa bazom podataka direktno kroz biblioteku interakcije baze podataka, a ne kroz poseban model. Možda želite da to uradite drugačije, to je stvar ukusa.

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

Ubacimo sljedeći kod u datoteku index.php (nakon što uključimo inicijalizacijski fajl):

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

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

Komponenta modela našeg sistema je spremna, pa idemo na pisanje kontrolera.

Pisanje kontrolera takođe znači pisanje klase Router, koja je odgovorna za učitavanje željenog kontrolera u zavisnosti od zahteva (zapamtite, varijabla $route se prosleđuje index.php preko URL-a).

Klasa rutera

Klasa Router će analizirati zahtjev i zatim učitati potrebni kontroler. Kreirajmo "kostur" klase:

registar = $registry; ) ) ?>

Zatim dodajte sljedeće redove u index.php:

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

Prva stvar koju ćemo napisati je metod 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) (izbaci novi izuzetak ("Nevažeća putanja kontrolera: ` " . $path . "`"); ) $this->path = $path; )

Zatim dodajte sljedeće redove u index.php:

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

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

Funkcija delegate() ( // Analiziranje putanje $this->getController($file, $controller, $action, $args);

Kao što vidite, koristi drugu metodu, getController(), da dobije ime kontrolera i nekoliko drugih varijabli. Ova metoda izgleda ovako:

Privatna funkcija getController(&$file, &$controller, &$action, &$args) ( $route = (prazno($_GET["route"])) ? "" : $_GET["route"]; ako ( empty($route)) ( $route = "index"; ) // Dobijte odvojene dijelove $route = trim($route, "/\\"); $parts = explode("/", $route); / / Pronalaženje ispravnog kontrolera $cmd_path = $this->path; foreach ($parts kao $part) ( $fullpath = $cmd_path . $part; // Postoji li folder sa ovom putanjom? if (is_dir($fullpath)) ( $cmd_path .= $part . DIRSEP; array_shift($parts); continue; ) // Pronađite datoteku if (is_file($fullpath . ".php")) ( $controller = $part; array_shift($parts); break; ) ) if (empty($controller)) ( $controller = "index"; ); // Dobiti akciju $action = array_shift($parts); if (empty($action)) ( $action = "index "; ) $file = $cmd_path . $controller . ".php"; $args = $parts; )

Hajdemo preko ove metode. Prvo, uzima vrijednost varijable $route iz zahtjeva, a zatim je razbija na dijelove koristeći explode() funkciju. Na primjer, zahtjev “members/view” se konvertuje u niz kao što je ovaj: array(‘members’, ‘view’).

Zatim, koristeći foreach petlju, prolazi kroz svaki dio i provjerava da li je taj dio direktorij. Ako jeste, onda ga dodjeljuje putanji do datoteke i provjerava sljedeći dio. Ovo vam omogućava da postavite kontrolere u poddirektorijume i tako dobijete hijerarhiju kontrolera. Ako trenutni dio zahtjeva nije direktorij, već je datoteka, on se pohranjuje u varijablu $controller i izlazimo iz petlje, pošto je kontroler koji nam je potreban pronađen.

Nakon petlje provjeravamo varijablu s imenom kontrolera. Ako je prazan, tada koristimo “indeks” kontroler, koji će biti naš zadani kontroler. Metoda tada određuje radnju koju treba izvršiti. Kontroler je klasa koja se sastoji od nekoliko metoda. Radnja ukazuje na određeni metod. Ako radnja nije navedena, koristit ćemo “indeks” - zadanu radnju.

I konačno, dobijamo punu putanju do fajla kontrolera kombinovanjem tri varijable: putanje, imena kontrolera i ekstenzije „php“.

Sada kada smo raščlanili zahtjev, vrijeme je da pozovemo metodu delegate() da učitamo kontroler i izvršimo akciju. Metoda delegate() u potpunosti izgleda ovako:

Funkcija delegate() ( // Analizirajte putanju $this->getController($file, $controller, $action, $args); // Je li datoteka dostupna? if (is_readable($file) == false) ( die ( "404 Not Found"); ) // Uključi datoteku include ($file); // Kreiraj instancu kontrolera $class = "Controller_" . $controller; $controller = nova $class($this->registry) ; // Akcija dostupna? if (is_callable(array($controller, $action)) == false) ( die ("404 Not Found"); ) // Izvrši akciju $controller->$action(); )

Raščlanjivanjem zahtjeva pomoću metode getController() provjeravamo da li datoteka zaista postoji i, ako ne, vraćamo jednostavnu poruku o grešci.

Nakon toga, uključujemo datoteku s kontrolerom i kreiramo instancu njegove klase, koja bi se trebala zvati “Controller_[name]”. O kontrolerima ćemo govoriti detaljnije malo kasnije.

Zatim provjeravamo da li navedena akcija (tj. metoda) postoji i da li je moguće pozvati je (za to koristimo funkciju is_callable()). Konačno, izvodimo samu akciju, koja zaokružuje ulogu klase Router.

Nakon što ste napisali metodu delegate() u potpunosti, dodajte sljedeći red u datoteku index.php:

$router->delegate();

Ako sada pokušamo pokrenuti sistem, vidjet ćemo sljedeću grešku (naravno, ako još nema direktorija kontrolera):

Fatalna greška: Neuhvaćen izuzetak "Izuzetak" sa porukom "Neispravna putanja kontrolera: `g:\Projects\PHP\content\simple mvc php5\demo\controllers\`" u g:\Projects\PHPit\content\simple mvc php5\demo \classes\router.php:18 Praćenje steka: #0 g:\Projects\PHP\content\simple mvc php5\demo\index.php(13): Router->setPath("g:\Projects\PHP... ") #1 (glavni) ubačen u g:\Projects\PHP\content\simple mvc php5\demo\classes\router.php na liniji 18

Ili ćemo vidjeti grešku “404 Not Found”, jer još nema kontrolera. Ali ovo je ono što ćemo sada učiniti.

Kontroler

Kontroleri u našem MVC sistemu će biti prilično jednostavni i zahtevaće vrlo malo vremena. Prvo, provjerimo postoji li direktorij kontrolera. Kreirajmo datoteku controller_base.php u direktoriju classes i zalijepimo sljedeći kod u nju:

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

Ova apstraktna klasa će biti roditeljska klasa za sve naše kontrolere. Učinit će samo dvije stvari: održavati lokalnu kopiju klase Registry i, koristeći apstraktnu metodu index(), prisiliti sve kontrolere djece da implementiraju ovu metodu.

Hajde da napišemo naš prvi kontroler. Kreirajmo datoteku index.php u direktoriju kontrolera i u nju ubacimo sljedeći kod:

Upravo smo kreirali naš prvi kontroler i ako pokušamo da pokrenemo sistem, videćemo sledeće:

To znači da je klasa Router obavila svoj posao i pokrenula potrebnu akciju iz potrebnog kontrolera. Napišimo drugi kontroler koji će odgovarati zahtjevu "članovi/pregled". Kreirajmo datoteku members.php u direktoriju kontrolera i ubacimo sljedeći kod u nju:

Sada idemo na naš MVC sistem koristeći zahtjev “members/view” ili “index.php?route=members/view”. Trebali bismo vidjeti ovakav rezultat:

Samo pisanjem novog kontrolera i dodavanjem metode u njega, mogli smo da kreiramo novu stranicu bez potrebe da bilo šta menjamo u samom sistemu. Osim toga, naši kontroleri ne moraju uključiti global.php fajl ili nešto slično.

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

Display

Kao i kod modela, postoji nekoliko različitih opcija za kreiranje View komponente u MVC sistemu. Mogli bismo naučiti klasu Router da automatski učitava drugu datoteku koja se zove nešto poput “view_(name).php”. Ali da bismo vodič učinili razumljivijim, napišimo klasu Template koja će ispisivati ​​šablone.

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

registar = $registry; ) ) ?>

Sada imamo osnovnu strukturu naše klase Template. Sljedeći korak je dodavanje sljedećeg koda u datoteku index.php neposredno prije linija povezanih s klasom Router:

# Kreirajte objekat šablona $template = new Template($registry); $registry->set("template", $template);

Budući da ćemo morati koristiti vrijednosti iz modela i kontrolera, napisat ćemo metodu set() 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 dozvoljeno.", E_USER_NOTICE); vrati false; ) $this->vars[$varname] = $value; vrati true; ) funkcija remove($varname) ( unset($ this->vars[$varname]); vrati true; )

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

Počnimo pisati show() metodu, koja će prikazati šablone. Najjednostavniji način je kreiranje zasebnog direktorija predložaka za pohranu svih datoteka predložaka i korištenje include() za izlaz predloška. Naravno, vaša vlastita metoda show() može biti potpuno drugačija i učitavati šablone iz baze podataka ili raditi nešto drugo. Pogledajmo kuso

Glasova: 745 | Pregledi: 8080

Iako vam je značenje izraza "arhitektura lokacije" možda intuitivno, pokušajmo da proučimo niz definicija iz autoritativnih izvora.

Arhitektura- ovo je osnovna organizacija sistema, oličena u njegovim komponentama, njihovim međusobnim odnosima i sa okruženjem, kao i principima koji određuju dizajn i razvoj sistema.

Arhitektura Program ili kompjuterski sistem je struktura ili strukture sistema koji uključuju elemente programa, spoljašnja vidljiva svojstva ovih elemenata i odnose između njih [bas].

Arhitektura je struktura organizacije i ponašanje sistema koji je s njom povezan. Arhitektura se može rekurzivno dekomponovati na delove koji su u interakciji kroz interfejse, veze koje povezuju delove i uslove za sastavljanje delova. Dijelovi koji stupaju u interakciju putem interfejsa uključuju klase, komponente i podsisteme.

Arhitektura Softverski sistem ili skup sistema sastoji se od svih važnih dizajnerskih odluka o programskim strukturama i interakcijama između tih struktura koje čine sisteme. Odluke o dizajnu pružaju željeni skup svojstava koje sistem mora podržati da bi bio uspješan. Dizajnerska rješenja pružaju konceptualnu osnovu za razvoj, podršku i održavanje sistema.

Dakle, šta je arhitektura programa?

Definicije date u prethodnom odeljku su suviše suve da bi ih nepripremljeni čitalac primetio. Pokušaćemo da što jednostavnije objasnimo suštinu.

Kada program postane dovoljno velik, programer ga dijeli na nekoliko datoteka. Ako ne razmišljate o identificiranju 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 promijeniti.

Stoga se postavlja prvo pitanje: kako podijeliti program u datoteke. Arhitektura datoteka programa je jedan aspekt njegove strukture.

Prilikom identifikacije sistemskih modula potrebno je razumjeti njihov međusobni odnos. Na primjer, moduli za pristup bazi podataka i moduli za obradu grafike vjerovatno neće znati išta o postojanju jedni drugih. Ali UI modul će znati za njih oboje (a oni neće znati za to).

Odnosi između komponenti sistema su takođe određeni njegovom arhitekturom.

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

Nivoi apstrakcije

Prilikom dizajniranja modula (odabir grupa funkcija i njihova distribucija u fajlove u slučaju proceduralnog pristupa), važno je istaknuti apstrakcije i pokušati ih dekomponovati na nekoliko nivoa.

Moduli niskog nivoa su što je moguće autonomniji, ne zavise od drugih delova programa. Dobro dizajnirani moduli izoluju „spoljni svet“ od zamršenosti rešavanja problema koji im je dodeljen. Pozivajuća strana poznaje samo interfejs modula (eksterne funkcije), unutrašnji deo je zatvoren za njega.

Uzmimo za primjer galeriju fotografija. Informacije o slikama i korisnicima pohranjene su u bazi podataka, korisnički interfejs je podijeljen na klijentski dio i admin panel.

Struktura programa može biti kao na slici ispod:


Ovaj primjer prati tri nivoa apstrakcije.

U svakom programu namijenjenom ljudskoj upotrebi postoje najmanje dva nivoa: korisnički interfejs i model. Modul korisničkog sučelja je dizajniran za predstavljanje i vizualizaciju podataka i obradu reakcija korisnika. Model sadrži logiku problema koji se rješava i ni na koji način ne bi trebao ovisiti o načinu na koji su podaci prikazani. Model bi trebao biti lako prenosiv između različitih tipova korisničkog interfejsa.

MVC arhitektura

Popularno sada MVC obrazac dizajna. Služi za odvajanje logike aplikacije od korisničkog interfejsa. Ali prvo, hajde da razjasnimo šta je obrazac dizajna.

Ovo je skup standardnih dizajnerskih rješenja, okvir arhitekture ili njegov fragment. Ako je biblioteka paket koda za višekratnu upotrebu, tada je obrazac dizajna paket rješenja za višekratnu upotrebu.

Šta nam MVC nudi da odvojimo logiku aplikacije od korisničkog interfejsa?

Uzorak MVC vam omogućava da se odvojite podaci, prezentacija i obrada radnji korisnika u tri odvojene komponente:

  1. Model. Model obezbeđuje podatke (obično za pogled) i takođe odgovara na zahteve (obično od Kontrolora) promenom svog stanja;
  2. Pogled. Odgovoran za prikaz informacija (korisnički interfejs);
  3. Kontroler. Tumači korisnički unos i informiše model i pogled da odgovaraju na odgovarajući način.

Slika ispod pokazuje odnose između komponenti 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 pritisne dugme Uredi i Performanse(Prikaz) šalje poruku Kontroloru(Kontroler): "Naredba: uredi"
  2. Kontrolor prihvata poruku i pristupa modelu pozivanjem metode Edit().
  3. Kao rezultat model se menja njegovo stanje (transliterirani tekst pohranjen u njemu) i obavještava pogled o tome: “Događaj: promijenjeno”.
  4. Podnošenje prihvata signalizira i kontaktira model za novu vrijednost rezultata pozivanjem metode Get().

MVC implementacija

Implementacija MVC-a pretpostavlja objektno orijentisani pristup (OOP). Međutim, obrazac dizajna je samo skup rješenja. Hajde da ih prilagodimo za PHP bez upotrebe OOP-a. Pojednostavljenje je urađeno kako bi se koncentrisalo na suštinu razdvajanja logike, a takođe i kako bi materijal mogao da primeni i čitalac koji nije upoznat sa OOP-om.

Pogledajmo ponovo primjer sa galerijom fotografija.
Ima dva načina gledanja:

  1. Režim za pregled sličica (sve odjednom);
  2. Režim za gledanje fotografije u punoj veličini (jedna).

Također je moguće otpremite fotografije na server. Pored toga, implementiraćemo podršku za tipove vizuelizacije da bismo procenili fleksibilnost okvira.

Tamo će biti dvije ulazne tačke:

  1. index.php(pregled galerije);
  2. photo.php (pogledajte fotografiju u punoj veličini).
Razmotrićemo ova dva fajla Kontrolori.

As Modeli bit će modul koji omogućava rad sa pohranom slika. Hajde da ga pozovemo gallery.php i stavi u fasciklu model.

U ulozi Zastupanje HTML šabloni će se pojaviti, oni će se nalaziti u folderu šabloni. Šta su šabloni i za šta su potrebni videćemo kasnije.

Stranice sa pregledom galerije i fotografija imat će zajedničko zaglavlje i podnožje, samo će se središnji dio razlikovati.

Prikaz galerije će imati dvije vrste vizualizacije:

  1. Kao tabela (podrazumevano);
  2. U obliku liste.
Trebat će nam četiri šablona:
  1. main.php(okvir stranice);
  2. content_index_table.php (tabelarni prikaz sadržaja galerije);
  3. content_index_list.php (pregled liste sadržaja galerije);
  4. content_photo.php (sadržaj stranice za pregled fotografija).

Ovo rezultira sljedećom strukturom stranice:


Struktura fajla je podeljena sa dve horizontalne trake, stvarajući tri sekcije. Datoteke u gornjem dijelu pripadaju modelu, datoteke u srednjem dijelu View, a datoteke u donjem dijelu kontroleru.

Model

Počnimo sa implementacijom Modela. Donji kod nije prikazan u cijelosti radi minimiziranja i bolje jasnoće primjera.

Definisali smo samo interfejs modela, a implementacija nedostaje. Međutim, za primjer implementacije MVC okvira to uopće nije potrebno.

Performanse

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

<?=$title?>

Ne treba da vas zbuni činjenica da šablon koristi varijable $title i $content koje su došle niotkuda. Kontrolor će ih postaviti. Ali više o tome kasnije.

- ovo je skraćena verzija snimka .

Pogodno je koristiti u šablonima. Takođe je pogodnije koristiti alternativne opcije za pisanje if-else, foreach, for i while konstrukcija u predlošcima. izgledaju ovako:

ako (<условие>): <тело>endif; za svaki(<инициализация цикла>): <тело>endforeach;

Ostali šabloni će biti umetnuti u main.php ovako:

Primjeri u nastavku pokazuju njihov kod:

Šabloni koda/content_index_table.php

Table| Lista

"> " />



Šabloni koda/content_index_list.php

Tablica | Lista

"> " />



templates/content_photo.php: Natrag

" />

Kontroler

I na kraju, hajde da sve to spojimo opisujući naša dva Kontrolora. Njihov zadatak je obraditi zahtjev, odabrati predložak i zamijeniti podatke potrebne za predložak. Podaci se obično uzimaju iz modela.

Kontrolor galerije učitava fotografiju ako je korisnik poslao datoteku. U suprotnom, izdvaja listu fotografija iz modela, bira željeni šablon (ovisno o želji korisnika) i prikazuje ovaj predložak, prosljeđujući mu listu fotografija:

Code index.php

Kontroler za pregled fotografija je još jednostavniji:

Code photo.php

Konačno

Pokušajte da posvetite dovoljno pažnje razvoju arhitekture vaše aplikacije. Ako u početku kreirate snažan i proširiv okvir, trud će se isplatiti stostruko.

Za implementaciju MVC modela, bolje je izabrati objektno orijentisani pristup .

Postoji mnogo gotovih okvirnih rješenja, kao što je Zend Framework. Međutim, informacije predstavljene u tekućoj lekciji dovoljne su da se razumiju MVC arhitektonska rješenja i počnete ih koristiti sada.

Šta je MVC?

Dakle, MVC se odnosi na korisnički interfejs (UI). Ne nužno grafička, glasovna kontrola je takođe dobra. Ne zaboravimo da program možda nema korisnički interfejs, može imati interfejs za programiranje aplikacija (API), ili ga uopšte nema, a da je i dalje koristan.

Ali ako imamo korisnika, onda mora postojati i korisnički interfejs. Šta je interfejs? Ovo je neprekidna granica između dva sistema. U našem slučaju: s jedne strane - program, s druge - korisnik. Evo ih.

Program je potpuno apstraktan, bilo koji predmetni kod. Može učiniti nešto korisno, a korisnik ima potrebe koje može zadovoljiti uz pomoć ovog programa. Tada se pojavljuju dijelovi logike koji „znaju“ kako, koristeći ovaj program, raditi direktno ono što korisnik želi. Komadi nisu predmetno specifična logika u programu. Oni su relevantniji za korisnika sa njegovim specifičnim potrebama, a predstavljaju kombinacije poziva i poziva u program.

Slučajevi upotrebe

Kao primjer, zamislite terminal za trgovanje na berzi. Korisnik terminala podnosi prijavu u kojoj navodi da želi kupiti 20 dionica kompanije Svetly Put po cijeni od 1.500 rubalja po akciji. Takođe ukazuje da aplikacija važi četiri sata, a sa kog njegovog računa će novac biti terećen ako transakcija bude uspešna.

Opipljiv broj atributa. Prođe neko vrijeme i on shvati da neće moći kupiti po ovoj cijeni i spreman je podići cijenu na 1.550 rubalja, ostavljajući sve ostale vrijednosti. Zatim odabere ovu aplikaciju, klikne na dugme „promeni“, naznači novu cenu, da. To je udobno.

Ali na berzi ne možete promeniti nalog, u predmetnoj oblasti ne postoji takav koncept. Prijava se može samo podnijeti i poništiti. Da biste korisniku dali priliku da promijeni narudžbu jednim klikom, morate zapamtiti stare vrijednosti, ukloniti redoslijed, pustiti mu da uredi ono što je zapamtio i postaviti novu narudžbu. Takva kombinacija. Ali za korisnika to izgleda kao jedna jednostavna radnja: promjena aplikacije. Ovo se zove slučaj upotrebe.

Dopunimo naš dijagram prostorom za slučajeve upotrebe.

Korisniku takođe treba dati priliku da izvuče ove slučajeve upotrebe i dobije rezultate. To mogu biti dugmad i drugi grafički elementi za unos/izlaz, pokreti, prepoznavanje i sinteza govora. Bilo koja opcija za razmjenu podataka i naredbi. voila:

Korisnik povlači jedan od slučajeva upotrebe, koji zauzvrat manipulira programom. Program objavljuje rezultat ili promjene u njegovom stanju.

Dakle, gdje je uopće MVC?

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

Kada model objavi promjene, nije ga briga za koga, ne zna ništa o Viewu. Umjesto ili zajedno sa View, može postojati drugi podsistem na drugom kraju.

Sada nekoliko detalja.

Bila je to klasična verzija MVC - Active Model. Takođe se dešava da model ne obaveštava o promenama. Tada kontrolor preuzima ovu odgovornost. On zna koje 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 nesubjekat je proizvoljna i ovisi o tome koliko pedantno želimo modelirati predmetno područje. Ponekad je racionalna odluka uključiti neku vrstu slučaja upotrebe u model. Možda će ovo smanjiti ukupnu količinu koda i pojednostaviti ga.

Zahvaljujemo se našem pretplatniku Stanislavu Iljičevu na materijalu

Najbolji članci na ovu temu