A PHP segítségével nagyon sok feladatot tudunk elkészíteni. Ezeket a feladatokat, azaz beépített alap tulajdonsággal rendelkező jól körül írható funkcionalitásokat, keretrendszerben tudják előállítani. A keretrendszer egy egységes architektúra, ami a gyűjtemények használatára és manipulálására szolgál. Olyan programot célszerű készíteni, amely szoftvertermék teljes ciklusában kevés költséggel, de maximálisan megfelel egy terméknek.
A keretrendszerek kiválasztásánál felmerül egy pár kérdés.
Előnyök: Már kevés idő alatt is megtanulható egy-egy keretrendszer kezelése. A hozzáadott költség hamar is visszatérül. A készített programcsomag megfelel a dobozos terméknek.
Hátrányok: Egyes dobozos keretrendszernek nagyon sok korlátai vannak, kisebb feladat esetén is fel kell használni a teljes csomagot, ami nem mindig gyors az automatizált eljárások miatt.
Az alábbi táblázatban összeszedtem egy pár keretrendszert, illetve egy pár tulajdonságot, amit elsőre keresnek a fejlesztők.
Keretrendszer | Hivatalos website | PHP4 | PHP5 | MVC | Templétek | Adatbázis kapcsolatok |
Akelos | ||||||
ash.MVC | http://www.ash-mvc.org/ | |||||
CakePHP | ||||||
CodeIgniter | ||||||
DIY | ||||||
eZ Components | ||||||
Fusebox | ||||||
Kohana | ||||||
PHP on TRAX | ||||||
PHPDevShell | ||||||
PhpOpenbiz | OpenBiz & Cubi | |||||
Prado | ||||||
QPHP | QPHP | |||||
Seagull | ||||||
Symfony | ||||||
WACT | Web Application Component Toolkit | |||||
WASP | http://wasp.sourceforge.net/content/ | |||||
Yii | ||||||
Zend | ||||||
ZooP |
A Model-View-Controller (Modell-Nézet-Vezérlő) egy gyakran használatos szoftver tervezési minta, amely három meghatározó részre osztja az alkalmazást.
PHP alkalmazás készítésekor az alapvető MVC struktúra létrehozásához szükségünk lesz három mappára (models, views, controllers) és egy index.php fájlra, ami az elsődleges általános vezérlő lesz és keresztül fog menni rajta minden kérés, amiket rögtön továbbít is a megfelelő konkrét vezérlőknek. A fájlokat a következő szempontok szerint választjuk szét:
A vezérlők közül az elsődleges az előbb említett router.php, ami a kérés GET paraméterezése alapján határozza meg, hogy melyik további vezérlőt hívja meg. Egy link tehát a következőképpen fog kinézni:
http://.../myMVC/index.php?test&data=mvc
Ahol a 'myMVC' könyvtár a webes alkalmazás gyökér könyvtárát jelöli a serveren, a 'test' az aloldal, amit megnyitni szeretnénk a 'data=mvc' paraméterezéssel. Az utóbbi a router számára még nem fontos információ, ezt majd a konkrét vezérlő kezeli le.
Első lépésben felbontjuk a paramétereket a megfelelő részekre. Az & jel menténi felbontás megfelelő lesz, ezek közül az első elem a megtekinteni kívánt oldal neve, ezt egy külön változóban tároljuk.
Következő lépésként meghatározzuk a kért oldalhoz tartozó vezérlőt és ha megtaláltuk a fájlt és a hozzá tartozó vezérlő oldalt is, akkor betöltjük az előbbiekben lekérdezett paramétereket továbbadva.
Érdemes még itt felhasználni a PHP-ban ismert __autoload függvényt is, ami ismeretlen osztály hívásokkor, megpróbálja automatikusan behúzni a megfelelő fájlt. Mivel nekünk fix struktúránk van, pontosan megtudjuk adni, hogy hol kell keresni az éppen szükséges fájlokat. (Ehhez az is kell, hogy egységesen nevezzük el fájlainkat pl: osztály nevével megegyező, csupa kisbetűs .php)
A konkrét vezérlő (jelen esetben Test_Controller) egy osztály, ami a meghívott oldal viselkedését definiálja. Jelen példában csak egy main függvénye van, ez töltődik be kezdetkor. Szükség van egy modell és egy Nézet betöltésére erre látható példa az alábbiakban. (A modell és nézet működésének leírása később.)
Következőnek a modelleket definiáljuk. Mint láttuk a vezérlő osztályunkban, mindenképpen szükségünk lesz egy konkrétan a vezérlőhöz tartozó modellre, ez lesz a Test_Model. Ezen kívül lesz egy általánosabb modell osztályunk, ami a nézetek betöltéséért felel majd, ez a View_Loader nevet kapta a példában.
A Test_Model bevezetésével kezdjük. Jelen példában az egyszerűség kedvéért csak egy privát adattagként definiált tömbben tároljuk az adatokat, de jellemzően a modell része szokott lenni valamiféle adatbázissal való kommunikáció is. Esetünkben az egyszerű megvalósítás a következő képpen néz ki.
A View_Loader osztály fog felelni a nézetek megfelelő módon történő betöltéséért. Ehhez először is be kell azonosítani a kívánt nézet fájlt, ami tudjuk, hogy a views mappában lesz. Ezt már a konstruktorban megtehetjük.
Továbbá meg kell oldanunk, hogy a nézet megjelenítésekor, a kívánt értékek elérhetők legyenek. Ehhez egy hozzárendelő függvényt hozunk létre assign névvel, ami egy privát tömbben tárolja le ideiglenesn az adatokat.
Végül az osztály destruktorában átadjuk a lekért adatokat egy változónak, ami elérhető lesz a nézetünkből és betöltjük a nézetet magát.
A nézetek megvalósításánál már nagyon egyszerű dolgunk van, alapvetően HTML kódot kell készítenünk, amibe beszúrhatjuk a kívánt helyre, a View_Loader által eltárolt változók értékeit. A következő példában az előbb látott viewData tömbbe kimentett értékeket tudjuk használni a beillesztéshez.
A test nézet helyes definiálása után a http://.../myMVC/index.php?test&data=mvc hivatkozásra meg kell, hogy jelenjenek a modellben az 'mvc' azonosítóhoz definiált adatok, ami jelen esetben a 'works well' szöveg.
Az előbb bemutatott példa egy nagyon egyszerű alkalmazása az MVC struktúrának, ennél jóval összetettebb és több funkcióval rendelkező keretek érhetőek el.
Egy ilyen rendszerben megírt alkalmazásra található példa, a Példaprogramok fejezetben a Recept név alatt, ez az alkalmazás CodeIgniter felhasználásával készült.