Dynamické nahrávanie modelu

publikované: od: Tibor Piňo
Tagy: ,

CakePHP 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.

VN:F [1.8.3_1051]
Rating: 0.0/5 (0 votes cast)

Vlož komentár

XHTML: Môžete použiť nasledujúce tagy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>