假设Index应用的index.php控制器如下 ``` 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应用下新建路由 ``` '\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访问 Loading... 假设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 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏