假设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访问