Az MVC tervezési minta és a Laravel

Attila | 2022. 02. 02. 20:03 | Olvasási idő: 2 perc

Címkék: #Laravel #MVC #Web

Ebben a bejegyzésben áttekintem, hogy a webes világban gyakorta használt Model-View-Controller (modell-nézet-vezérlő, MVC) tervezési mintára hogyan épül a Laravel keretrendszer. Végignézhetjük, hogy hogyan történik meg egy felhasználói oldallekérés kiszolgálása. Végül bemutatom, hogy a Laravel könyvtárstrukturájában hol helyezkednek el az MVC-hez kapcsolódó legfontosabb fájlok és mappák.
Laravel_MVC

Ahogy azt a neve is mutatja, az MVC programtervezési mintában elkülönül a Model, a View és a Controller. Na de miért is felelősek ezek a részek?

  • Mielőtt rátérnék az egyes részekre, először is foglalkozzunk az útvonalválasztóval. Ő az, akinél a programozó regisztrálja az útvonalakat, hogy mely URL-eken akarja fogadni a felhasználóit. Biztos mindenki futott már bele olyan "404 - Not found" hibakódba, amit akkor kap, ha rossz URL-t írt be a böngészőbe. Ez a Laravel esetén akkor fordul elő, ha olyan URL-t szeretne elérni a felhasználó, amit a programozó nem regisztrált be korábban. Az útvonalválasztóra tehát egy amolyan hotel recepciósként tekinthetünk: a leendő vendégek (felhasználók) bemennek a hotelbe és le akarják foglalni az XY számú szobát, ha az szabad (vagy létezik), akkor elirányítja oda a vendéget a recepciós, a felhasználó pedig örül ennek.
  • Az MVC esetén az útvonalválasztóból leggyakrabban a Controller fájlok felé megy tovább a felhasználói kérés és annak kiszolgálása. Ő a vezérlő, ahogy a neve is mutatja. Ő az, aki meg tudja kérni a Model fájlokat, hogy például kérjenek le adatot az adatbázisból, vagy számítsanak ki valamit, mondjuk egy számla végösszegét. Amit utána visszakap adathalmazt vagy kalkulációt a Model fájltól, azt utána tovább tudja adni a megfelelő View fájlnak, aki pedig majd megjeleníti a felhasználó felé az eredményt.
  • A Model fájlok biztosítják a hozzáférést az adatbázisban lévő adatokhoz. Ha relációs adatbázisunk van (táblák, sorokkal, oszlopokkal, kapcsolatokkal stb.), akkor érdemes úgy elnevezni a Model fájljainkat, amilyen nevet akarunk adni az adattáblának az adatbázisban. Például Record.php Model fájl a records nevű adattáblához adja majd a hozzáférést, pusztán a névazonosság biztosítja az összeköttetést a Model fájl és az adattábla között. (Persze adhatunk más nevet a Model fájlunknak, mint az adattáblának, na de ki akar pluszban akár csak 1-2 sort is programozni, ha nem muszáj ezt megtennie.) A Model fájlok másik fontos funkcionalitása, hogy ők biztosítják az üzleti logikát a webes alkalmazásunk számára, például kiszámítanak valamilyen kalkulációt, vagy összegyűjtik az adott mappában lévő kép fájlokat és visszaadják utána az eredményt a vezérlőnek.
  • A View (nézet) fájlok fogják megjeleníteni a felhasználóknak a kérés eredményét a böngészőjükben. Ezek tipikusan HTML(szerű) fájlok, amelyek a Blade nevű sablont használ(hat)ják. Emiatt minden nézet fájlnak .blade.php véget kell tartalmazni, például: show.blade.php fájl.

Az ábrán is látható felhasználó például David Bowie - Heroes albumát akarta lekérdezni és megnézni a böngészőjében. Ehhez beírta a böngésző címsorába a megfelelő URL-t (vagy valamilyen weblinken keresztül érte el). A Laravel webalkalmazás útvonalválasztója felismeri, hogy létezik ilyen regisztrált útvonal a rendszerben, ezért átadja a kiszolgálás kérését az útvonalhoz regisztrált ShopController fájlnak. A ShopController fájl megszólítja a Record Model fájlt, amely hozzáfér a megfelelő adattáblához az adatbázisban, és le tudja kérni az adott album számlistáját onnan. A számlista halmazt aztán visszakapja a ShopController fájl, ami átadja azt a megfelelő show.blade.php View fájlnak és ezt kapja vissza a felhasználó a kérése eredményéül a böngészőjében.

A Laravel MVC-hez köthető legfőbb összetevőinek helye a mappastruktúrában:

  • Az útvonalakat tartalmazó fájl(ok): routes/web.php (de a routes mappában minden fájlba útvonalakat tudunk elhelyezni és így regisztrálni a fájlokon belül, a fájlok nevei az útvonalak jellegéből adódó csoportosítást segítik, például az admin.php-ban a weboldal adminisztrációs részéhez tartozó útvonalakat érdemes elhelyezni).
  • Model fájlok: a Laravel 5.7, 5.8 verzióiban az app mappában találhatók meg, a 8-as verziótól kezdve pedig az app\Models mappában vannak ezek a fájlok.
  • View fájlok: resources\views mappában vannak (mappa szerint érdemes ezen belül is rendezni őket, például a shop mappába kerülhetnek a bolttal kapcsolatos nézet fájlok.
  • Controller fájlok: app\Http\Controllers mappában vannak.

Az MVC tervezési mintára épülő keretrendszerek egyik legnagyobb erőssége a névkonvenció. Ez a számunkra annyit jelent, hogy ha betartjuk a névadási szabályokat, akkor a Laravel segít nekünk mindenben, mindent sokkal egyszerűbbé tesz a számunkra.

Az MVC egyes elemeivel és a névkonvencióval a későbbiekben sokkal részletesebben foglalkozunk még, ebben a bejegyzésben csak egy áttekintést szerettem volna adni az általános működésről.