4

我正在尝试使用 CakePHP 2.1.0实现类似Mark Story 的“Down for Maintenance”页面。我非常接近实现这一目标,但我遇到了两个我可以使用一些帮助的问题。首先,这里是所有相关代码(六个文件):

1)应用程序/配置/bootstrap.php:

Configure::write('App.maintenance', true);

2) 应用/配置/core.php:

Configure::write('debug', 1);

...

Configure::write('Exception', array(
    'handler' => 'ErrorHandler::handleException',
    'renderer' => 'AppExceptionRenderer',
    'log' => true
));

3) 应用程序/控制器/AppController.php:

if (Configure::read('App.maintenance') == true) {
    App::uses('DownForMaintenanceException', 'Error/Exception');
    throw new DownForMaintenanceException(null);
}

4) 应用程序/Lib/错误/异常/DownForMaintenanceException.php:

<?php
class DownForMaintenanceException extends CakeException {}

5) app/Lib/Error/AppExceptionRenderer.php:

<?php
App::uses('ExceptionRenderer', 'Error');

class AppExceptionRenderer extends ExceptionRenderer {
    function _outputMessage($template) {
        // Call the "beforeFilter" method so that the "Page Not Found" page will
        // know if the user is logged in or not and, therefore, show the links that
        // it is supposed to show.

        if (Configure::read('App.maintenance') == false)
        {
            $this->controller->beforeFilter();
        }

        parent::_outputMessage($template);
    }

    public function downForMaintenance() {
        $url = $this->controller->request->here();
        $code = 403;
        $this->controller->response->statusCode($code);
        $this->controller->set(array(
            'code' => $code,
            'url' => h($url),
            'isMobile' => $this->controller->RequestHandler->isMobile(),
            'logged_in' => false,
            'title_for_layout' => 'Down for Maintenance'
        ));
        $this->_outputMessage($this->template);
    }
}

6) 应用程序/视图/错误/down_for_maintenance.ctp:

<p>Down for Maintenance</p>

现在,对于我遇到的两个问题。首先,此代码仅在调试设置高于 1 时才有效。对此我能做些什么吗?这是否表明我正在以错误的方式解决这个问题?第二个问题是,虽然我在“downForMaintenance”方法中将“isMobile”和“logged_in”视图变量设置为布尔值,但“app/View/Layouts/default.ctp”文件将它们视为字符串。我能做些什么呢?

谢谢!

4

3 回答 3

16

这是 cakephp 的快速而肮脏的维护页面

在公共 index.php 中

define('MAINTENANCE', 0); 
if(MAINTENANCE > 0 && $_SERVER['REMOTE_ADDR'] !='188.YOUR.IP.HERE')
{
require('maintenance.php'); die(); 
}

然后,当您想关闭您的网站时,只需更改 MAINTENANCE = 1,它仍然可以从您的家/办公室查看。

奖励:适用于所有版本的蛋糕!

于 2012-03-12T21:36:23.100 回答
3

一种更优雅的方法是在最顶部添加一条覆盖任何其他路线的路线routes.php

//Uncomment to set the site to "under construction"
Router::connect('/*', array('controller' => 'pages', 'action' => 'underConstruction'));

//any other route should be underneath 

如果你想添加任何条件,你也可以在这里做:

define('MAINTENANCE', 0); 
if(MAINTENANCE > 0 && $_SERVER['REMOTE_ADDR'] !='188.YOUR.IP.HERE')
    Router::connect('/*', array('controller' => 'pages', 'action' => 'underConstruction'));
}
于 2015-10-21T13:48:37.197 回答
0

我们需要创建一个自定义的调度过滤器,CakePHP 已经涵盖了您。检查下面的链接

http://josediazgonzalez.com/2013/12/13/simple-application-maintenance-mode/

于 2014-07-15T10:09:13.523 回答