35. 基础控制器
简介
在上一节我们完成的前台布局模板 layout/main.html
文件里,我们可以看到变量 $site
存储着站点设置信息,这就要求我们接下来需要在所有控制( action )方法里给这个模板变量赋值,否则视图页面渲染会报错。在本节里我们介绍,如何遵循 DRY原则 实现变量 $site
的赋值。
另外,我们在本节里完成项目首页设置。
需求分解
我们新添加一个基础控制器,在该基础控制器的初始化方法里完成给变量 $site
的赋值,然后让前台所有控制器都继承该基础控制器,这样所有继承它的控制器里的控制( action )方法就不需要再给 $site
赋值。
另外,我们看到上一节我们在 application/index/controller/index.php
里是使用 tpadmin\model\Config
里的方法来读取站点信息,在这一节我们决定自定义一个数据模型类来完成站点信息的读取。
最后,我们暂时把 'index/index' 这个页面设置成项目的首页,并遵循 路由标识 规则定义和生成首页访问 URL 。
数据模型
首先我们定义一个数据模型类来完成站点信息的读取。因为站点信息是保存在数据库表 config
里,所以我们定义的模型类名是 Config
, 遵循 目录结构 规范我们把 Config
类定义在 common\model
这个命名空间.
下面我们使用 命令行工具 来创建该数据模型类:
$ php think make:model common/Config
我们让 Config
继承于 tpadmin\model\Config
:
application/common/model/Config.php
<?php
namespace app\common\model;
use think\Model;
use tpadmin\model\Config as TpadminConfig;
class Config extends TpadminConfig
{
/**
* 读取站点设置信息
* @Author zhanghong(Laifuzi)
* @DateTime 2019-06-10
* @return array [description]
*/
public static function siteSetting()
{
$config = self::where('name', self::NAME_SITE_SETTING)->find();
if(empty($config)){
return [];
}
return $config->settings;
}
}
控制器
接下来,创建一个名为 Base
的基础控制器。
$ php think make:controller index/Base
基础控制器的代码如下:
application/index/controller/Base.php
<?php
namespace app\index\controller;
use think\Controller;
use app\common\model\Config as ConfigModel;
class Base extends Controller
{
protected function initialize()
{
if(!request()->isAjax()){
// 读取站点设置信息
$site = ConfigModel::siteSetting();
$this->assign('site', $site);
}
}
}
接下来,让前台模块的 Index
控制器继承 Base
:
application/index/controller/index.php
<?php
namespace app\index\controller;
class Index extends Base
{
public function index()
{
return $this->fetch('index');
}
}
代码解读
- 遵循 ThinkPHP 的 控制器定义建议 ,在 Base 控制器里,我们通过重载控制器的初始化方法 (
initialize
)实现视图变量的赋值,而不是重载 PHP 类的构造方法(__construct
); - 因为变量
$site
只有使用视图渲染时才使用到,AJAX 请求 URL 时我们都是返回 JSON 格式的数据,所以在initialize
方法里判断只有当不是 AJAX 请求时才读取站点设置信息。
项目首页
在开发项目过程中,我们暂时把 index/index
这个页面做为我们前台模块的首页,接下来我们把这个页面的路由访问规则修改成 /
。
首先把 route/route.php
文件修改成以下代码:
route/route.php
<?php
// 首页
Route::get('/', 'topic/index')->name('page.root');
接下来修改顶部导航栏里 项目名称 链接地址:
application/index/view/layout/_header.html
.
.
.
<!-- Branding Image -->
<a class="navbar-brand " href="{:url('[page.root]')}">
ThinkBBS
</a>
.
.
.
效果预览
知识点
在本节里,我们用 ThinkPHP 命令行(官方文档有些地方也称为「指令」)创建了我们需要的模型和控制器文件,其实除上面使用到的 make:model
和 make:controller
命令以外,ThinkPHP 还为我们提供了很多其它命令(参考: [ThinkPHP命令行] (www.kancloud.cn/manual/thinkphp5_1...)))。
我们在项目根目录执行 php think
命令可以看到所有可执行的命令行:
在上图里, tpadmin:init
和 tpadmin:seed
这两个命令是扩展包 Tpadmin 提供的,之前我们在安装这个扩展包时已经执行过这两个命令。
Git 代码版本控制
下面把代码纳入到版本管理:
$ git add -A
$ git commit -m "创建基础控制器"
推荐文章: