全面掌握ThinkPHP 6.x新特性,构建高性能企业级应用
ThinkPHP 6.x 框架概述
ThinkPHP是一款免费开源的轻量级PHP开发框架,遵循Apache2开源协议发布。ThinkPHP 6.x版本进行了全面重构,引入了更多现代化特性。
主要新特性
- 支持PSR规范,完全兼容Composer
- 更强大的依赖注入容器
- 改进的中间件机制
- 更灵活的路由功能
- 支持Swoole协程和Workerman
环境要求与安装
ThinkPHP 6.x对环境有一定要求,下面是安装步骤:
环境要求
- PHP >= 7.1.0
- PDO PHP Extension
- MBstring PHP Extension
- CURL PHP Extension
通过Composer安装
# 创建项目
composer create-project topthink/think tp6
# 进入目录
cd tp6
# 启动内置服务器
php think run
访问 http://localhost:8000 即可看到欢迎页面。
目录结构与MVC模式
ThinkPHP遵循MVC设计模式,下面是典型的目录结构:
tp6/
├── app/ // 应用目录
│ ├── controller/ // 控制器目录
│ ├── model/ // 模型目录
│ └── view/ // 视图目录
├── config/ // 配置目录
├── route/ // 路由目录
├── public/ // WEB入口目录
├── extend/ // 扩展目录
└── vendor/ // Composer目录
MVC组件说明
- 模型(Model):负责数据操作和业务逻辑
- 视图(View):负责数据展示和用户界面
- 控制器(Controller):负责接收请求和协调模型与视图
路由配置与控制器
ThinkPHP 6.x提供了灵活的路由配置方式,支持多种路由定义。
路由定义
在route/app.php中定义路由:
use thinkfacadeRoute;
// 基本路由
Route::get('hello/:name', 'index/hello');
// 资源路由
Route::resource('blog', 'Blog');
// 路由分组
Route::group('admin', function() {
Route::get('user', 'admin/user/index');
Route::get('article', 'admin/article/index');
})->middleware('Auth');
控制器示例
namespace appcontroller;
use appBaseController;
use thinkRequest;
class Blog extends BaseController
{
public function index()
{
return '博客列表';
}
public function read($id)
{
return '查看博客ID: ' . $id;
}
public function save(Request $request)
{
$data = $request->post();
// 保存数据逻辑
return json(['code' => 1, 'msg' => '保存成功']);
}
}
数据库操作与模型
ThinkPHP提供了强大的数据库操作功能,支持多种数据库类型。
数据库配置
在config/database.php中配置数据库连接:
return [
// 默认数据库连接
'default' => 'mysql',
// 数据库连接信息
'connections' => [
'mysql' => [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'test',
'username' => 'root',
'password' => '123456',
'charset' => 'utf8mb4',
'prefix' => 'tp_',
],
],
];
模型定义与使用
namespace appmodel;
use thinkModel;
// 用户模型
class User extends Model
{
// 设置表名
protected $table = 'user';
// 设置主键
protected $pk = 'id';
// 自动时间戳
protected $autoWriteTimestamp = true;
// 定义字段类型
protected $type = [
'create_time' => 'timestamp',
'update_time' => 'timestamp',
];
}
// 控制器中使用模型
public function userList()
{
// 查询所有用户
$users = User::select();
// 条件查询
$user = User::where('name', 'like', '%thinkphp%')
->order('id', 'desc')
->find();
// 新增数据
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
return json($users);
}
实战案例:博客系统开发
下面我们使用ThinkPHP 6.x开发一个简单的博客系统。
数据库设计
-- 文章表
CREATE TABLE `tp_article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL DEFAULT '',
`content` text,
`user_id` int(11) NOT NULL DEFAULT '0',
`create_time` int(11) NOT NULL DEFAULT '0',
`update_time` int(11) NOT NULL DEFAULT '0',
`status` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用户表
CREATE TABLE `tp_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT '',
`password` varchar(255) NOT NULL DEFAULT '',
`email` varchar(100) NOT NULL DEFAULT '',
`create_time` int(11) NOT NULL DEFAULT '0',
`update_time` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
模型定义
// app/model/Article.php
namespace appmodel;
use thinkModel;
class Article extends Model
{
protected $table = 'article';
protected $pk = 'id';
protected $autoWriteTimestamp = true;
// 定义关联
public function user()
{
return $this->belongsTo(User::class);
}
}
// app/model/User.php
namespace appmodel;
use thinkModel;
class User extends Model
{
protected $table = 'user';
protected $pk = 'id';
protected $autoWriteTimestamp = true;
// 定义关联
public function articles()
{
return $this->hasMany(Article::class);
}
// 密码加密
public function setPasswordAttr($value)
{
return password_hash($value, PASSWORD_DEFAULT);
}
}
控制器实现
// app/controller/Article.php
namespace appcontroller;
use appBaseController;
use appmodelArticle as ArticleModel;
use thinkfacadeRequest;
use thinkfacadeView;
class Article extends BaseController
{
// 文章列表
public function index()
{
$page = Request::param('page', 1);
$size = Request::param('size', 10);
$list = ArticleModel::with('user')
->where('status', 1)
->order('create_time', 'desc')
->paginate(['page' => $page, 'list_rows' => $size]);
return View::fetch('index', ['list' => $list]);
}
// 查看文章
public function read($id)
{
$article = ArticleModel::with('user')
->where('id', $id)
->where('status', 1)
->find();
if (!$article) {
return $this->error('文章不存在');
}
return View::fetch('read', ['article' => $article]);
}
// 创建文章
public function create()
{
if (Request::isPost()) {
$data = Request::post();
// 验证数据
$validate = new appvalidateArticle;
if (!$validate->check($data)) {
return $this->error($validate->getError());
}
// 保存数据
$article = new ArticleModel;
$article->save($data);
return $this->success('发布成功', url('index'));
}
return View::fetch('create');
}
}
数据验证器
// app/validate/Article.php
namespace appvalidate;
use thinkValidate;
class Article extends Validate
{
protected $rule = [
'title' => 'require|min:5|max:100',
'content' => 'require|min:10',
'user_id' => 'require|number',
];
protected $message = [
'title.require' => '标题不能为空',
'title.min' => '标题不能少于5个字符',
'title.max' => '标题不能超过100个字符',
'content.require' => '内容不能为空',
'content.min' => '内容不能少于10个字符',
'user_id.require' => '用户ID不能为空',
'user_id.number' => '用户ID必须是数字',
];
}
中间件与权限控制
ThinkPHP 6.x的中间件机制提供了灵活的请求预处理功能。
创建中间件
// app/middleware/Auth.php
namespace appmiddleware;
use thinkRequest;
use thinkResponse;
class Auth
{
public function handle(Request $request, Closure $next)
{
// 检查用户是否登录
if (!session('user_id')) {
if ($request->isAjax()) {
return json(['code' => 0, 'msg' => '请先登录']);
} else {
return redirect('login/index');
}
}
return $next($request);
}
}
使用中间件
// 全局中间件
// 在app/middleware.php中注册
return [
appmiddlewareAuth::class,
];
// 控制器中使用
protected $middleware = [
Auth::class => ['except' => ['index', 'read']],
];
// 路由中使用
Route::group('admin', function() {
Route::get('user', 'admin/user/index');
})->middleware(appmiddlewareAuth::class);
API开发与响应处理
ThinkPHP 6.x非常适合开发API接口,提供了便捷的响应处理方式。
API控制器示例
namespace appcontrollerapi;
use appBaseController;
use appmodelArticle;
use thinkfacadeRequest;
class ArticleController extends BaseController
{
// 文章列表API
public function index()
{
$page = Request::param('page', 1);
$size = Request::param('size', 10);
$list = Article::with('user')
->where('status', 1)
->order('create_time', 'desc')
->paginate(['page' => $page, 'list_rows' => $size])
->toArray();
return json([
'code' => 1,
'msg' => 'success',
'data' => $list
]);
}
// 创建文章API
public function create()
{
$data = Request::post();
// 验证数据
$validate = new appvalidateArticle;
if (!$validate->check($data)) {
return json([
'code' => 0,
'msg' => $validate->getError()
]);
}
// 保存数据
$article = new Article;
$result = $article->save($data);
if ($result) {
return json([
'code' => 1,
'msg' => '发布成功',
'data' => $article->id
]);
} else {
return json([
'code' => 0,
'msg' => '发布失败'
]);
}
}
}
统一API响应格式
// 在基础控制器中封装响应方法
namespace appBaseController;
use thinkfacadeRequest;
class BaseController extends Controller
{
// 成功响应
protected function success($msg = 'success', $data = [], $code = 1)
{
return json([
'code' => $code,
'msg' => $msg,
'data' => $data
]);
}
// 错误响应
protected function error($msg = 'error', $data = [], $code = 0)
{
return json([
'code' => $code,
'msg' => $msg,
'data' => $data
]);
}
// 分页响应
protected function paginate($list)
{
return $this->success('success', [
'list' => $list->items(),
'total' => $list->total(),
'page' => $list->currentPage(),
'size' => $list->listRows()
]);
}
}
总结
ThinkPHP 6.x作为一个成熟稳定的PHP框架,提供了完整的MVC解决方案和丰富的功能特性。通过本文的学习,你应该对ThinkPHP 6.x的核心概念和开发模式有了全面的了解。
在实际项目开发中,建议:
- 遵循PSR规范,编写标准化代码
- 合理使用模型关联和查询范围
- 利用中间件实现权限控制和请求处理
- 使用验证器确保数据安全
- 采用分层架构设计,提高代码可维护性
ThinkPHP 6.x的灵活性和强大功能使其成为开发中小型项目的优秀选择,希望本文能帮助你在ThinkPHP开发道路上更进一步。