Как использовать контроллер в контроллере? - PullRequest
0 голосов
/ 06 ноября 2011

Я использую Kohana 3.2 и у меня возникают проблемы с вызовом выхода контроллера из другого контроллера.

Что я хочу ...

На некоторых страницах у меня есть меню,а в других нет.Я хочу использовать гибкость системы запросов HMVC.В контроллере страницы я хочу вызвать другой контроллер, который отвечает за создание меню.

Что у меня есть в данный момент:

file menu.php:

<code><?php defined('SYSPATH') or die('No direct script access.');

class Controller_Menu extends Controller 
{
    private $_model = null;

    public function __construct(Request $request, Response $response)
    {       
        parent::__construct($request, $response);
        $this->_model = Model::factory('menu');
    }

    public function action_getMenu()
    {
        $content = array();
        $content['menuItems'] = $this->_model->getMenuItems();

        // Render and output.
        $this->request->response = View::factory('blocks/menu', $content);
        //echo '<pre>'; print_r($this->request->response->render()); echo '
';умереть();}}

somepage.php

public function action_index()
{
    $this->template->title = 'someTitle';;
    $contentData['pageTitle'] = 'someTitle';
    $contentData['contentData'] = 'someData';

    #include the menu       
    $menuBlock = Request::factory('menu/getMenu')->execute();
    $menuData =  array('menu' => $menuBlock);
    $this->template->menu = View::factory('pages/menu')->set('menu',$menuData);

    $this->template->content = View::factory('pages/somePage', $contentData);

    $view = $this->response->body($this->template);
    $this->response->body($view);
}

Если я раскомментирую следующую строку в menu.php, я увижу отображенное меню:

<code>//echo '<pre>'; print_r($this->request->response->render()); echo '
';умереть();

Так что, думаю, с этой частью все в порядке.Проблема в следующей строке в somepage.php:

$menuBlock = Request::factory('menu/getMenu')->execute();

Это возвращает мне объект ответа.Что бы я ни делал, я не получаю вывод в $ this-> template-> menu.

$ this-> template-> menu = View :: factory ('pages / menu') -> set ('menu', $ menuData);

Что нужно сделать, чтобы иметь$ this-> template-> menu содержит представление, так что я могу использовать его правильно?

Надеюсь, все это имеет смысл.Это то, что я хотел бы сделать, но, возможно, я совершенно не на том пути.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Я бы сделал это так:

class Controller_Menu extends Controller
{
    public function action_build()
    {
        // Load the menu view. 
        $view = View::factory('navigation/menu');
        // Return view as response-
        $this->response->body($view->render());
    }
}

В вашем контроллере вы получите следующее меню:

// Make request and get response body.
$menu = Request::factory('menu/build')->execute()->body();
// e.g. assign menu to template sidebar.
$this->template->sidebar = Request:.factory('menu/build')->execute()->body();

Я бы не использовал метод __construct в ваших контроллерах. Вместо этого используйте before (), этого достаточно для большинства проблем (например, auth):

public function before()
{
    // Call aprent before, must be done here.
    parent::before();
    // e.g. heck whether user is logged in.
    if ( !Auth::instance()->logged_in() )
    {
        //Redirect if not logged in or something like this.
    }
}
1 голос
/ 11 ноября 2011

Я нашел ответ на свою проблему менее чем через час после запроса.Я просто забыл поставить его здесь.

В somePage.php изменить:

$menuBlock = Request::factory('menu/getMenu')->execute(); 
$menuData = array('menu' => $menuBlock); 
$this->template->menu = View::factory('pages/menu')->set('menu',$menuData); 

Кому:

$this->template->menu = Request::factory('menu/getMenuBlock')->execute()->body(); 

А в menu.php изменить:

$this->request->response = View::factory('blocks/menu', $content); 

Кому:

$request = View::factory('blocks/menu', $content); 
$this->response->body($request); 

Надеюсь, это поможет кому-то еще.

...