0

別のコントローラーで、ショッピング バスケットからコンテンツを取得する kohana コントローラー関数をインスタンス化したいと考えています。

言い換えれば、私が持っている1つのコントローラーで(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();


    }

ありがとう!

4

1 に答える 1

1

このようにコントローラーを相互に結合することはお勧めしません。このようにすると、アプリケーションは非常に緊密になり、混乱することになります。

できるだけ物事を切り離してみてください。これを行うには、たとえば、コントローラーがロジックをフェッチできるモデルにロジックを配置します。

理想的な状況では、コントローラーはそれほど多くのデータを処理しませんが、主にモデルをビューに合わせて試行します。

現在推奨されている方法は、モデルからビューにデータを渡すビュークラスを使用することです。このように、ビューはほとんどそれ自体で成り立ち、コントローラーへの接続がほとんどないため、ビューの再利用が容易になります。

頭に浮かぶKohana-3のもう1つの機能は、Requestクラスを使用して追加の内部リクエストを実行することです。これにより、コントローラーの出力を分離して再利用できます。

次のように使用します。

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

ここで、応答は、実行された要求からレンダリングされた出力であり、ビューに出力できます。この方法は、すべてのページにレンダリングされるバスケットに適しています。

于 2011-02-14T10:16:29.760 に答える