在我的控制器中,我有一个调用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';
让这个工作(排序),但我不知道如何为请求添加/设置新的参数。
答案 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');
}
无论如何,这似乎不是一个好方法。