如果异常发生,Cakephp 3重定向不起作用

时间:2015-10-06 21:51:23

标签: php cakephp redirect cookies cakephp-3.0

我在控制器中有一个动作,我调用一个函数来检查是否设置了cookie,如果没有设置cookie,那么它应该重定向到其他地方。

在同一个控制器中,我对某些变量进行了评估,如果它们没有设置,则抛出一个禁止的异常,但即使没有设置cookie,它也不会重定向,并且会出现禁止的消息

正确的操作应该是重定向的,并且在cookie不存在时或者至少是我需要的时候,永远不会评估变量。

此功能在appController

public function isCookieSet(){
  if(!$this->Cookie->check('cookie')){
    return $this->redirect($this->referer());
  }
}

我控制器内的代码

public function editarImg($negocio_id=null){    

    $this->isCookieSet(); //should redirect here

    //but executes until here
    if((!isset($this->perRol['crear_negocios']) || $this->perRol['crear_negocios']==0) || 
      (!isset($this->perRol['cargar_elim_imagenes']) || $this->perRol['cargar_elim_imagenes']==0)){
      throw new ForbiddenException($this->getMensajeError(403));
    }

    ...
}

2 个答案:

答案 0 :(得分:0)

问题中的代码可以重写(为清楚起见),如下所示:

public function editarImg($negocio_id=null){    
    if(!$this->Cookie->check('cookie')){
        $this->redirect($this->referer());
    }

    // more code

正在忽略对redirect的调用的返回值,“更多代码”总是执行。

这不是预期调用方法redirect的方式,如mentioned in the docs(强调添加):

  

该方法将返回具有适当标头集的响应实例。 您应该从操作返回响应实例,以防止视图呈现并让调度程序处理实际的重定向。

这也提到in the migration guide

  

Cake\Controller\Controller::redirect()的签名已更改为Controller::redirect(string|array $url, int $status = null)。第三个参数$ exit已被删除。该方法不再发送响应和退出脚本,而是返回一个具有相应标头集的Response实例。

代码示例

问题中的代码必须等同于:

public function editarImg($negocio_id=null){    
    if(!$this->Cookie->check('cookie')){
        return $this->redirect($this->referer()); # <- return the response object
    }

    // more code

答案 1 :(得分:0)

试试这个,它应该有效:

public function isCookieSet(){
  if(!$this->Cookie->check('cookie')){

    // return $this->redirect($this->referer()); <- not working

    $this->response = $this->redirect($this->referer());
    $this->response->send();
    exit;

  }
}