【发布时间】:2013-01-26 21:15:52
【问题描述】:
我注意到重定向控制器方法有时无法正常工作。当我设置 debug > 0 时没有消息出现。我在调用重定向方法之前不回显任何代码,所以它不应该是因为“标头已发送”。
让我们看看我的 ArticlesController 添加操作,其中重定向在一个实例中起作用,但在另一个实例中不起作用。
public function add($page = null) {
// Custom component to get if user has required access level
// of page to write an article. If not, setflash to an error message
// specific to user's access level and redirect.
$access_message = $this->CustomPage->AccessMessage(4, $this->viewVars['access']);
if($access_message){
// Flash works but redirect does not
$this->Session->setFlash(__($access_message));
$this->redirect(array('action' => 'index', 'page' => $page));
// Also tried
// $this->redirect(array('controller'=>'articles', 'action' => 'index', 'page' => $page), null, true);
} else
{
if ($this->request->is('post')) {
$this->Article->create();
if ($this->Article->save($this->request->data)) {
// BLAH BLAH save post, do other stuff
// BLAH BLAH save post, do other stuff
// This flash and redirect works
$this->Session->setFlash(__('The article has been saved'));
$this->redirect(array('action' => 'view', 'id' => $article_id, 'page' => $page));
} else {
$this->Session->setFlash(__('The article could not be saved. Please, try again.'));
} // end else if article cannot be saved
} // if method is post
} // end if user has access
} // end add action
它肯定与组件有关,但我不确定是什么。也许由于在使用组件后立即调用了重定向,因此“$this”试图在组件而不是控制器上执行重定向方法。我尝试了 $this->Article->redirect 并在重定向之前重新加载 Article 模型,但这些都不起作用。
我的组件代码是:
public function AccessMessage($required_level, $user_level) {
if(!$user_level && $this->_View->viewVars['access']){
$user_level = $this->_View->viewVars['access'];
}
if(!$required_level || !$user_level || $user_level != $required_level){
$accessModel = ClassRegistry::init('Access');
$access_message = $accessModel->field('access_message', array('Access.id' => $required_level));
}
return $access_message;
}
编辑 1: 好的,所以我进行了一些挖掘,以准确找出问题的根源。组件的使用不是我之前认为的问题。如果我的组件中只有
public function AccessMessage($required_level, $user_level) {
if(!$user_level && $this->_View->viewVars['access']){
$user_level = $this->_View->viewVars['access'];
}
if(!$required_level || !$user_level || $user_level != $required_level){
$access_message = 1;
}
return $access_message;
}
然后就可以了。问题在于正确实现的这两行,因为它们返回了我期望的 $access_message 的值,但是它们干扰了重定向的能力。也许标头已经发出?
$accessModel = ClassRegistry::init('Access');
$access_message = $accessModel->field('access_message', array('Access.id' => $required_level));
请注意我也尝试过:
$access_message = ClassRegistry::init('Access')->field('access_message', array('Access.id' => $required_level));
和
$this->loadModel('Access');
$access_message = $this->Access->field('access_message', array('Access.id' => $required_level));
要点:
组件要点:https://gist.github.com/970a951715205c222348
控制器要点:https://gist.github.com/2b90e5af2518a81672fb
访问模型要点:https://gist.github.com/bhndbrwneyes/f333a93f0a21302d832f
【问题讨论】:
-
您是否在组件的
_construct()或任何回调(如initialize()、startup()等)中执行任何操作? -
这看起来太具体到您的代码 - 任何人都可以看到或重现“问题”?
标签: cakephp redirect controller