墨轩娣 2017-12-08 12:04:52 9663次浏览 3条评论 10 0 0

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

<?php
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 = [])方法获取动作的执行结果:

<?php
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 = []) 方法获取执行结果:

<?php
$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);  // 写入文件

但是这三种方法都不能跨应用调用,也就是不能在backend中生成frontend中的html文件,不知道哪位大神有更好的方法???

  • 评论于 2018-01-14 16:15 举报

    我按照第一种方法写,的确可以生成静态页,但是如果后台对数据进行了修改,前台访问的还是之前生成的静态页,数据并没有变化,该如何解决呢?另外能不能在后台对生成静态页做管理呢?

    2 条回复
    评论于 2018-01-15 08:29 回复

    在后台调用生成静态页的前台控制器方法啊

    评论于 2018-02-01 22:20 回复

    是的,感谢!

    觉得很赞
  • 评论于 2018-04-27 10:03 举报

    可以考虑按照PHPCMS的设计思路,在数据库里保存URI,然后你就知道HTML放哪里了,更新的时候删除这个HTML文件即可。

    1 条回复
    评论于 2018-04-27 10:04 回复

    补充一下,生成HTML你需要把HTML中跟用户状态相关的都用JS或者AJAX调用。

  • 评论于 2018-09-29 16:29 举报

    我觉得吧,企业站性能损耗小,直接写个伪静态+页面缓存就好了,大型站点根本又用不着静态页面,都是什么鬼CMS带起来的纯静态的风,实在是没必要折腾这些

    , 觉得很赞
您需要登录后才可以评论。登录 | 立即注册