本文记录根据官网安装教程运行框架后,值得注意的若干事项
1. 控制类的定义
thinkphp/app/controller 下可以直接创建控制类,也可以先创建文件,再创建控制类,控制类需要遵循首字母大写,以下的控制类都是允许的
thinkphp/app/controller/Install.phpthinkphp/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.html 和 hello.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();
}
}
- 我们要显示地
use think\facade\View对View类进行引用 - 使用
View::assign方法传入内容到View页面, 在View页面中可以直接使用变量,在这个例子中,可以直接使用$title输出 - 使用
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.html 和 thinkphp/app/view/public/footer.html
需要使用该模板的时候,只需要在使用的视图文件中引入即可
{layout name="layout" /}
<div></div>
5 开启多语言
- 首先要在
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,
];
thinkphp可以通过检测cookie中的值来进行语言项的切换,具体的配置在thinkphp/config/lang.php中- 在
app/lang/当前语言.php文件中定义语言项即可
6 应用初始化加载配置
或许我们会有这样的需求,数据库中记录了一些用户的配置,需要全局加载并按配置来展示页面,此时应该这样做:
- 在
thinkphp/app/event的listen AppInit中添加一个类
<?php
use app\listener\ConfigEvent;
// 事件定义文件
return [
'bind' => [
],
'listen' => [
'AppInit' => [
ConfigEvent::class,
],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
],
'subscribe' => [
],
];
- 在
thinkphp/listen文件夹下添加这个类,如果没有文件夹需要新建 - 完成类的实现,可能是这样,类的实现里添加了
<?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.中间件
这里记录了全局中间件和针对某些页面的中间件
- 在
thinkphp/app/middleware中创建中间件的类并实现
<?php
namespace app\middleware;
class InstallCheck
{
public function handle($request, \Closure $next)
{
$response = $next($request);
// 逻辑
return $response;
}
}
- 如果想要其成为全局中间件,可以在
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,
];
- 如果想要中间件仅作用于某些特定的页面,可以使用路由分组来实现,路由在
thinkphp/route/app.php中定义,可以添加如下代码
/* 需要进行验权的方法 */
Route::group(function () {
Route::rule('index/index', 'index/index');
})->middleware(\app\middleware\JwtAuth::class);