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)

Adatok ellenőrzése