0

Fragment ヘルパー クラスを使用して Kohana (3.2.2) アプリケーションを最適化しようとしていますが、それが間違っていることに気付きました。

モデル_記事:

    public function get_articles()
    {
        /*
         * This is just a PDO wrapper, I don't like the kohana built in
         * database module
         */
        $db = DB::instance();

        $article_stmt = $db->prepare("SELECT * FROM articles");
        $article_stmt->execute();
        return $article_stmt->fetchAll();
    }


Controller_Article:

    public function action_index()
    {
        $this->template->content = View::factory('welcome/index');

        $this->template->content->articles = Model::factory('article')->get_articles();
    }


景色:

        <?php if ( ! Fragment::load('home.articles')): ?>

            <!-- cache test -->

            <?php foreach($articles as $article) echo $article->title . PHP_EOL ?>

            <?php Fragment::save(); ?>
        <?php endif; ?>


ご覧のとおり、ビューで何が起こっていても、クエリは常に実行されます。キャッシュが更新されたときにクエリを実行したい。しかし、モデル オブジェクトをビューに渡すと、いくつかの MVC 慣習が壊れてしまうのではないでしょうか?! 誰かがそれを正しく行う方法を教えてもらえますか?!

4

2 に答える 2

1

キャッシュの処理は、コントローラーが行うべきことであり、表示することではありません。

ビューからコントローラーに移動して、満足してください。Fragment モジュールは使用しませんでしたが、要点は理解できると思います。

public function action_index()
{
    $this->template->content = View::factory('welcome/index');
    if ( ! $articles = Fragment::load('home.articles') )
    {
        // It's better to use separate view for articles list
        $articles = View::factory('articles/list', array('articles' => Model::factory('article')->get_articles());
        // Hope not just an output can be captured but argument can also be passed to the save() method of the module
        Fragment::save($articles);
    }
    $this->template->content->articles = $articles;
}
于 2013-01-08T08:32:07.707 に答える
0

ビューでクエリを実行するController_Templateか (拡張する場合)、コントローラーでエコーする必要があります (拡張する場合Controller)。

Controller_Article ( Controller を拡張):

public function action_index()
{
    if ( ! Fragment::load('home.articles')):

        $template = View::factory('my_template_view');

        $template->content = View::factory('welcome/index');
        $template->content->articles = Model::factory('article')->get_articles();

        echo $template->render();   // If you won't print anything,
                                    // don't use fragments

        Fragment::save();   // Save the OUTPUT, but DOES NOT save variables
    endif;
}

 

Controller_article ( Controller_Template を拡張):

public function action_index()
{
    $this->template->content = View::factory('welcome/index');
}

表示 (ようこそ/インデックス):

<?php
    // echo $articles;     // Now Controller is not binding this variable
    if ( ! Fragment::load('home.articles')):

        // Variable - Does NOT save in Fragment
        $articles = Model::factory('article')->get_articles();

        // ECHO = save to Fragment
        foreach($articles as $article) echo $article->title . PHP_EOL;

        Fragment::save();   // Save the OUTPUT, but DOES NOT save variables
    endif;
?>

 

変数を保存する場合は、Kohana Cacheを使用します。

于 2013-02-15T17:50:22.943 に答える