Kohana在另一个控制器中实例化控制器功能

时间:2011-02-14 09:45:06

标签: controller kohana-3 dispatch instantiation

我想实例化一个kohana控制器功能,从另一个控制器的购物篮中获取内容。

换句话说,在一个控制器中我(在basket.php中)

     public function action_index()
{
    $basket   = $this->basket;
    $contents = $basket->contents->find_all();

    $this->view->basket   = $basket;
    $this->view->contents = $contents;
}

我希望在其他控制器sale.php中调用此函数,因为我希望已经存在于购物篮中的产品在列表中以某种方式标记。 我想在控制器sale.php中调用此函数,其中实际列出了产品。

我在sale.php

public function action_browse($ id,$ category_id = NULL)     {

    $sale = Model::factory('sale')->active()->find($id);
    $basket_content = $this->user->get_basket($sale);


    if ( ! $sale->loaded())
    { 
        throw new Kohana_Request_Exception('Sale not found.');
    }

    if (isset($category_id))
    {
        $category = $sale->categories->find($category_id);
        if ( ! $category->loaded())
        {
            throw new Kohana_Request_Exception('Category not found.');
        }

        $products = $sale->products->category($category_id)->find_all();


        $this->view->category = $category;
    }
    else
    {
        $products = $sale->products->find_all();


    }

谢谢!

1 个答案:

答案 0 :(得分:1)

不建议将控制器彼此耦合。这样你的应用程序将非常紧密,它会变得一团糟。

尝试尽可能地分解事物。例如,您可以通过将逻辑放在控制器可以获取它的模型中来执行此操作。

在一个理想的情况下,你的控制器根本不会处理那么多的数据,但它主要是试图模拟你的视图。

当前首选的方法是使用视图类,将模型中的数据传递给视图。这样,视图主要依赖于它自己,并且与控制器的连接很少,这使得重用视图变得更加容易。

考虑到Kohana-3的另一个特性是使用Request类来执行额外的内部请求,这将允许您以分离的方式重用控制器的输出。

您可以这样使用它:

$response = Request::factory('basket/show')->execute()->response

其中response是已执行请求的渲染输出,您可以在视图中输出。此方法适用于在每个页面上呈现的篮子。