在CakePHP中重定向到维护页面不起作用

时间:2011-07-21 18:39:41

标签: cakephp error-handling

我正在尝试设置一个维护页面,以便在禁用该网站时,无论请求哪个页面,它都应该出现。

我目前尝试使用$this->cakeError()执行此操作:

app_controller.php中的

function beforeFilter(){
....
if($this->__get_config('maintenance_status') == 1){
        $this->cakeError('maintenance', array('message' => $this->__get_config('maintenance_message')));    
    }
....
}

app_error.php

function maintenance($message){
    $this->controller->set('message', $message['message']); 
    ($this->controller->RequestHandler->isAjax()) ? $this->_outputMessage('ajax_maintenance') : $this->_outputMessage('maintenance');
}

问题在于发生了致命错误,其中包含:Call to a member function isAjax() on a non-object。但我显然在RequestHandler中设置了app_controller.php组件。此外,我尝试从另一个控制器中调用此错误,它不会给我任何致命错误。

可能是什么问题?为什么它不承认我已经将组件初始化了?

3 个答案:

答案 0 :(得分:0)

From the CakePHP book

  

调用此方法将向用户显示错误页面并停止应用程序中的任何进一步处理

我假设您在AppController的某些回调中调用错误。

如果是这种情况,您很可能在实例化组件之前停止执行脚本。这肯定会导致你的错误。

现在,我认为这个错误很有可能重新评估你如何处理这个问题。这真的是一个错误吗?您知道维护状态已设置为预期,用户将显示此页面。这不是错误。此外,您当然不希望日志中有10,000条消息告诉您已开启维护!

我认为通过利用一些控制器回调和一些代码可以更好地解决这个问题。

我不知道_get_config()是什么,所以我假设它是一个自定义用户函数,你可以在这个回调中调用。

我们将使用beforeFilter()控制器回调。

class AppController extends Controller {

    public function beforeFilter() {
        if ($this->_get_config('maintenance_status') === 1) {
            $this->redirect('/maintenance');
        }
    }

}

现在,您只需设置一个附加到自己视图的维护控制器,它将正确显示您的维护消息,并且不会在错误日志中记录维护期间的所有连接尝试。

答案 1 :(得分:0)

稍微好一点的还有使用Configure :: read(“System.maintenance”)或类似的东西。 (我倾向于命名我的配置数据,System是维护标志之类的命名空间等。)

此外,正如查尔斯所说 - 不要为预期的事件使用错误页面。错误是向用户以及应用程序处理通知等有关意外故障的信息。维护页面可以只是/ app / views / pages /文件夹中的视图文件。如果config键设置为true / 1,则重定向到该。

答案 2 :(得分:0)

你的方法似乎很聪明,但你可能会过度使用它。

我在我正在开发的网站中有类似的设置,我只是使用auth组件为我处理它。

为了提供帮助,我设置了一个新的离线布局,如果站点状态为0(离线),我强制应用程序使用。如果状态为0,则app_controller拒绝访问整个站点。

$this->Auth->deny('*');
$this->layout = "offline";

此外,在此布局中,如果用户单击消息,则会显示隐藏的登录表单。如果用户能够进行身份验证(现在的所有用户 - 开发),则使用默认模板授予整个站点访问权限。

检查一下,它可能会帮助你......

Click Here

部分代码,但您可以在上面的链接中阅读更多相关内容

function beforeFilter(){
// Site Offline = 0 , Site Online = 1
if($this->Configuration->get_site_status() == 1){
      // Allow access to the site to all users and perform all required 
      // beforeFilter code
}else{
    ...
    // If site is OFFLINE but User is logged in allow access. 
    // Later I will need to change it to only allow admin access if logged in as I am still developing
    // Everyone else will be denied access even if they are able to authenticate          
    if(!$this->Auth->user() == null){
        $this->layout = 'default';
        $this->Auth->allow('*');
    }else{        
        $this->layout = 'offline';
        $this->Auth->deny('*');
    }
    ...
  }
}