chaihongjun.me

thinkphp5.0自定义404页面方式

希望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的配置也完全对应。

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»