本书未发布

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:modelmake:controller 命令以外,ThinkPHP 还为我们提供了很多其它命令(参考: [ThinkPHP命令行] (www.kancloud.cn/manual/thinkphp5_1...)))。

我们在项目根目录执行 php think 命令可以看到所有可执行的命令行:

在上图里, tpadmin:inittpadmin:seed 这两个命令是扩展包 Tpadmin 提供的,之前我们在安装这个扩展包时已经执行过这两个命令。

Git 代码版本控制

下面把代码纳入到版本管理:

$ git add -A
$ git commit -m "创建基础控制器"

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~