Yii2 生成纯静态html文件

方法一. 重写 yii\web\Controller::afterAction($action, $result) 方法:

namespace frontend\controllers;

use Yii;
use yii\helpers\FileHelper;
use yii\helpers\Url;
use yii\web\Controller;

class ArticleController extends Controller
{
    public function afterAction($action, $result)
    {
        $route = $action->controller->actionParams;
        array_unshift($route, $action->controller->id . '/' . $action->id);
        $path = Url::to($route);  // '/article/view/104.html'
        if(substr($path, 0, 1) === '/'){
            $path = substr($path, 1);  // 'article/view/104.html'
        }
        FileHelper::createDirectory(dirname($path));  // 创建目录
        file_put_contents($path, $result);  // 写入文件
        return parent::afterAction($action, $result); // TODO: Change the autogenerated stub
    }
}

但是这个方法有一个弊端,就是必须访问了某个页面,才能生成静态html文件,如果没有访问,就无法生成了。


方法二. 在 actionMothod() 中调用 runAction($id, $params = []) 方法获取动作的执行结果:


namespace frontend\controllers;

use common\models\Article;
use Yii;
use yii\helpers\FileHelper;
use yii\helpers\Url;
use yii\web\Controller;
class ArticleController extends Controller
{
    public function actionIndex()
    {
        $lists = Article::find()->where(['status'=>10])->column();  // id 列表
        foreach($lists as $list){
            $path = Url::to(['acticle/view', 'id'=>$list]);  // '/acticle/view/104.html'
            if(substr($path, 0, 1) === '/'){
                $path = substr($path, 1);  // 'article/view/104.html'
            }
            FileHelper::createDirectory(dirname($path));  // 创建目录
            $result = self::runAction('view', ['id'=>$list]);  // 获取执行结果
            file_put_contents($path, $result);  // 写入文件
        }
    }
}


方法三. 调用 Yii::$app->runAction($route, $params = []) 方法获取执行结果:

$path = Url::to(['article/view', 'id'=>104]);  // '/acticle/view/104.html'
if(substr($path, 0, 1) === '/'){
    $path = substr($path, 1);  // 'article/view/104.html'
}
FileHelper::createDirectory(dirname($path));  // 创建目录
$result = Yii::$app->runAction('article/view', ['id'=>104]);  // 获取执行结果
file_put_contents($path, $result);  // 写入文件