假设Index应用的index.php控制器如下

<?php

namespace app\index\controller;

use app\index\BaseController;
use think\facade\View;
use think\facade\Db; //数据库

class Index extends BaseController
{
    public function index($page = 1)
    {
        // 设置导航选择
        $nav = ["index"=>1];
        View::assign("nav", $nav);
        // 设置当前页数和分类ID
        View::assign("curr", $page);
        View::assign('cid', 0);

        // 从数据库读取配置项
        $config = Db::name('config')->field('k, v')->select();

        // 将配置项赋值给视图模板
        foreach ($config as $item) {
            View::assign($item['k'], $item['v']);
            if ($item['k'] == "title") {
                View::assign('title', $item['v'] . '-首页');
            }
        }

        // 获取文章分类列表
        $class = Db::name("article_class")->where('parent_id', 0)->order('order')->select();
        $class = $class->toArray();

        // 处理分类数据
        foreach ($class as $k => $v) {
            $item = $v;
            foreach ($item as $key => $value) {
                $item[$key] = $value ?? '';
            }
            $item["children"] = Db::name("article_class")->where('parent_id', $item['id'])->order('order')->select()->toArray();
            $class[$k] = $item;
        }
        // 将分类数据赋值给视图模板
        View::assign('class', $class);

        // 获取文章总条数
        $count = Db::name("article")->count();
        View::assign('count', $count);

        // 获取分页后的文章列表
        $article = Db::name("article")->order('order')->page($page, 10)->select();
        array_walk($article, function (&$vo) {
            foreach ($vo as $key => $value) {
                $vo[$key] = $value ?? '';
            }
        });

        // 将文章列表赋值给视图模板
        View::assign('article', $article);

        // 渲染视图模板并返回
        return View::fetch();
    }

    public function class($name, $page = 1)
    {
        // 设置当前页数
        View::assign("curr", $page);

        // 获取这个名字的class信息
        $crow = Db::name('article_class')->where('seo_name', $name)->find();
        if (!$crow) {
            return 404;
        }
        View::assign('curClass', $crow);
        $cid = $crow['id'];
        $cname = $crow['name'];
        $pid = $crow['parent_id'];
        // 设置导航选择
        if ($pid!=0) {
            $pname = Db::name("article_class")->where('id', $crow['parent_id'])->column("seo_name")[0];
            $nav = [$pname=>1];
        } else {
            $nav = [$crow['seo_name']=>1];
        }
        View::assign("nav", $nav);

        // 从数据库读取配置项
        $config = Db::name('config')->field('k, v')->select();

        // 将配置项赋值给视图模板
        foreach ($config as $item) {
            View::assign($item['k'], $item['v']);
            // 设置标题
            if ($item['k'] == "title") {
                View::assign('title', $item['v'] . '-' . $cname);
            }
        }

        // 设置分类ID
        View::assign('cid', $cid);

        // 获取文章分类列表
        $class = Db::name("article_class")->where('parent_id', 0)->order('order')->select()->toArray();
        // 处理分类数据
        foreach ($class as $k => $v) {
            $item = $v;
            foreach ($item as $key => $value) {
                $item[$key] = $value ?? '';
            }
            $item["children"] = Db::name("article_class")->where('parent_id', $item['id'])->order('order')->select()->toArray();
            $class[$k] = $item;
        }
        // 将分类数据赋值给视图模板
        View::assign('name', $name);
        View::assign('class', $class);

        // 获取分类的文章总条数
        $count = Db::name("article")->where('class_id', $cid)->count();
        View::assign('count', $count);

        // 获取分页后的文章列表
        $article = Db::name("article")->where('class_id', $cid)->order('order')->page($page, 10)->select();
        array_walk($article, function (&$vo) {
            foreach ($vo as $key => $value) {
                $vo[$key] = isset($value) ? $value : '';
            }
        });

        // 将文章列表赋值给视图模板
        View::assign('article', $article);

        // 渲染视图模板并返回
        return View::fetch();
    }

    public function article($id)
    {

        // 从数据库读取配置项
        $config = Db::name('config')->field('k, v')->select();

        // 将配置项赋值给视图模板
        foreach ($config as $item) {
            View::assign($item['k'], $item['v']);
        }


        // 获取文章分类列表
        $class = Db::name("article_class")->where('parent_id', 0)->order('order')->select();
        $class = $class->toArray();

        // 处理分类数据
        foreach ($class as $k => $v) {
            $item = $v;
            foreach ($item as $key => $value) {
                $item[$key] = $value ?? '';
            }
            $item["children"] = Db::name("article_class")->where('parent_id', $item['id'])->order('order')->select()->toArray();
            $class[$k] = $item;
        }
        // 将分类数据赋值给视图模板
        View::assign('class', $class);

        // 获取文章
        $article = Db::name("article")->where('id', $id)->select()->toArray();
        if (count($article) == 0) {
            return 404;
        }
        foreach ($article as &$item) {
            foreach ($item as $key => $value) {
                if (empty($value)) {
                    $item[$key] = '';
                }
                View::assign($key, $item[$key]);
            }
        }
        // 获取父分类
        $parentClass = Db::name("article_class")->where('id', $article[0]['class_id'])->find();
        View::assign('parentClass', $parentClass);
        // 获取上一篇文章
        $prevArticle = Db::name("article")->where('id', '<', $id)->order('id desc')->find();
        if ($prevArticle) {
            View::assign('prevArticle', $prevArticle);
        }
        // 获取下一篇文章
        $nextArticle = Db::name("article")->where('id', '>', $id)->order('id asc')->find();
        if ($nextArticle) {
            View::assign('nextArticle', $nextArticle);
        }
        // 将文章列表赋值给视图模板
        View::assign('article', $article[0]);
        // 渲染视图模板并返回
        return View::fetch();
    }
}

如果要访问文章,正常是走index/Index/article/id
但是路径太长不是很美观
在index应用下新建路由

<?php
namespace app\index\route;
use think\facade\Route;
Route::pattern([
    'name' => '\w+',
    'page'   => '\d+',
    'id'   => '\d+',
]);
Route::rule('article/:id','Index/article');

可以缩短为/index/article/1,此处的index为应用名字
为了缩短应用名字
可以在public/index.php进一步修改

$response = $http->run();

改为

// 特殊路由
$_amain = 'index';
$_aother = 'admin|xxx'; // 这里是除了home以外的所有其他应用
if (preg_match('/^\/('.$_aother.')\/?/', $_SERVER['REQUEST_URI'])) {
    $response = $http->run();
} else {
    $response = $http->name($_amain)->run();
}

即可实现/article/id访问

Last modification:August 3, 2023
如果觉得我的文章对你有用,请随意赞赏