本教程是专为零基础开发者打造的ThinkPHP从入门到实战全流程学习内容,开篇带你搭建开发环境,快速熟悉PHP基础与ThinkPHP核心概念,涵盖MVC架构、路由规则、数据库操作等入门知识,随后过渡到实战环节,通过博客系统、后台管理等典型项目,拆解业务逻辑实现、功能开发与部署上线全流程,帮助学习者快速掌握框架使用逻辑,独立完成中小型Web应用开发,实现从零基础到熟练上手的蜕变。
ThinkPHP(以下简称TP)是国内最流行的开源PHP开发框架之一,凭借简洁的语法、完善的生态、快速的开发效率,成为了中小企业Web项目、后台管理系统、API接口开发的首选框架之一,无论你是零基础的编程新手,还是有一定PHP基础想要提升开发效率的开发者,本教程都将带你从环境搭建到实战落地,完整掌握ThinkPHP8的核心开发技能。
前期准备:搭建TP开发环境
在开始学习TP之前,我们需要先配置好基础的PHP开发环境,推荐使用集成开发环境来简化配置流程,避免手动搭建环境时出现的各类依赖冲突问题。
选择集成开发环境
对于新手来说,最省心的方式是使用XAMPP、WAMP这类集成包,它已经内置了Apache/Nginx、PHP、MySQL、phpMyAdmin等全套开发组件,一键安装即可直接使用,这里以XAMPP为例:
- 访问XAMPP官方下载页面,根据你的操作系统选择对应版本下载;
- 安装过程中默认勾选所有组件即可,安装完成后打开XAMPP控制面板,启动Apache和MySQL服务,此时本地开发环境就搭建完成了。
- 验证环境是否正常:在浏览器中访问
http://localhost,如果看到XAMPP的欢迎页面,说明环境搭建成功。
安装Composer依赖管理工具
ThinkPHP8及以上版本完全基于Composer进行依赖管理,我们需要先安装Composer来快速下载和更新框架代码,国内用户可以使用阿里云的Composer镜像来加速下载:
- 访问Composer中文网下载安装包,按照提示完成安装;
- 安装完成后打开命令行工具,输入
composer -V,如果能看到Composer的版本信息,说明安装成功。 - 配置国内镜像:执行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,加快依赖包下载速度。
安装ThinkPHP8框架
完成环境准备后,我们就可以开始安装ThinkPHP框架了,目前有两种常用的安装方式:
Composer在线安装(推荐)
这是官方推荐的安装方式,可以自动处理所有依赖项:
- 打开命令行工具,进入你想要存放项目的目录,比如
cd D:\wwwroot; - 执行安装命令:
composer create-project topthink/think tp8-blog,其中tp8-blog是你的项目名称,可以自定义; - 等待安装完成后,进入项目目录:
cd tp8-blog; - 启动TP内置的开发服务器:
php think run,此时在浏览器中访问http://localhost:8000,如果看到ThinkPHP的官方欢迎页面,说明框架安装成功。
手动下载安装包
如果你的环境无法使用Composer,也可以直接从ThinkPHP官方仓库下载最新的稳定版压缩包,解压后将文件复制到项目目录中即可,不过这种方式需要手动安装依赖,适合有一定经验的开发者。
熟悉TP目录结构
安装完成后,我们先来了解一下TP的核心目录结构,这对后续开发非常重要:
public/:项目的入口目录,所有外部请求都通过public/index.php进入框架,也是静态资源(CSS、JS、图片)的存放目录;app/:应用业务代码目录,控制器、模型、视图、配置文件都存放在这个目录下;config/:框架全局配置目录,包含数据库、路由、缓存等各类配置文件;runtime/:框架运行时缓存目录,用于存放日志、缓存文件,默认需要设置读写权限;vendor/:Composer安装的第三方依赖包目录,不要手动修改其中的文件。
TP基础开发:从路由到视图
配置基础参数
在正式开发前,我们需要先配置好基础的开发参数,打开config/app.php文件:
- 将
app_debug设置为true,开启调试模式,开发过程中可以直接看到错误信息,上线前务必关闭; - 修改
default_timezone为Asia/Shanghai,设置时区为北京时间; - 打开
config/database.php,配置数据库连接信息,填写你的数据库用户名、密码和数据库名称,return [ 'hostname' => '127.0.0.1', 'database' => 'tp8_blog', 'username' => 'root', 'password' => '', 'charset' => 'utf8mb4', ];
完成配置后,我们可以在命令行中执行
php think migrate:run来快速初始化数据库表(如果需要的话),也可以手动通过phpMyAdmin创建数据库。
路由系统入门
ThinkPHP的路由负责将外部URL请求映射到对应的控制器方法中,默认的路由配置文件是route/app.php,我们先来写一个最简单的路由示例:
打开route/app.php,添加如下代码:
use think\facade\Route;
Route::get('hello', function () {
return 'Hello ThinkPHP8!';
});
启动开发服务器后访问http://localhost:8000/hello,就能看到页面上输出了Hello ThinkPHP8!,实际开发中我们更常用的是将路由映射到控制器方法中:
// 将请求映射到app/controller/Index控制器的hello方法
Route::get('hello', 'index/hello');
接下来我们创建对应的控制器方法,打开app/controller/Index.php,添加hello方法:
<?php
namespace app\controller;
use think\facade\View;
class Index
{
public function hello()
{
return View::fetch('hello', [
'msg' => '欢迎学习ThinkPHP8教程'
]);
}
}
视图模板与模板引擎
ThinkPHP内置了高效的模板引擎,支持标签语法、变量输出、循环判断等功能,我们在app/view目录下创建hello.html视图文件:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">TP教程示例</title>
</head>
<body>
<h1>{$msg}</h1>
<p>当前时间:{$time}</p>
</body>
</html>
回到控制器的hello方法中,传递时间参数:
public function hello()
{
return View::fetch('hello', [
'msg' => '欢迎学习ThinkPHP8教程',
'time' => date('Y-m-d H:i:s')
]);
}
再次访问http://localhost:8000/hello,就能看到带有动态数据的页面了,除了简单的变量输出,模板引擎还支持循环遍历数据,
// 控制器中传递数组数据
public function list()
{
$list = [
['id' => 1, 'title' => '第一篇文章'],
['id' => 2, 'title' => '第二篇文章']
];
return View::fetch('list', compact('list'));
}
视图文件中使用volist标签循环输出:
<ul>
{volist name="list" id="item"}
<li>{$item.id}、{$item.title}</li>
{/volist}
</ul>
数据库操作:模型与CURD
ThinkPHP的模型层负责与数据库交互,封装了丰富的CURD操作方法,让我们不用编写原生SQL就能完成数据库操作。
创建模型文件
我们以文章表为例,首先在数据库中创建article表,字段包括id(主键)、title)、content)、create_time(创建时间),然后在app/model目录下创建Article.php模型文件:
<?php
namespace app\model;
use think\Model;
class Article extends Model
{
// 默认会自动对应article表,如果表名不一致可以手动指定
// protected $name = 'article';
}
基础CURD操作
在控制器中我们可以直接使用模型来操作数据库,比如查询所有文章:
use app\model\Article;
public function index()
{
// 查询所有文章
$articles = Article::select();
return View::fetch('index', compact('articles'));
}
查询单篇文章:
public function detail($id)
{
$article = Article::find($id);
if (!$article) {
abort(404, '文章不存在');
}
return View::fetch('detail', compact('article'));
}
新增文章:
public function add()
{
if (request()->isPost()) {
// 接收POST参数
$data = request()->post();
// 验证数据
$validate = validate([
'title' => 'require|max:50',
'content' => 'require'
]);
if (!$validate->check($data)) {
return json(['code' => 0, 'msg' => $validate->getError()]);
}
// 写入数据库
Article::create($data);
return json(['code' => 1, 'msg' => '发布成功']);
}
return View::fetch('add');
}
更新文章:
public function edit($id)
{
$article = Article::find($id);
if (request()->isPost()) {
$data = request()->post();
$article->save($data);
return json(['code' => 1, 'msg' => '更新成功']);
}
return View::fetch('edit', compact('article'));
}
删除文章:
public function delete($id)
{
Article::destroy($id);
return redirect('/article/index');
}
实战项目:快速搭建简易博客系统
结合前面学习的知识点,我们可以快速搭建一个完整的简易博客系统,包含文章列表、文章详情、发布文章三个核心功能:
- 文章列表页:展示所有文章的标题和发布时间,点击标题进入详情页;
- 文章详情页:展示文章的完整内容和发布时间;
- 发布文章页和内容的表单,提交后将数据写入数据库。
整个实战项目的代码量不大,但覆盖了TP开发的核心流程,你可以在此基础上继续扩展登录、评论、分页等功能,比如添加分页功能,可以使用TP内置的分页类:
public function index()
{
$articles = Article::order('create_time', 'desc')->paginate(10);
return View::fetch('index', compact('articles'));
}
在视图文件中输出分页链接:
{$articles->render()}
进阶技巧与常见问题解决
常用进阶功能
- 中间件:可以在请求到达控制器前进行权限
