Dynamické nahrávanie modelu
publikované: od: Tibor PiňoCakePHP disponuje prepracovaným mechanizmom, ktorý spája modely podľa definovaných väzieb a na základe týchto väzieb automaticky vytvára objekty modelov. Avšak môže nastať situácia, kedy potrebuje nahrať model dynamicky až za behu aplikácie. CakePHP nám ponúka niekoľko možností.
V praxi môže nastať situácia, kedy potrebujeme dynamicky nahrať model z controlleru alebo z modelu tzn. až za behu samotnej aplikácie. Najprv si predstavíme spôsob dynamického nahrávania modelu z controlleru.
Dynamické nahrávanie modelu z controlleru
Len si pripomeňme, že za normálnych okolností môžeme model v controlleri nahrať pomocou premennej $uses
class ArticlesController extends AppController {
var $name = 'Articles';
var $uses = array('Comment');
}
Takto sa pri každom použití controlleru Articles sa nahrá a vytvorí objekt modelu Comment (samozrejme ak máme definované väzby v modeloch, napr. väzbu Article hasMany Comment, nemusíme explicitne uvádzať, že sa má daný model Comment nahrávať). Takéto správanie nemusí byť vždy žiadúce a nahratie modelu a vytvorenie jeho objektu budeme chcieť urobiť dynamicky, napr. iba pri vykonávaní akcie add. K tomuto účelu využijeme triedu App a jej metódu import
class ArticlesController extends AppController {
var $name = 'Articles';
function add() {
//dynamicke nahratie modelu a vytvorenie objektu
App::import('Model','Comment');
$comment = new Comment;
//volanie metody test z modelu Comment
$comment->test();
}
}
Dynamické nahrávanie modelu z iného modelu
Vyššie spomenutý postup je platný aj pre dynamické nahrávanie modelu z iného modelu. Takto by vyzeralo dynamické nahratie a vytvorenie objektu modelu Comment z modelu Article
class Article extends AppModel {
var $name = 'Article';
var $useTable = 'articles';
function addArticle() {
//dynamicke nahratie modelu a vytvorenie objektu
App::import('Model','Comment');
$comment = new Comment;
//volanie metody test z modelu Comment
$comment->test();
}
}
V tomto prípade máme ešte jednu možnosť, ktorá sa však od predchádzajúcej líši najmä situáciou, v ktorej by mala byť použitá. Tou možnosťou je použitie metódy bindModel(). Musím však pripomenúť, že táto metóda je primárne určená na vytváranie dynamických väzieb medzi samotnými modelmi, i napriek tomu patrí medzi možnosti dynamického nahrávanie modelu. V našom prípade sme dynamicky vytvorili väzbu Article hasMany Comment a automaticky získali objekt na model Comment
class Article extends AppModel {
var $name = 'Article';
var $useTable = 'articles';
function addArticle() {
//dynamicke vytovrenie vazby a automaticke vytvorenie objektu modelu Comment
$this->bindModel(
array('hasMany' => array(
'Comment' => array(
'className' => 'Comment'
)
)
)
);
//volanie metody test z modelu Comment
$this->Comment->test();
}
}
Dynamické nahratie modelu sa uskutoční iba v prípade volania metódy addArticle, čo je chovanie, ktorého sme chceli dosiahnuť.
Dúfam, že tento krátky článok bude v budúcnosti nápomocný. Rád uvítam vaše poznatky, nápady a pripomienky v diskusii k článku.