希望thinkphp5.0开发的网站404页面也更好看,能告诉访问错误,同时提供动态内容保证访问流量不轻易丢失。开发思路也是很简单,由于系统配置文件config.php设置了默认的空控制器:
// config.php // 默认的空控制器名 'empty_controller' => 'Error',
这个控制器的名字为"Error",意味着所有没有被访问到的控制器最后都访问这个控制器,因此可以用这个控制器来控制404页面的内容:
<?php namespace app\index\controller; use app\common\controller\HomeBase; use app\common\model\Article as ArticleModel; use app\common\model\Category as CategoryModel; use app\common\helper\UrlHelper; use think\Controller; use think\Db; /** * 404 页面 * Class Error * @package app\index\controller */ class Error extends HomeBase { public function index() { //顶部导航 $category = CategoryModel::all(); $this->assign('category', $category); /** 侧栏数据 **/ $limitsize = 5; /* 头条 */ $top['status'] = ['=', 1]; $top['is_top'] = ['=', 1]; $topArticles = ArticleModel::where($top)->order('create_time', 'desc')->limit($limitsize)->select(); // 添加文章链接 foreach ($topArticles as $top) { $top->url = UrlHelper::generateArticleUrl($top->id); } $this->assign('topArticles', $topArticles); /* 特别推荐 */ $special['status'] = ['=', 1]; $special['is_recommend'] = ['=', 1]; $specialArticles = ArticleModel::where($special)->order('create_time', 'desc')->limit($limitsize)->select(); // 添加文章链接 foreach ($specialArticles as $special) { $special->url = UrlHelper::generateArticleUrl($special->id); } $this->assign('specialArticles', $specialArticles); /* 热门随机文章 */ $random['status'] = ['=', 1]; $maxID = ArticleModel::max('id'); $randomArticles = ArticleModel::where($random) ->where('id', '>=', 1) ->where('id', '<=', $maxID) ->orderRaw('RAND()') ->limit($limitsize) ->select(); // 添加文章链接 foreach ($randomArticles as $random) { $random->url = UrlHelper::generateArticleUrl($random->id); } $this->assign('randomArticles', $randomArticles); //////////////////////////////////////////////////////////////////////////// /* 列表页右侧 最新发布 */ $latestArticles = ArticleModel::where('status', 1) ->where('id', '>=', 1) ->where('id', '<=', $maxID) ->orderRaw('RAND()') ->limit($limitsize) ->select(); // 添加文章链接 foreach ($latestArticles as $latest) { $latest->url = UrlHelper::generateArticleUrl($latest->id); } $this->assign('latestArticles', $latestArticles); /* 列表页右侧 随机精选 */ $random['status'] = ['=', 1]; $maxID = ArticleModel::max('id'); $randomHitArticles = ArticleModel::where('status', 1) ->where('id', '>=', 1) ->where('id', '<=', $maxID) ->whereOr('is_recommend', 1) ->whereOr('is_top', 1) ->orderRaw('RAND()') ->limit($limitsize) ->select(); // 添加文章链接 foreach ($randomHitArticles as $randomHit) { $randomHit->url = UrlHelper::generateArticleUrl($randomHit->id); } $this->assign('randomHitArticles', $randomHitArticles); /* 加载系统配置 */ $site_config = Db::name('system')->field('value')->where('name', 'site_config')->find(); $site_config = unserialize($site_config['value']); $this->assign('site_config', $site_config); return $this->fetch('error/index'); } }
以上是本站的部分代码,然后再创建对应的模板页。当完成程序端之后,需要再去确认服务器端nginx的配置:
error_page 404 /404.html;
根据nginx这个错误页设置,我们还需要在程序端配置对应的路由:
//404页面 Route::get('404', 'index/error/index');
当访问到不存在的页面的时候,系统指派访问Error控制器的index方法,加载对应的模板,同时服务器nginx的配置也完全对应。