Kohana 3:如何将完全控制传递给控制器​​中的其他动作?

时间:2011-04-12 21:44:58

标签: kohana-3

在我的控制器中,我有一个调用parent::before()的before()函数,然后在父级返回后执行一些额外的处理。基于特定条件,我想“保存”原始请求并将执行传递给特定操作。这是我的before()函数。

public function before() {
        parent::before();
        $this->uri = Request::Instance()->uri;
        $match = ORM::factory('survey_tester')
                    ->where('eid','=',$this->template->user->samaccountname)
                    ->find();
        if (!$match->loaded()) {
            self::action_tester("add",$this->template->user);
        }
    }

正在调用的行动......

public function action_tester($op=null,$user=null) {
        $testers                            = ORM::factory('survey_tester')->find_all();
        $tester                         = array();
        $this->template->title              = 'Some new title';
        $this->template->styles         = array('assets/css/survey/survey.css' => 'screen');
        $this->template->scripts            = array('assets/js/survey/tester.js');

        $tester['title']                        = $this->template->title;
        $tester['user']                     = $this->template->user;

        switch ($op) {
            case "add":
                $tester = ORM::factory('survey_tester');
                $tester->name = $user->displayname;
                $tester->email = $user->mail;
                $tester->division = $user->division;
                $tester->eid = $user->samaccountname;
                if ($tester->save()) {
                    $this->template->content = new View('pages/survey/tester_add', $admin);
                } else {
                    $this->template->content = new View('pages/survey/tester_error', $admin);
                }
                break;
            default:
                break;
        }
    }

这一切似乎都很好。这是为了提示用户提供$ user(由LDAP填充)未提供的特定信息,如果这是他们第一次因任何原因击中控制器。

问题是视图没有渲染。而是控制权传递回最初请求的任何动作。该控制器称为调查。如果我浏览到http://my.site.com/survey并使用新的用户信息登录,则会写入记录并获取action_index视图而不是我的action_tester视图。

我无法弄清楚我在这里做错了什么。任何想法将不胜感激。谢谢。

编辑:我设法使用$this->request->action = 'tester';让这个工作(排序),但我不知道如何为请求添加/设置新的参数。

1 个答案:

答案 0 :(得分:1)

问题是你正在调用你的方法(action_tester),但是在调用before方法之后Kohana仍然会调用原始动作,这将改变响应内容覆盖action_tester()中所做的更改

您可以在before()方法中更改正在调用的操作(之前调用之后):

$this->request->action('action_tester');

在调用before方法之后,它应该调用新的Action(action_tester)而不是旧的Action,但是那时你需要对你传递参数的方式做一些事情。

或者您可以在某些条件下重定向请求:

if($something) {
    $this->request->redirect('controller/tester');
}

无论如何,这似乎不是一个好方法。