在 ServBay 中创建并运行 ThinkPHP 8 项目
本文将指导您如何使用 ServBay 这一强大的本地 Web 开发环境,快速创建、配置并运行一个基于 ThinkPHP 8 框架的 PHP 项目。ServBay 提供了预配置好的 PHP 环境、Web 服务器(Caddy 或 Nginx)和多种数据库,极大地简化了 ThinkPHP 项目的本地搭建过程。
什么是 ThinkPHP?
ThinkPHP 是一个起源于中国的开源、快速、简单的面向对象 PHP 开发框架。它遵循简洁、高效的开发原则,旨在为开发者提供一套便利的工具集,用于构建现代 Web 应用程序。ThinkPHP 凭借其易用性、丰富的功能(如强大的 ORM、灵活的路由、内置的模板引擎、缓存支持等)以及活跃的社区支持,在中国 PHP 开发领域拥有广泛的应用。
ThinkPHP 的主要特性和优势
- 简洁高效: 框架设计简洁,代码结构清晰,易于理解和维护,开发效率高。
- 功能全面: 内置了 Web 开发中常用的功能组件,如 MVC 结构、ORM、模板引擎、缓存、会话管理、权限认证、表单令牌等。
- 强大的 ORM: 提供功能强大且易用的对象关系映射,简化数据库操作。
- 灵活的路由: 支持多种路由定义方式,满足复杂的 URL 结构需求。
- 丰富的生态: 拥有大量的扩展库和插件,以及一个庞大且活跃的开发者社区,资源丰富。
- 持续更新: 框架版本迭代迅速,紧跟 PHP 语言的发展和 Web 开发趋势。
ThinkPHP 适用于从小型项目到大型企业级应用的各种规模的 Web 开发需求。
使用 ServBay 搭建 ThinkPHP 8 项目
ServBay 为 ThinkPHP 8 项目的本地开发提供了理想的环境,包括:
- 预安装不同版本的 PHP 及常用扩展。
- 内置 Web 服务器(Caddy 或 Nginx),方便配置网站。
- 集成 MySQL, PostgreSQL, MongoDB, Redis, Memcached 等数据库服务。
- 内置 Composer 依赖管理器。
本指南将利用 ServBay 的这些功能,快速搭建您的 ThinkPHP 8 项目。
前提条件
在开始之前,请确保您已经完成以下准备工作:
- 已在 macOS 系统上下载并安装 ServBay。
- ServBay 正在运行,并且所需的 PHP 版本(ThinkPHP 8 要求 PHP 8.0 或更高版本)以及相关的数据库服务(如 MySQL, PostgreSQL, Redis, Memcached 等)已启动。您可以在 ServBay 控制面板的“软件包”选项卡中检查和启动这些服务。
创建 ThinkPHP 项目
ServBay 建议将您的本地网站文件统一存放在 /Applications/ServBay/www
目录下,这有助于 ServBay 更好地管理您的网站。
确认 Composer 已安装
ServBay 在安装时已经预置了 Composer,通常无需额外安装。您可以在 ServBay 的终端中通过运行
composer --version
命令来验证。使用 Composer 创建 ThinkPHP 项目
打开 macOS 终端,然后执行以下命令在 ServBay 的网站根目录中创建一个新的 ThinkPHP 8 项目:
bashcd /Applications/ServBay/www composer create-project topthink/think servbay-thinkphp-app
1
2这将在
/Applications/ServBay/www
目录下创建一个名为servbay-thinkphp-app
的新文件夹,并下载 ThinkPHP 8 的核心文件及依赖。进入项目目录
项目创建完成后,进入项目目录:
bashcd /Applications/ServBay/www/servbay-thinkphp-app
1
初始化项目配置
完成项目创建后,需要进行一些基本的配置。
配置数据库连接信息
ThinkPHP 的数据库配置通常在
config/database.php
文件中。根据您在 ServBay 中启动的数据库服务,修改此文件以配置正确的连接信息。以下是一个使用 ServBay 默认 MySQL 服务的配置示例:
php<?php // config/database.php return [ // 默认使用的数据库连接配置 'default' => env('database.driver', 'mysql'), // 各个数据库连接配置 'connections' => [ 'mysql' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => env('database.hostname', '127.0.0.1'), // 数据库名 'database' => env('database.database', 'servbay_thinkphp_app'), // 建议为项目创建单独数据库 // 用户名 'username' => env('database.username', 'root'), // 密码 'password' => env('database.password', 'password'), // ServBay 默认密码,请仅用于本地开发! // 端口 'hostport' => env('database.hostport', '3306'), // ... 其他配置 ... ], // ... 其他数据库连接配置 ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27重要提示:
- 请将
database
的值修改为您为该项目创建的实际数据库名称(例如,您可以在 ServBay 的 phpMyAdmin 或 Adminer 中创建一个名为servbay_thinkphp_app
的数据库)。 - ServBay 的默认
root
用户密码为password
。请注意,此密码仅用于本地开发环境,切勿在生产环境中使用! 在生产环境中,务必使用强密码并创建具有最小必要权限的用户。 - 如果您使用
.env
文件来管理环境变量,请确保.env
文件中的配置覆盖了config/database.php
中的默认值。
- 请将
配置 Web 服务器
ThinkPHP 框架的入口文件是 public/index.php
,并且依赖于 URL 重写(Rewrite)规则来处理路由。由于 ThinkPHP 的路由规则与常见的静态文件直达不同,我们需要使用 ServBay 内置的 Rewrite 规则。
在网站设置界面的 Rewrite 规则下拉菜单中,我们选择ThinkPHP
,点击保存。
详细的 ServBay 网站配置步骤,请参考 添加第一个网站。
添加示例代码
为了测试网站配置是否成功以及 ThinkPHP 的基本路由和功能,我们在项目中添加一个简单的路由和控制器。
编辑您的项目文件 /Applications/ServBay/www/servbay-thinkphp-app/route/app.php
,添加以下代码来定义一个简单的 GET 请求路由:
php
<?php
// route/app.php
use think\facade\Route;
// 定义 servbay 路由,访问 /servbay 时执行匿名函数
Route::get('servbay', function () {
return 'Hello ServBay!';
});
// ... 其他路由 ...
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
访问网站
完成以上步骤后,打开您的 Web 浏览器,访问您配置的本地域名和示例路由对应的 URL:
https://thinkphp.servbay.demo/servbay
如果一切配置正确,您将在浏览器中看到输出 Hello ServBay!
。这意味着您的 ThinkPHP 8 项目已成功在 ServBay 环境下运行,并且 Web 服务器和 PHP-FPM 配置均已生效。
NoSQL 数据库示例
ServBay 预置了多种 NoSQL 数据库,如 Memcached 和 Redis。ThinkPHP 提供了方便的缓存抽象层,可以轻松集成这些 NoSQL 服务作为缓存驱动。
Memcached 示例
安装 Memcached 扩展
ServBay 的 PHP 软件包中已经预装了 Memcached 扩展。您只需在 ServBay 控制面板的“软件包”选项卡中确认 Memcached 服务已启动。
配置 Memcached 缓存
编辑
config/cache.php
文件,配置 ThinkPHP 使用 Memcached 作为缓存驱动:php<?php // config/cache.php return [ // 默认缓存驱动 'default' => env('cache.driver', 'memcached'), // 缓存连接配置 'stores' => [ 'memcached' => [ // 缓存类型 'type' => 'memcached', // 服务器列表 'host' => '127.0.0.1', // ServBay Memcached 默认监听地址 'port' => 11211, // ServBay Memcached 默认端口 'persistent' => false, 'expire' => 0, 'timeout' => 0, 'prefix' => '', ], // ... 其他缓存配置 ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23在代码中使用 Memcached 缓存
在您的控制器或路由回调中使用 ThinkPHP 的
Cache
Facade 来操作 Memcached:php<?php use think\facade\Cache; use think\facade\Route; Route::get('/memcached-example', function () { // 设置缓存,有效期 600 秒 Cache::set('my_memcached_key', 'This value is from Memcached!', 600); // 获取缓存 $value = Cache::get('my_memcached_key'); return 'Value from Memcached: ' . $value; });
1
2
3
4
5
6
7
8
9
10
11
12
13访问
https://thinkphp.servbay.demo/memcached-example
来测试。
Redis 示例
安装 Redis 扩展
ServBay 的 PHP 软件包中已经预装了 Redis 扩展。您只需在 ServBay 控制面板的“软件包”选项卡中确认 Redis 服务已启动。
配置 Redis 缓存
编辑
config/cache.php
文件,配置 ThinkPHP 使用 Redis 作为缓存驱动:php<?php // config/cache.php return [ // 默认缓存驱动 'default' => env('cache.driver', 'redis'), // 缓存连接配置 'stores' => [ 'redis' => [ // 缓存类型 'type' => 'redis', // 服务器地址 'host' => env('cache.host', '127.0.0.1'), // ServBay Redis 默认监听地址 // 端口 'port' => env('cache.port', 6379), // ServBay Redis 默认端口 // 密码 (ServBay 默认无密码) 'password' => env('cache.password', ''), // ServBay Redis 默认无密码 'select' => 0, 'timeout' => 0, 'expire' => 0, 'persistent' => false, 'prefix' => '', ], // ... 其他缓存配置 ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27注意: ServBay 默认安装的 Redis 没有配置密码。如果您手动为 Redis 设置了密码,请在此处更新
password
字段。在代码中使用 Redis 缓存
在您的控制器或路由回调中使用 ThinkPHP 的
Cache
Facade 来操作 Redis:php<?php use think\facade\Cache; use think\facade\Route; Route::get('/redis-example', function () { // 设置缓存,永久有效 (或使用第三个参数设置有效期) Cache::set('my_redis_key', 'Hello from Redis!'); // 获取缓存 $value = Cache::get('my_redis_key'); return 'Value from Redis: ' . $value; });
1
2
3
4
5
6
7
8
9
10
11
12
13访问
https://thinkphp.servbay.demo/redis-example
来测试。
关系型数据库示例
ServBay 集成了 MySQL 和 PostgreSQL 等主流关系型数据库。ThinkPHP 的 ORM 可以方便地与这些数据库交互。
使用 ThinkPHP 数据库迁移工具
在 ThinkPHP 中,通常使用数据库迁移工具来管理数据库结构的变化,这有助于团队协作和版本控制。
安装数据库迁移工具
在项目根目录下使用 Composer 安装 ThinkPHP 提供的数据库迁移扩展:
bashcd /Applications/ServBay/www/servbay-thinkphp-app composer require topthink/think-migration
1
2创建迁移文件
使用 ThinkPHP 提供的命令行工具生成一个新的迁移文件。例如,我们创建一个用于创建
users
表的迁移:bashphp think migrate:create CreateUserTable
1这会在
database/migrations
目录下生成一个新的 PHP 文件,文件名包含时间戳和您指定的名称(例如20231027100000_create_user_table.php
)。编辑迁移文件
打开
database/migrations
目录下新创建的迁移文件,编辑up()
方法来定义users
表的结构:php<?php // database/migrations/YYYYMMDDHHMMSS_create_user_table.php use think\migration\Migrator; use think\migration\db\Column; class CreateUserTable extends Migrator { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * http://docs.phinx.org/en/latest/migrations.html#the-change-method * * The following commands can be used in this method and Phinx will * automatically reverse them when rolling back: * * createTable * renameTable * addColumn * addCustomColumn * renameColumn * addIndex * addForeignKey * createDatabase * renameDatabase * dropTable * dropColumn * dropIndex * dropForeignKey */ public function change() { // 使用 createTable 方法创建表 $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 50, 'comment' => '用户姓名']) ->addColumn('email', 'string', ['limit' => 100, 'comment' => '邮箱地址']) ->addIndex(['email'], ['unique' => true]) // 添加唯一索引 ->addTimestamps() // 添加 created_at 和 updated_at 字段 ->create(); // 执行创建 } // 如果不使用 change 方法,也可以分别定义 up() 和 down() 方法 /* public function up() { $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 50, 'comment' => '用户姓名']) ->addColumn('email', 'string', ['limit' => 100, 'comment' => '邮箱地址']) ->addIndex(['email'], ['unique' => true]) ->addTimestamps() ->create(); } public function down() { $this->dropTable('users'); } */ }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62运行数据库迁移
在 ServBay 终端中,确保您在项目根目录下,然后运行迁移命令来创建
users
表:bashphp think migrate:run
1如果成功,您将在数据库中看到新创建的
users
表。
MySQL 示例
假设您已经在 ServBay 中启动了 MySQL 服务,并在 config/database.php
中配置了 MySQL 连接(如前所述)。
配置 MySQL 连接
请参考前面“初始化项目配置”中的 MySQL 配置示例,确保
config/database.php
中的mysql
连接信息正确。在代码中写入用户数据
使用 ThinkPHP 的
Db
Facade 或 ORM 模型来插入数据。以下是一个使用Db
Facade 的示例:php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-add-user', function () { try { Db::table('users')->insert([ 'name' => 'ServBay Demo User', 'email' => 'demo@servbay.demo', // 使用品牌示例邮箱 'created_at' => date('Y-m-d H:i:s'), // 手动添加时间戳,如果 addTimestamps() 没有自动填充 'updated_at' => date('Y-m-d H:i:s'), ]); return 'User added successfully!'; } catch (\Exception $e) { return 'Error adding user: ' . $e->getMessage(); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17访问
https://thinkphp.servbay.demo/mysql-add-user
来测试插入数据。在代码中读取用户数据
使用
Db
Facade 或 ORM 模型来查询数据:php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-users', function () { $users = Db::table('users')->select(); // 获取所有用户数据 return json($users); // 将结果以 JSON 格式返回 });
1
2
3
4
5
6
7
8访问
https://thinkphp.servbay.demo/mysql-users
来查看users
表中的数据。
PostgreSQL 示例
假设您已经在 ServBay 中启动了 PostgreSQL 服务,并在 config/database.php
中配置了 PostgreSQL 连接。
配置 PostgreSQL 连接
在
config/database.php
文件中,确保您有以下 PostgreSQL 连接配置(或其他根据您实际设置的配置):php<?php // config/database.php (部分) return [ // ... 其他配置 ... 'connections' => [ // ... MySQL 配置 ... 'pgsql' => [ // 数据库类型 'type' => 'pgsql', // 服务器地址 'hostname' => env('database.hostname', '127.0.0.1'), // 数据库名 'database' => env('database.database', 'servbay_thinkphp_app'), // 建议为项目创建单独数据库 // 用户名 'username' => env('database.username', 'root'), // 密码 'password' => env('database.password', 'password'), // ServBay 默认密码,请仅用于本地开发! // 端口 'hostport' => env('database.hostport', '5432'), // PostgreSQL 默认端口 // ... 其他配置 ... ], // ... 其他数据库连接配置 ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27重要提示:
- 与 MySQL 类似,请为项目创建单独的 PostgreSQL 数据库,并在配置中指定。
- ServBay 默认 PostgreSQL 的
root
用户密码也是password
。请仅用于本地开发。
在代码中写入用户数据
使用 ThinkPHP 的
Db
Facade 或 ORM 模型来插入数据,并指定使用pgsql
连接:php<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-add-user', function () { try { Db::connect('pgsql')->table('users')->insert([ // 使用 pgsql 连接 'name' => 'ServBay PgSQL User', 'email' => 'pgsql-demo@servbay.demo', // 使用品牌示例邮箱 // PostgreSQL 的时间戳字段可能需要手动填充,取决于迁移定义和 ThinkPHP 版本 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ]); return 'PostgreSQL User added successfully!'; } catch (\Exception $e) { return 'Error adding PostgreSQL user: ' . $e->getMessage(); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18访问
https://thinkphp.servbay.demo/pgsql-add-user
来测试插入数据。在代码中读取用户数据
使用
Db
Facade 或 ORM 模型来查询数据,并指定使用pgsql
连接:php<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-users', function () { $users = Db::connect('pgsql')->table('users')->select(); // 使用 pgsql 连接获取数据 return json($users); // 将结果以 JSON 格式返回 });
1
2
3
4
5
6
7
8访问
https://thinkphp.servbay.demo/pgsql-users
来查看users
表中的 PostgreSQL 数据。
总结
通过以上步骤,您已经成功地使用 ServBay 本地开发环境创建、配置并运行了一个 ThinkPHP 8 项目。您学会了如何利用 ServBay 的内置 Composer 创建项目、配置 Caddy Web 服务器处理 ThinkPHP 的路由,以及如何连接并使用 ServBay 提供的 MySQL、PostgreSQL、Memcached 和 Redis 数据库服务。
ServBay 极大地简化了 ThinkPHP 等 PHP 框架的本地开发环境搭建过程,让您可以专注于业务逻辑的实现。现在您可以继续开发您的 ThinkPHP 应用程序,充分利用 ServBay 提供的各种软件包和功能。