View on GitHub

yii2-cookbook-chinese

Yii Application Development Cookbook(Third Edition)中文翻译

维护模式

有时,需要微调一些应用的设置,或者从一个备份中恢复数据库。当处理这些任务时,你不希望允许每一个人使用应用,因为它可能会导致丢失最新的用户消息,或者展示应用实现的细节。

在这个小节中,我们将会看到如何向除了开发者以外的每一个人展示一条维护消息。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的yii2-app-basic应用。

如何做…

执行如下步骤:

  1. 首先,我们需要创建protected/controllers/MaintenanceController.php。我们按如下方式做:
class MaintenanceController extends Controller
{
    public function actionIndex()
    {
        $this->renderPartial("index");
    }
}
  1. 然后,我们创建一个名为views/maintenance/index.php的视图,如下所示:
<?php
use yii\helpers\Html;
?>
<!doctype html>
<head>
    <meta charset="utf-8" />
    <title><?php echo
        Html::encode(Yii::$app->name)?>is under maintenance</title>
</head>
<body>
<h1><?php echo CHtml::encode(Yii::$app->name)?>is under
    maintenance</h1>
<p>We'll be back soon. If we aren't back for too
    long,please drop a message to <?php echo
    Yii::$app->params['adminEmail']?>.</p>
<p>Meanwhile, it is a good time to get a cup of coffee,to read a book or to check email.</p>
</body>
  1. 现在,我们需要添加一行代码到config/web.php,如下所示:
$config = [
    'catchAll' => file_exists(dirname(__DIR__).'/.maintenance') && !(isset($_COOKIE['secret']) && $_COOKIE['secret']=="password") ? ['maintenance/index'] : null,
    // …
]
  1. 现在为了前往维护模式,你需要在你的网站目录下创建一个名为.maintenance的文件。做完这一步后,你将会看到这个页面。

为了回到正常模式,你只需要删除这个文件。为了查看网站的维护模式,你可以创建一个名为secret的cookie,它的值是等于password

工作原理…

一个Yii web应用提供了一种方式,可以拦截所有可能的请求,并这它们重定向到一个指定的控制器动作上。你可以通过设置yii\web\Application::catchAll为一个包含应用路由的数组来做到它:

'catchAll' => ['maintenance/index'],

这个维护控制器本身并不特别;它只是渲染一个带有文字的视图。

我们需要一种简单的方式,来打开或者关闭维护模式。因为应用配置文件是一个特殊的PHP文件,我们可以使用一个简单的检查,查看制定文件是否存在,来做到这些。如下所示:

file_exists(dirname(__DIR__) . '/.maintenance')

此外,我们检查cookie值来能覆盖维护模式。如下所示:

!(isset($_COOKIE['secret']) && $_COOKIE['secret']=="password")

参考

为了了解更多关于在Yii应用中如何捕获所有请求,以及为production ready solution用于维护,参考http://www.yiiframework.com/doc-2.0/yii-webapplication.html#$catchAll-detail