墨轩道人 2017-12-08 12:04:52 1384次浏览 1条评论 5 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 回复

    是的,感谢!

您需要登录后才可以评论。登录 | 立即注册