Kohana создает экземпляр функции контроллера в другом контроллере

Я хочу создать экземпляр функции контроллера 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, где на самом деле перечислены продукты.

у меня есть в продаже.php

публичная функция 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();


    }

Спасибо!


person dana    schedule 14.02.2011    source источник
comment
Какую версию Коханы вы используете? Я предполагаю, что это Kohana 3. Но я предполагаю, что это все еще 3.0.x.   -  person Ikke    schedule 14.02.2011
comment
это кохана 3. это можно сделать?   -  person dana    schedule 14.02.2011
comment
Я не узнаю этот класс Dispatch. От куда это?   -  person SpadXIII    schedule 14.02.2011


Ответы (1)


Не рекомендуется соединять контроллеры друг с другом таким образом. Таким образом, ваше приложение будет очень привязано, и оно превратится в беспорядок.

Постарайтесь отделить вещи настолько, насколько это возможно. Вы можете сделать это, например, поместив логику в модель, откуда контроллеры могут ее получить.

В идеальной ситуации ваш контроллер вообще не будет обрабатывать столько данных, но в основном будет пытаться моделировать ваши представления.

В настоящее время предпочтительным методом будет использование классов представлений, которые передают данные из ваших моделей в ваши представления. Таким образом, представление будет в основном стоять само по себе и будет очень мало связано с контроллером, что упрощает повторное использование ваших представлений.

Еще одна особенность Kohana-3, которая может прийти на ум, — это использование класса Request для выполнения дополнительного внутренний запрос, который позволит вам повторно использовать вывод контроллера без привязки.

Вы бы использовали это так:

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

Где ответ — это визуализированный вывод из выполненного запроса, который вы можете вывести в своем представлении. Этот метод подходит для корзины, которая отображается на каждой странице.

person Ikke    schedule 14.02.2011
comment
это не работает так, когда он выполняется, он фактически пытается вставить пустую корзину в базу данных... - person dana; 14.02.2011
comment
Не могли бы вы подробнее рассказать о том, что вы делаете (отредактируйте свой вопрос)? - person Ikke; 14.02.2011
comment
я только что отредактировал вопрос. Я надеюсь, что это достаточно ясно, и достаточно логичен мой вопрос. - person dana; 14.02.2011