A Model
A CakePHP-ben, a Rails-hez hasonlóan a model egy active record osztály kiterjesztése. Az active record egyfajta megközelítése az adatbázis-kezelésnek. Az adatbázis táblái és nézetei egy-egy osztályba vannak burkolva, míg az osztály egy objektum példánya egy rekordot reprezentál.
Ez a megközelítés azért egyszerű, mert az objektum automatikusan lekérdezi az adott tábla felépítését (ha változik a tábla szerkezet, automatikusan változik a kezelése is), így nem kell foglalkozni közvetlen sql parancsok írásával, ezt az active record megteszi helyettünk.
Ennek természetesen ára van:
- Némi overhead-del jár a dolog
- Mivel a táblaszerkezet lekérdezésére nincs mindig szükség (a tábla szerkezet viszonylag ritkán változik), ezért ezt cache-eli a rendszer. A model cache fileok a /app/tmp/cache/model alatt találhatók. Erre érdemes odafigyelni!!!! CakePHP alatt a DEBUG konstans (/app/config/core.php) értéke szerint változik:
- 0 (production mode) – csak akkor történik frissítés, ha hiányzik a cache
- 1- (különböző development mode-ok) – elég gyakran (10 másodperc) frissül a cache
Mindez azt jelenti, hogy éles rendszer esetén (ekkor a DEBUG értéke 0), ha változik a táblaszerkezet, akkor törölni kell kézzel a model cache-t, különben a rendszer a régi szerkezet szerint kezelné a táblát!!!
Névadási konvenciók
A CakePHP működése során jónéhány konvenciót vezet be, ennek (is) köszönhető könnyű kezelhetősége. Az adattáblák neveit többes számban kell megadni (pl. products). A cake egy angol nyelvhez definiált, elég jól működő szabályrendszert alkalmaz az előforduló egyes-többes számban lévő nevek átváltására (Inflector osztály, inflections szabályok – máshol lesz róla szó). Ez általunk bővíthető, DE a rendszer angol nyelvhez van kitalálva, ezért javaslom az angol elnevezések használatát. (A külvilág számára imitálható a magyar nyelvű működés, erről később.)
A model felépítése
A modelek a /app/models könyvtárban foglalnak helyet. A táblához kapcsolódó model neve a tábla neve egyesszámban (tehát a példánál maradva: Product az osztály neve és product.php a filenév ami az osztályt tárolja.
Egy model általános felépítése a következő: (továbbra is a Product példánál maradva)
class Product extends AppModel {
var $name = "Product";
var $validate = array(...);
var $belongsTo = array(...);
var $hasOne = array(...);
var $hasMany = array(...);
var $hasAndBelongsToMany = array(...);
function ... ;
}
Most kicsit bajban vagyok, mert az 1.1-et ismerem jobban, viszont ezek a leírások 1.2-höz készülnek. Na mindegy vágjunk bele.
Nézzük végig:
- $name: megadása nem kötelező, általában a model neve. Funkciója: ezzel a névvel jelenik meg az adat lekérdezés után a tömbben. átírását nem javaslom, egyéb mellékhatások is előfordulhatnak (pl. asszociációk során).
$data = $this->Product->findById(12); /* Ezután a $data felépítése a $name változótól függ: - ha a $name "Product": array("Product" => array(mezo1 => mezo1_ertek, ...)) */ $description = $data['Product']['description']; /* - ha megváltoztattuk az $name mezőt valami másra pl. "Termek": array("Termek" => array(mezo1 => mezo1_ertek, ...)) */ $description = $data['Termek']['description']; - $validate: adatok ellenőrzésére szolgáló szabályok listája
- $belongsTo, $hasOne, $hasMany, $hasAndBelongsToMany: az asszociációk egy külön témakör, később foglalkozok velük.
- Model metódusok: Később részletezve.
- Saját metódusok: saját metódusokat szabadon készithetünk munkánk egyszerűsitésére. (pl. a modelhez kapcsolódó, bonyolultabb, de ismétlődő lekérezésekhez – DRY szemlélet)