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文件,如果没有访问,就无法生成了。
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); // 写入文件