杰瑞科技汇

ThinkPHP5开发教程从哪开始学?

ThinkPHP 5.1 开发入门教程

ThinkPHP 是一个开源的、快速、简单的面向对象的轻量级 PHP 开发框架,遵循 Apache2.0 协议发布,ThinkPHP 5 是一个颠覆和重构版本,采用更严格的 PSR 规范,更适合现代 Web 应用开发。

ThinkPHP5开发教程从哪开始学?-图1
(图片来源网络,侵删)

本教程将以 ThinkPHP 5.1 版本为例进行讲解,因为它是目前最稳定、使用最广泛的 5.x 版本。

目录

  1. ThinkPHP 是什么?为什么选择它?
  2. 环境准备
  3. 安装 ThinkPHP
  4. 项目目录结构详解
  5. MVC 架构初探
  6. 配置文件
  7. 路由配置
  8. 数据库操作
  9. 视图与模板引擎
  10. 表单提交与数据验证
  11. 实战:一个简单的留言板
  12. 总结与进阶

ThinkPHP 是什么?为什么选择它?

  • 是什么:ThinkPHP 是一个 PHP Web 应用开发框架,它封装了项目中常用的功能,如路由、数据库操作、模板引擎、缓存等,让你能更专注于业务逻辑的开发,而不用重复“造轮子”。
  • 为什么选择它
    • 简单易学:文档齐全,社区活跃,对新手友好。
    • 功能强大:内置了丰富的功能组件,开箱即用。
    • 性能优越:经过多次优化,性能表现优秀。
    • 生态完善:拥有大量的扩展库和成熟的商业支持。
    • 遵循 PSR 标准:与现代 PHP 开发规范接轨,代码更规范。

环境准备

在开始之前,你需要确保你的开发环境满足以下要求:

  • PHP 版本:ThinkPHP 5.1 要求 PHP >=5.6.0,推荐使用 PHP 1.x 或更高版本。
  • 扩展:需要开启 PDOPDO_MySQL (或 PDO_SQLite) 扩展。
  • Web 服务器Apache (需要开启 mod_rewrite) 或 Nginx
  • 数据库MySQL (推荐 6+) 或 SQLitePostgreSQL 等。

对于新手,最简单的方式是使用集成环境,如:

  • phpStudy (Windows)
  • XAMPP (Windows, macOS, Linux)
  • MAMP (macOS)
  • 宝塔面板 (Linux, Windows, macOS)

安装好集成环境后,确保 PHP 版本符合要求,并勾选 PDOPDO_MySQL 扩展。

ThinkPHP5开发教程从哪开始学?-图2
(图片来源网络,侵删)

安装 ThinkPHP

这里我们介绍两种常见的安装方式:手动安装Composer 安装

手动安装(推荐新手)

  1. 下载框架:访问 ThinkPHP 官网或 GitHub 下载 ThinkPHP 5.1 的完整版压缩包。
  2. 解压到 Web 目录:将下载的 thinkphp_5.1.x_with_extend.zip 解压,并将其中的 thinkphp 文件夹(或解压后根目录下的所有文件)复制到你 Web 服务器的根目录下(如 phpStudyWWW 目录)。
  3. 访问验证:启动你的 Web 服务器,在浏览器中访问 http://localhost/
    • 如果看到 ThinkPHP 的欢迎页面,说明安装成功!
    • 如果看到 You don't have permission to access / on this server.,这说明你的 Web 服务器入口文件(index.php)没有被正确识别,请确保你的 Web 服务器配置正确(Apache 的 mod_rewrite 已开启)。

Composer 安装(推荐专业开发者)

  1. 安装 Composer:如果你的系统还没有安装 Composer,请先从 getcomposer.org 下载并安装。
  2. 创建项目:打开命令行(CMD 或 Terminal),进入你想要存放项目的目录(如 WWW),然后运行:
    # 在当前目录下创建一个名为 myapp 的新项目
    composer create-project topthink/think myapp
  3. 访问验证:命令执行完成后,会在 myapp 目录下生成一个完整的 ThinkPHP 项目,在浏览器中访问 http://localhost/myapp/,即可看到欢迎页面。

项目目录结构详解

成功安装后,了解项目的目录结构至关重要,以下是核心目录的说明:

myapp/
├── app/                    # 应用目录
│   ├── controller/         # 控制器目录
│   ├── model/             # 模型目录
│   ├── view/              # 视图目录
│   └── ...                # 其他应用目录
├── config/                # 配置文件目录
├── public/                # WEB 部署目录(对外访问目录)
│   ├── static/            # 静态资源目录
│   └── index.php          # 入口文件
├── route/                 # 路由目录
├── extend/                # 扩展类库目录
├── runtime/               # 应用的运行时目录(日志、缓存等)
├── thinkphp/              # 框架核心目录
├── vendor/                # Composer 依赖目录
├── .example.env           # 环境变量示例文件
└── composer.json          # Composer 配置文件
  • public/:这是唯一需要对外暴露的目录,所有对网站的请求都通过 public/index.php 进入。
  • app/:你的业务代码主要写在这里。
  • config/:存放各种配置文件,如数据库、应用设置等。
  • runtime/:框架运行时产生的文件,如日志、会话、缓存,此目录需要设置可写权限。

MVC 架构初探

ThinkPHP 遵循经典的 MVC 设计模式。

M - Model (模型)

模型负责与数据库进行交互,处理数据的业务逻辑(如数据验证、数据关联等),一个模型通常对应一张数据表。

ThinkPHP5开发教程从哪开始学?-图3
(图片来源网络,侵删)

示例:创建一个 User 模型app/model 目录下创建 User.php 文件:

<?php
namespace app\model;
use think\Model;
class User extends Model
{
    // 设置数据表名(如果与模型名不同)
    // protected $name = 'my_user';
    // 设置主键
    // protected $pk = 'uid';
}

V - View (视图)

视图是用户看到的界面,通常用于展示数据,在 ThinkPHP 中,视图文件是 HTML 文件,但可以嵌入 PHP 代码和 ThinkPHP 的模板引擎标签。

示例:创建一个视图app/view/index 目录下创建 hello.html 文件:

<!DOCTYPE html>
<html>
<head>你好,ThinkPHP!</title>
</head>
<body>
    <h1>{$name}</h1>
    <p>今天是个好日子。</p>
</body>
</html>

C - Controller (控制器)

控制器是模型和视图之间的桥梁,接收用户的请求,调用模型处理数据,然后选择合适的视图返回给用户。

示例:创建一个控制器app/controller 目录下创建 Index.php 文件:

<?php
namespace app\controller;
use think\Request;
use app\model\User; // 引入模型
class Index
{
    public function hello($name = 'ThinkPHP')
    {
        // 向视图传递变量
        return view('index/hello', ['name' => $name]);
    }
    public function user($id)
    {
        // 使用模型查询数据
        $user = User::find($id);
        if ($user) {
            return json($user->toArray()); // 返回 JSON 格式的数据
        } else {
            return '用户不存在';
        }
    }
}

如何访问? 默认情况下,访问 http://localhost/你的项目名/index.php/index/hello/name/World,就会调用 Index 控制器的 hello 方法,并传递 name 参数为 World

配置文件

ThinkPHP 的配置文件非常灵活,支持多种格式。

  • 全局配置:位于 config/ 目录下,如 app.php (应用配置), database.php (数据库配置)。
  • 环境配置:推荐使用 .env 文件来管理环境变量,如数据库连接信息,你可以复制 .example.env.env 并进行修改。

示例:配置数据库 (config/database.php)

return [
    // 默认使用的数据库连接配置
    'default'         => env('database.driver', 'mysql'),
    // 自定义时间查询规则
    'time_query_rule' => [],
    // 自动写入时间戳字段
    'auto_timestamp'  => true,
    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',
    // 数据库连接配置信息
    'connections'     => [
        'mysql' => [
            // 数据库类型
            'type'              => env('database.type', 'mysql'),
            // 服务器地址
            'hostname'          => env('database.hostname', '127.0.0.1'),
            // 数据库名
            'database'          => env('database.database', 'test'),
            // 用户名
            'username'          => env('database.username', 'root'),
            // 密码
            'password'          => env('database.password', 'root'),
            // 端口
            'hostport'          => env('database.hostport', '3306'),
            // 数据库连接参数
            'params'            => [],
            // 数据库编码默认采用utf8
            'charset'           => env('database.charset', 'utf8'),
            // 数据库表前缀
            'prefix'            => env('database.prefix', ''),
            // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
            'deploy'            => 0,
            // 数据库读写是否分离 主从式有效
            'rw_separate'       => false,
            // 读写分离后 主服务器数量
            'master_num'        => 1,
            // 指定从服务器序号
            'slave_no'          => '',
            // 是否严格检查字段是否存在
            'fields_strict'     => true,
            // 是否需要断线重连
            'break_reconnect'   => false,
            // 监听SQL
            'trigger_sql'       => env('app_debug', true),
            // 开启字段缓存
            'fields_cache'      => false,
        ],
    ],
];

使用 .env 文件:

APP_DEBUG = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = test
USERNAME = root
PASSWORD = your_password
HOSTPORT = 3306
CHARSET = utf8
DEBUG = true

路由配置

路由用于将 URL 请求映射到对应的控制器和方法上,使 URL 更美观、更友好。

ThinkPHP 的路由配置文件在 route/ 目录下。

示例:定义一个路由 编辑 route/app.php 文件:

<?php
use think\facade\Route;
// 首页路由
Route::get('index', 'Index/index');
// 带参数的路由
Route::get('hello/:name', 'Index/hello');
// 资源路由,会自动生成多个常用路由(增删改查)
Route::resource('user', 'User');

定义路由后,访问 http://localhost/你的项目名/index.php/hello/World,就会直接调用 Index 控制器的 hello 方法。

数据库操作

ThinkPHP 提供了非常便捷的数据库操作方式。

数据库配置

如上所述,在 config/database.php.env 文件中配置好你的数据库信息。

使用 Db 类进行增删改查

Db 类是 ThinkPHP 提供的静态门面,用于进行原生的 SQL 查询,它不依赖于模型。

use think\facade\Db;
// 1. 查询
// 查询一条记录
$user = Db::table('user')->where('id', 1)->find();
// 查询多条记录
$list = Db::table('user')->where('status', 1)->select();
// 2. 插入
$data = ['name' => '张三', 'email' => 'zhangsan@example.com', 'create_time' => time()];
$lastInsertId = Db::table('user')->insertGetId($data);
// 3. 更新
Db::table('user')->where('id', $lastInsertId)->update(['name' => '李四']);
// 4. 删除
Db::table('user')->where('id', $lastInsertId)->delete();

使用模型进行增删改查

使用模型进行操作更加面向对象,推荐使用。

use app\model\User;
// 1. 查询
// 查询一条记录
$user = User::find(1);
// 或者使用 where
$user = User::where('name', '张三')->find();
// 查询多条记录
$list = User::where('status', 1)->select();
// 2. 插入
$user = new User;
$user->name = '王五';
$user->email = 'wangwu@example.com';
$user->save(); // 返回布尔值
// 或者使用静态方法
$user = User::create([
    'name' => '赵六',
    'email' => 'zhaoliu@example.com'
]);
// 3. 更新
$user = User::find(1);
$user->name = '钱七';
$user->save();
// 4. 删除
$user = User::find(1);
$user->delete();

视图与模板引擎

视图文件存放在 app/view/ 目录下,子目录名对应控制器名,文件名对应方法名。

变量输出

在控制器中传递变量给视图:

return view('index/index', ['title' => '首页', 'list' => [1, 2, 3]]);

在视图文件 app/view/index/index.html 中输出:

<h1>{$title}</h1>
<ul>
    {volist name="list" id="vo"}
    <li>{$vo}</li>
    {/volist}
</ul>

循环与判断

  • volist:循环数组
    {volist name="users" id="user"}
        <p>ID: {$user.id}, 姓名: {$user.name}</p>
    {/volist}
  • for:for 循环
    {for start="1" end="10" step="1" name="i"}
        <p>{$i}</p>
    {/for}
  • if / elseif / else:条件判断
    {if $user.age > 18}
        <p>已成年</p>
    {elseif $user.age > 12}
        <p>青少年</p>
    {else /}
        <p>儿童</p>
    {/if}

包含文件

使用 include 标签可以引入其他模板文件,便于复用。

{include file="public/header" /}
<!-- 页面内容 -->
{include file="public/footer" /}

public/header.htmlpublic/footer.html 文件应放在 app/view/ 目录下。

表单提交与数据验证

表单提交

在视图中创建一个表单:

<form action="{:url('user/save')}" method="post">
    <input type="hidden" name="__token__" value="{:token()}">
    <p>姓名:<input type="text" name="name"></p>
    <p>邮箱:<input type="text" name="email"></p>
    <p><input type="submit" value="提交"></p>
</form>
  • {:url('user/save')}:使用 url 助手函数生成提交地址,指向 User 控制器的 save 方法。
  • {:token()}:用于 CSRF 防护,ThinkPHP 默认开启。

数据验证

在控制器中接收数据并进行验证。

namespace app\controller;
use think\Request;
use think\facade\Validate;
class User
{
    public function save(Request $request)
    {
        // 1. 获取数据
        $data = $request->post();
        // 2. 验证规则
        $rule = [
            'name'  => 'require|max:25',
            'email' => 'require|email',
        ];
        // 3. 验证提示信息
        $msg = [
            'name.require' => '名称必须',
            'name.max'     => '名称最多不能超过25个字符',
            'email.require'=> '邮箱必须',
            'email.email'  => '邮箱格式错误',
        ];
        // 4. 执行验证
        $validate = Validate::rule($rule)->message($msg);
        if (!$validate->check($data)) {
            // 验证失败,输出错误信息
            return $validate->getError();
        }
        // 5. 验证通过,处理业务逻辑(如保存到数据库)
        // ...
        return '提交成功!';
    }
}

实战:一个简单的留言板

让我们综合运用以上知识,创建一个简单的留言板。

步骤 1:创建数据表 在你的数据库中执行以下 SQL:

CREATE TABLE `tp_message` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` varchar(255) NOT NULL COMMENT '留言内容',
  `create_time` int(11) NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

步骤 2:创建模型app/model 目录下创建 Message.php

<?php
namespace app\model;
use think\Model;
class Message extends Model
{
    protected $name = 'message'; // 指定表名
}

步骤 3:创建控制器app/controller 目录下创建 Message.php

<?php
namespace app\controller;
use think\Request;
use app\model\Message;
class Message
{
    // 显示留言列表
    public function index()
    {
        $list = Message::order('id', 'desc')->select();
        return view('message/index', ['list' => $list]);
    }
    // 显示添加留言页面
    public function add()
    {
        return view('message/add');
    }
    // 处理添加留言
    public function save(Request $request)
    {
        $data = $request->post();
        $data['create_time'] = time();
        $message = new Message;
        $result = $message->save($data);
        if ($result) {
            return '添加成功!<a href="/message/index">返回列表</a>';
        } else {
            return '添加失败!';
        }
    }
}

步骤 4:创建视图

  1. 创建 app/view/message 目录。
  2. message 目录下创建 index.html
    <!DOCTYPE html>
    <html>
    <head>
        <title>留言板</title>
        <style>body { font-family: sans-serif; } .list-item { border: 1px solid #ccc; padding: 10px; margin-bottom: 10px; }</style>
    </head>
    <body>
        <h1>留言列表</h1>
        <a href="{:url('message/add')}">我要留言</a>
        <hr>
        {volist name="list" id="msg"}
        <div class="list-item">
            <p>{$msg.content}</p>
            <small>发布时间:{:date('Y-m-d H:i:s', $msg.create_time)}</small>
        </div>
        {/volist}
    </body>
    </html>
  3. message 目录下创建 add.html
    <!DOCTYPE html>
    <html>
    <head>
        <title>添加留言</title>
    </head>
    <body>
        <h1>添加留言</h1>
        <form action="{:url('message/save')}" method="post">
            <p>留言内容:<textarea name="content" rows="5" cols="30"></textarea></p>
            <p><input type="submit" value="提交"></p>
        </form>
    </body>
    </html>

步骤 5:配置路由 编辑 route/app.php

// ... 其他路由
Route::get('message', 'Message/index');
Route::get('message/add', 'Message/add');
Route::post('message/save', 'Message/save');

步骤 6:访问测试 启动你的 Web 服务器,访问 http://localhost/你的项目名/index.php/message,你就可以看到留言板界面了!

总结与进阶

恭喜!你已经完成了 ThinkPHP 5.1 的入门教程,掌握了开发一个简单 Web 应用的基本流程。

进阶学习方向:

  • 中间件:用于处理请求前和响应后的逻辑,如用户认证、权限控制。
  • 关联模型:学习 hasOne, belongsTo, hasMany 等,处理复杂的数据表关系。
  • 事件系统:在特定的时间点(如模型创建前)触发自定义逻辑。
  • 缓存:使用 Cache 类提升应用性能。
  • 命令行工具:使用 think 命令行工具完成更多任务,如生成代码、管理缓存等。
  • 阅读官方文档ThinkPHP 5.1 完全开发手册 是你最好的老师。

ThinkPHP 社区非常活跃,遇到问题时,多查阅文档、搜索社区,你一定能找到解决方案,祝你学习愉快!

分享:
扫描分享到社交APP
上一篇
下一篇