ThinkPHP 网站开发全攻略:从零开始到项目实战
ThinkPHP 是一个免费、开源、快速、简单的面向对象的轻量级 PHP 开发框架,遵循 Apache2.0 协议发布,它是为了简化企业级应用开发和 Web 应用开发而诞生的,本教程将带你一步步使用 ThinkPHP 6.x(当前最新稳定版)来构建一个完整的网站。

目录
-
第一部分:入门准备
- 什么是 ThinkPHP?
- 为什么选择 ThinkPHP?
- 环境要求
- 开发工具推荐
- Composer 的安装与使用
-
第二部分:项目初始化与基础配置
- 安装 ThinkPHP
- 项目目录结构解析
- 配置文件详解
- 路由入门
-
第三部分:MVC 架构深入
- M - Model (模型):数据库操作与数据模型
- V - View (视图):模板引擎与页面渲染
- C - Controller (控制器):业务逻辑核心
-
第四部分:核心功能实战
(图片来源网络,侵删)- 数据库操作:增删改查、链式操作
- 用户认证:使用
think-auth实现登录注册 - 文件上传
- 表单验证
-
第五部分:项目实战 - 构建一个简单的博客系统
- 需求分析
- 数据库设计
- 实现后台管理功能
- 实现前台展示功能
-
第六部分:部署与优化
- 环境配置
- 项目部署
- 性能优化建议
第一部分:入门准备
什么是 ThinkPHP?
ThinkPHP 是一个 PHP 框架,它提供了一套基础的开发骨架,让你不必重复“造轮子”,可以专注于业务逻辑的开发,它遵循 MVC 设计模式,使代码结构清晰、易于维护。
为什么选择 ThinkPHP?
- 文档完善:官方文档非常详尽,社区活跃。
- 学习曲线平缓:对于有 PHP 基础的开发者来说,入门相对容易。
- 功能强大:内置了路由、ORM、缓存、验证等大量常用功能。
- 生态丰富:拥有大量官方和社区扩展。
- 国产框架:对中文支持和国内服务器环境有更好的兼容性。
环境要求
- PHP: >= 7.2.5 (推荐 7.4)
- Composer: PHP 依赖管理工具
- Web 服务器: Apache (推荐 2.4+) 或 Nginx (推荐 1.8+)
- 数据库: MySQL (>= 5.7) 或 MariaDB (>= 10.2)
开发工具推荐
- 代码编辑器: VS Code, PhpStorm, Sublime Text
- 本地环境集成软件:
- phpStudy: 一键搭建 PHP 环境,非常适合初学者。
- XAMPP: 经典的跨平台集成环境。
- Docker: 更专业、更灵活的容器化部署方式。
Composer 的安装与使用
Composer 是 PHP 的依赖管理工具,ThinkPHP 完全依赖它来安装和管理框架及扩展。

- 下载安装: 访问 getcomposer.org 下载并运行安装程序,Windows 用户直接运行
Composer-Setup.exe即可。 - 验证安装: 打开命令行工具,输入
composer -v,如果显示版本信息,则安装成功。 - 镜像加速(国内用户推荐): 由于网络原因,建议配置国内镜像,速度会快很多。
composer config -g repo.packagist composer https://packagist.org # 或者使用阿里云镜像 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
第二部分:项目初始化与基础配置
安装 ThinkPHP
最推荐的方式是使用 Composer 创建一个全新的项目。
打开命令行,进入你希望存放项目的目录,然后执行以下命令:
# 创建一个名为 myblog 的新项目 composer create-project topthink/think myblog
等待安装完成后,进入项目目录:
cd myblog
项目目录结构解析
安装完成后,你会看到以下主要目录:
app/: 核心应用目录,我们所有的业务代码都写在这里。controller/: 控制器目录。model/: 模型目录。view/: 视图目录。
config/: 配置文件目录,存放各种配置文件。public/: Web 访问入口目录,所有外部请求都指向这个目录下的index.php。route/: 路由定义目录。extend/: 扩展类库目录。runtime/: 运行时目录,存放日志、缓存、会话等,需要设置 Web 服务器对该目录无执行权限。vendor/: Composer 依赖包目录。
配置文件详解
-
.env文件: 环境配置文件,优先级最高,你可以在这里配置数据库连接、应用调试模式等。APP_DEBUG = true [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = 127.0.0.1 DATABASE = myblog USERNAME = root PASSWORD = root HOSTPORT = 3306 CHARSET = utf8mb4 DEBUG = true
-
config/app.php: 应用基础配置,如应用名称、默认时区、是否开启调试等。 -
config/database.php: 数据库配置,.env文件中的配置会覆盖这里的配置。
路由入门
ThinkPHP 的路由可以将 URL 地址映射到具体的控制器和方法。
- 开启路由: 确保在
.env文件中APP_ROUTE_ON = true。 - 定义路由: 在
route/app.php文件中添加路由规则。
示例:
将 http://yourdomain.com/hello 这个 URL 指向 Index 控制器的 hello 方法。
// route/app.php
use think\facade\Route;
// 定义一个 GET 路由
Route::get('hello', 'Index/hello');
创建对应的控制器和方法:
// app/controller/Index.php
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
public function hello()
{
return 'Hello, ThinkPHP 6!';
}
}
访问你的网站(确保本地服务器已指向 public 目录),然后访问 http://localhost/hello,你应该就能看到 "Hello, ThinkPHP 6!" 的输出了。
第三部分:MVC 架构深入
M - Model (模型)
模型负责与数据库进行交互,实现数据的封装。
-
创建模型: 命令行创建模型(推荐)。
# 创建一个 Post 模型,对应 posts 表 php think make:model Post
这会在
app/model/目录下生成Post.php文件。 -
模型代码:
// app/model/Post.php namespace app\model; use think\Model; class Post extends Model { // 设置数据表名 protected $name = 'posts'; // 设置字段信息 protected $schema = [ 'id' => 'int', 'title' => 'string', 'content' => 'text', 'create_time' => 'datetime', 'update_time' => 'datetime', ]; } -
使用模型:
// 在控制器中使用 use app\model\Post; public function index() { // 查询所有文章 $posts = Post::select(); // 查询第一条 $post = Post::find(1); // 条件查询 $posts = Post::where('status', 1)->order('create_time', 'desc')->select(); return json($posts); // 返回 JSON 数据 }
V - View (视图)
视图负责展示数据,即 HTML 页面。
-
视图目录: 视图文件存放在
app/view/目录下,目录结构与控制器对应。app/controller/Index.php控制器的视图应放在app/view/index/目录下。 -
渲染视图:
// app/controller/Index.php public function list() { // 从数据库获取文章列表 $posts = Post::select(); // 将数据传递给视图 return view('index/list', ['posts' => $posts]); } -
模板文件:
app/view/index/list.html<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>文章列表</title> </head> <body> <h1>文章列表</h1> <ul> {volist name="posts" id="post"} <li> <a href="/post/{$post.id}">{$post.title}</a> <span> - 发布于 {$post.create_time}</span> </li> {/volist} </ul> </body> </html>ThinkPHP 使用自己的模板引擎,支持
{$var}输出变量,{volist}循环等。
C - Controller (控制器)
控制器是模型和视图的桥梁,接收用户请求,调用模型处理数据,然后选择视图进行渲染。
-
创建控制器:
# 创建一个 Blog 控制器 php think make:controller Blog
-
控制器代码:
// app/controller/Blog.php namespace app\controller; use app\BaseController; use app\model\Post; use think\facade\View; class Blog extends BaseController { // 显示文章列表 public function index() { $posts = Post::order('create_time', 'desc')->select(); View::assign('posts', $posts); return View::fetch(); } // 显示文章详情 public function detail($id) { $post = Post::find($id); if (!$post) { return '文章不存在'; } View::assign('post', $post); return View::fetch(); } }
第四部分:核心功能实战
数据库操作 (增删改查)
除了模型中展示的,还有更多便捷操作:
-
新增:
$post = new Post; $post->title = 'ThinkPHP 教程'; $post->content = '这是一个关于 ThinkPHP 的教程。'; $post->save(); // 保存到数据库
-
修改:
$post = Post::find(1); $post->title = '新标题'; $post->save();
-
删除:
// 根据主键删除 Post::destroy(1); // 条件删除 Post::where('status', 0)->delete();
用户认证 (使用 think-auth)
ThinkPHP 官方提供了 think-auth 扩展来实现用户认证。
-
安装扩展:
composer require topthink/think-auth
-
配置: 在
config/auth.php中进行配置。 -
创建用户表:
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '用户名', `password` varchar(255) NOT NULL COMMENT '密码', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
创建登录/注册页面和控制器:
- 创建
UserController。 - 实现登录方法
login()和注册方法register()。 - 在登录方法中,使用
Auth::check()验证用户名和密码。 - 验证成功后,使用
Auth::login()进行登录,并设置 session。
- 创建
文件上传
public function upload()
{
// 获取上传的文件
$file = request()->file('image');
// 移动到框架应用根目录/public/uploads/ 目录下
if ($file) {
$savename = \think\facade\Filesystem::putFile('uploads', $file);
// $savename 是一个相对路径,如 'uploads/2025/05/10/xxx.png'
// 你可以将其保存到数据库
return json(['code' => 1, 'msg' => '上传成功', 'data' => $savename]);
}
}
表单验证
ThinkPHP 提供了强大的验证器。
-
独立验证:
// 在控制器中 $validate = new \think\Validate([ 'name' => 'require|max:25', 'email' => 'email', ]); if (!$validate->check($data)) { return $validate->getError(); } -
验证器类 (推荐):
# 创建一个验证器类 php think make:validate User
在
app/validate/User.php中定义规则:namespace app\validate; use think\Validate; class User extends Validate { protected $rule = [ 'name' => 'require|max:25', 'email' => 'email', ]; protected $message = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'email' => '邮箱格式错误', ]; }在控制器中使用:
$data = request()->post(); $validate = new \app\validate\User; if (!$validate->check($data)) { return $validate->getError(); }
第五部分:项目实战 - 构建一个简单的博客系统
需求分析
- 前台:
- 文章列表页 ()
- 文章详情页 (
/post/{id})
- 后台:
- 登录页 (
/admin/login) - 后台首页 (
/admin) - 文章管理:列表、添加、编辑、删除
- 登录页 (
数据库设计
-- 文章表 CREATE TABLE `posts` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, varchar(255) NOT NULL COMMENT '标题', `content` text NOT NULL COMMENT '内容', `category_id` int(11) unsigned DEFAULT '0' COMMENT '分类ID', `is_top` tinyint(1) unsigned DEFAULT '0' COMMENT '是否置顶', `status` tinyint(1) unsigned DEFAULT '1' COMMENT '状态: 1=发布, 0=草稿', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 分类表 CREATE TABLE `categories` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL COMMENT '分类名', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 用户表 (同上)
实现步骤
-
创建模型:
php think make:model Post,php think make:model Category。 -
创建控制器:
- 前台:
php think make:controller Index,php think make:controller Post。 - 后台:
php think make:controller admin/Blog,php think make:controller admin/Login。
- 前台:
-
配置路由:
-
前台路由:
// route/app.php Route::get('/', 'Index/index'); Route::get('post/:id', 'Post/detail'); -
后台路由 (需要登录验证):
// route/admin.php use think\facade\Route; Route::group('admin', function () { Route::get('login', 'Login/index'); Route::post('login', 'Login/doLogin'); Route::get('index', 'Index/index'); Route::get('blog', 'Blog/index'); Route::get('blog/add', 'Blog/add'); // ... 其他路由 })->middleware(\think\middleware\SessionCheck::class); // 假设你写了一个SessionCheck中间件
-
-
开发控制器方法:
- 实现
Index控制器的index方法,查询文章列表并传递给视图。 - 实现
Post控制器的detail方法,查询单篇文章详情。 - 实现
admin/Blog控制器的方法,完成文章的增删改查逻辑。 - 实现
admin/Login控制器,完成登录逻辑和 session 管理。
- 实现
-
编写视图模板:
- 创建
app/view/index/,app/view/post/,app/view/admin/等目录,并编写对应的 HTML 模板文件。 - 使用
{include}标签引入公共的头部和尾部模板,如{include file="public/header"}。
- 创建
第六部分:部署与优化
环境配置
- 生产环境:
- 关闭调试模式: 在
.env文件中设置APP_DEBUG = false。 - 设置
runtime目录权限为 755,确保 Web 服务器可以读写。 - 配置 Web 服务器,将所有请求重定向到
public/index.php。
- 关闭调试模式: 在
项目部署
-
Nginx 配置示例:
server { listen 80; server_name yourdomain.com; root /path/to/your/project/public; # 指向 public 目录 index index.php index.html; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; # 开启路由 break; } } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
性能优化建议
- 开启 OPcache: PHP 的字节码缓存,能极大提升性能。
- 使用 Redis/Memcached 缓存: 对不经常变动的数据(如配置、首页文章)进行缓存。
- 数据库优化: 合理使用索引,避免慢查询。
- 静态资源 CDN: 将 CSS, JS, 图片等静态资源放到 CDN 上。
- 代码优化: 遵循 PSR 规范,编写高效的业务逻辑。
学习资源
- ThinkPHP 官方文档: https://www.kancloud.cn/manual/thinkphp6_0 (这是最重要的资源,没有之一)
- ThinkPHP 视频教程: B站、慕课网等平台有大量免费和付费的入门到进阶视频。
- GitHub: https://github.com/top-think (查看框架源码,参与社区)
祝你学习愉快,早日用 ThinkPHP 构建出属于自己的精彩网站!
