ThinkPHP 网站开发全攻略:从零开始到项目实战

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

thinkphp网站开发教程
(图片来源网络,侵删)

目录

  1. 第一部分:入门准备

    • 什么是 ThinkPHP?
    • 为什么选择 ThinkPHP?
    • 环境要求
    • 开发工具推荐
    • Composer 的安装与使用
  2. 第二部分:项目初始化与基础配置

    • 安装 ThinkPHP
    • 项目目录结构解析
    • 配置文件详解
    • 路由入门
  3. 第三部分:MVC 架构深入

    • M - Model (模型):数据库操作与数据模型
    • V - View (视图):模板引擎与页面渲染
    • C - Controller (控制器):业务逻辑核心
  4. 第四部分:核心功能实战

    thinkphp网站开发教程
    (图片来源网络,侵删)
    • 数据库操作:增删改查、链式操作
    • 用户认证:使用 think-auth 实现登录注册
    • 文件上传
    • 表单验证
  5. 第五部分:项目实战 - 构建一个简单的博客系统

    • 需求分析
    • 数据库设计
    • 实现后台管理功能
    • 实现前台展示功能
  6. 第六部分:部署与优化

    • 环境配置
    • 项目部署
    • 性能优化建议

第一部分:入门准备

什么是 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 完全依赖它来安装和管理框架及扩展。

thinkphp网站开发教程
(图片来源网络,侵删)
  1. 下载安装: 访问 getcomposer.org 下载并运行安装程序,Windows 用户直接运行 Composer-Setup.exe 即可。
  2. 验证安装: 打开命令行工具,输入 composer -v,如果显示版本信息,则安装成功。
  3. 镜像加速(国内用户推荐): 由于网络原因,建议配置国内镜像,速度会快很多。
    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 扩展来实现用户认证。

  1. 安装扩展:

    composer require topthink/think-auth
  2. 配置: 在 config/auth.php 中进行配置。

  3. 创建用户表:

    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;
  4. 创建登录/注册页面和控制器:

    • 创建 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 提供了强大的验证器。

  1. 独立验证:

    // 在控制器中
    $validate = new \think\Validate([
        'name'  => 'require|max:25',
        'email' => 'email',
    ]);
    if (!$validate->check($data)) {
        return $validate->getError();
    }
  2. 验证器类 (推荐):

    # 创建一个验证器类
    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;
-- 用户表 (同上)

实现步骤

  1. 创建模型: php think make:model Post, php think make:model Category

  2. 创建控制器:

    • 前台: php think make:controller Index, php think make:controller Post
    • 后台: php think make:controller admin/Blog, php think make:controller admin/Login
  3. 配置路由:

    • 前台路由:

      // 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中间件
  4. 开发控制器方法:

    • 实现 Index 控制器的 index 方法,查询文章列表并传递给视图。
    • 实现 Post 控制器的 detail 方法,查询单篇文章详情。
    • 实现 admin/Blog 控制器的方法,完成文章的增删改查逻辑。
    • 实现 admin/Login 控制器,完成登录逻辑和 session 管理。
  5. 编写视图模板:

    • 创建 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 构建出属于自己的精彩网站!