维护模式
有时,需要微调一些应用的设置,或者从一个备份中恢复数据库。当处理这些任务时,你不希望允许每一个人使用应用,因为它可能会导致丢失最新的用户消息,或者展示应用实现的细节。
在这个小节中,我们将会看到如何向除了开发者以外的每一个人展示一条维护消息。
准备
按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的yii2-app-basic
应用。
如何做…
执行如下步骤:
- 首先,我们需要创建
protected/controllers/MaintenanceController.php
。我们按如下方式做:
class MaintenanceController extends Controller
{
public function actionIndex()
{
$this->renderPartial("index");
}
}
- 然后,我们创建一个名为
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>
- 现在,我们需要添加一行代码到
config/web.php
,如下所示:
$config = [
'catchAll' => file_exists(dirname(__DIR__).'/.maintenance') && !(isset($_COOKIE['secret']) && $_COOKIE['secret']=="password") ? ['maintenance/index'] : null,
// …
]
- 现在为了前往维护模式,你需要在你的网站目录下创建一个名为
.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。