ThinkPHP8 框架初探

1,505 阅读2分钟

本文记录根据官网安装教程运行框架后,值得注意的若干事项

1. 控制类的定义

thinkphp/app/controller 下可以直接创建控制类,也可以先创建文件,再创建控制类,控制类需要遵循首字母大写,以下的控制类都是允许的

  • thinkphp/app/controller/Install.php
  • thinkphp/app/controller/v1/User.php

2. 路由

可以通过定义路由访问到控制类,路由配置文件在 thinkphp/route/app.php

<?php
namespace app\controller;

use app\BaseController;

class Install extends BaseController
{
    public function config($name = 'ThinkPHP8')
    {
        return 'hello,' . $name . '!';
    }
}

thinkphp/app/controller/Install 类有一个方法 config,可以定义 Route::rule('config', 'Install/config'); 这样访问: localhost:8080/config,如果我们没有定义路由,那么必须这样访问 localhost:8080/install/config

<?php

namespace app\controller\v1; //请注意这里的命名空间要一直到文件的根目录
use think\Request\json;

class User
{
    public function login()
    {
        return json('我是v1-login');
    }
}

thinkphp/app/controller/v1/User.php 下有一个方法 login ,我们可以定义 Route::rule('api/user/login', 'v1.User/login');,请注意我们在后面的定义中使用了 v1.User/login ,这表示我们要访问 app/v1 目录下的 User

3. 使用视图模板

Index 类的文件路径为 thinkphp/app/controller/Index.php , 对应的视图文件存放在 thinkphp/app/view/index 文件夹中,文件夹名和类名相同,故为 index , index 文件夹可以放类中方法的 html 文件,比如该类的 view/index 文件夹中,可以有 index.htmlhello.html

<?php

namespace app\controller;
use think\facade\View;

use app\BaseController;

class Index extends BaseController
{
    public function index()
    {
        View::assign('title', 'welcome');
        return View::fetch('index');
    }
    
    public function hello()
    {
        return View::fetch();
    }
}

  1. 我们要显示地 use think\facade\ViewView 类进行引用
  2. 使用 View::assign 方法传入内容到 View 页面, 在 View 页面中可以直接使用变量,在这个例子中,可以直接使用 $title 输出
  3. 使用 View::fetch 来调用模板,如果 index 方法调用自己的模板可以不传参,如果想要调用该类的 hello 方法, 则使用 View::fetch('hello')

4. 使用模板布局

私以为 ThinkPHP8 默认开启了模板布局,但是官方的文档中并没有说明,不是很清楚,模板布局主要解决了我的一个问题,就是很多页面都需要引入 js,css 等文件,需要复用一些代码

thinkphp/app/view 中定义 layout.html 写入如下内容

{include file="public/header" /}
 {__CONTENT__}
{include file="public/footer" /}

内容中引入了两个文件,路径在 thinkphp/app/view/pubic/header.htmlthinkphp/app/view/public/footer.html

需要使用该模板的时候,只需要在使用的视图文件中引入即可

{layout name="layout" /}
<div></div>

5 开启多语言

  1. 首先要在 thinkphp/app/middleware.php 中开启多语言中间件,代码默认就有,取消注释即可
<?php
// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    \think\middleware\LoadLangPack::class,
    // Session初始化
    \think\middleware\SessionInit::class,
    // 安装检查,如果没有安装会默认跳到安装向导
    \app\middleware\InstallCheck::class,
    // JWT验权
    \app\middleware\JwtAuth::class,
];
  1. thinkphp 可以通过检测 cookie 中的值来进行语言项的切换,具体的配置在 thinkphp/config/lang.php
  2. app/lang/当前语言.php 文件中定义语言项即可

6 应用初始化加载配置

或许我们会有这样的需求,数据库中记录了一些用户的配置,需要全局加载并按配置来展示页面,此时应该这样做:

  1. thinkphp/app/eventlisten AppInit中添加一个类
<?php
use app\listener\ConfigEvent;
// 事件定义文件
return [
    'bind'      => [
    ],

    'listen'    => [
        'AppInit'  => [
            ConfigEvent::class,
        ],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
    ],

    'subscribe' => [
    ],
];

  1. thinkphp/listen 文件夹下添加这个类,如果没有文件夹需要新建
  2. 完成类的实现,可能是这样,类的实现里添加了
<?php
namespace app\listener;

use think\facade\Db;
use think\facade\Config;

class ConfigEvent
{
    public function handle()
    {
        $configs = Db::table('think_config')->select();
        Config::set($setConfigs, 'config');
    }
}

7.中间件

这里记录了全局中间件和针对某些页面的中间件

  1. thinkphp/app/middleware 中创建中间件的类并实现
<?php
namespace app\middleware;

class InstallCheck
{
    public function handle($request, \Closure $next)
    {
        $response = $next($request);
        
        // 逻辑
        return $response;
    }
}
  1. 如果想要其成为全局中间件,可以在 thinkphp/app/middleware.php 文件中添加这个中间件的定义 \app\middleware\InstallCheck::class
<?php
// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    \think\middleware\LoadLangPack::class,
    // Session初始化
    \think\middleware\SessionInit::class,
    // 安装检查,如果没有安装会默认跳到安装向导
    \app\middleware\InstallCheck::class,
];

  1. 如果想要中间件仅作用于某些特定的页面,可以使用路由分组来实现,路由在 thinkphp/route/app.php 中定义,可以添加如下代码
/* 需要进行验权的方法 */
Route::group(function () {
    Route::rule('index/index', 'index/index');

})->middleware(\app\middleware\JwtAuth::class);