在 ServBay 本地开发环境中创建和运行 FuelPHP 项目
什么是 FuelPHP?
FuelPHP 是一个灵活且模块化的 PHP 框架,专为构建现代 Web 应用程序而设计。它遵循层次化模型-视图-控制器(HMVC - Hierarchical Model-View-Controller)设计模式,提供了丰富的功能和工具,旨在帮助开发者快速高效地构建高质量的 Web 应用。FuelPHP 以其卓越的灵活性、高性能表现和易于扩展的特性,成为许多 PHP 开发者的首选框架。
FuelPHP 的主要特性和优势
- HMVC 架构:支持层次化的 MVC 设计模式,这有助于代码的组织、重用和模块化开发,特别适用于大型或复杂的项目。
- 高性能:FuelPHP 在设计上注重性能优化,以其高效的速度和资源利用率而闻名,能够有效处理高并发请求。
- 易于扩展:框架提供了强大的扩展机制,开发者可以轻松集成第三方库或添加自定义功能,以满足特定项目需求。
- 安全性:内置了多种安全功能,包括自动输入验证、输出过滤(防止 XSS)、CSRF 防护、SQL 注入预防等,帮助开发者构建更安全的应用程序。
- 强大的社区支持:FuelPHP 拥有一个活跃的开发者社区,可以获得及时的帮助和丰富的第三方资源。
FuelPHP 凭借这些特性,能够帮助开发者快速构建高性能、安全且易于维护的 Web 应用,适用于从小型项目到大型企业级应用的各种规模的项目。
使用 ServBay 搭建 FuelPHP 开发环境
ServBay 是一个专为开发者设计的本地 Web 开发环境,它预装了 PHP、Caddy/Nginx/Apache、MySQL/PostgreSQL/MongoDB、Redis 等多种开发所需的服务和工具。使用 ServBay,您可以轻松地为 FuelPHP 项目搭建所需的运行环境,无需手动安装和配置各种依赖。
本指南将详细介绍如何利用 ServBay 提供的 PHP 环境、Web 服务器(Caddy)以及数据库和缓存服务来创建并运行一个 FuelPHP 项目。我们将利用 ServBay 的网站功能来配置 Web 服务器,并通过简单的步骤实现项目的快速访问和测试。
前提条件
在开始之前,请确保满足以下条件:
- 您已经在 macOS 上成功安装并运行了 ServBay。
- ServBay 中的 PHP 环境已启用(ServBay 默认会启用)。
- ServBay 中您计划使用的数据库服务(如 MySQL)和缓存服务(如 Redis, Memcached)已启动并正常运行。
- ServBay 已经自带 Composer,无需额外安装。
创建 FuelPHP 项目
建议的项目存放路径
ServBay 建议开发者将网站项目统一放置在 /Applications/ServBay/www
目录下,这有助于 ServBay 的管理和配置。本指南也将使用此目录作为示例。
切换到网站根目录
打开终端应用,切换到 ServBay 建议的网站根目录:
bashcd /Applications/ServBay/www
1创建项目目录
为您的 FuelPHP 项目创建一个新的目录,并进入该目录:
bashmkdir servbay-fuelphp-app cd servbay-fuelphp-app
1
2使用 Composer 创建 FuelPHP 项目
在项目目录下,使用 Composer 下载并初始化 FuelPHP 框架。
.
表示在当前目录创建项目:bashcomposer create-project fuel/fuel .
1Composer 将会自动下载 FuelPHP 框架及其依赖项到
servbay-fuelphp-app
目录中。
配置 Web 服务器 (使用 ServBay 网站功能)
为了通过浏览器访问您的 FuelPHP 项目,您需要使用 ServBay 的网站功能为其配置一个虚拟主机。
- 打开 ServBay 主界面。
- 点击侧边栏的 网站 菜单项。
- 点击界面右上角的 添加网站 按钮。
- 在弹出的配置窗口中填写以下信息:
- 名字:为您的网站起一个易于识别的名称,例如
My First FuelPHP Dev Site
。 - 域名:设置一个本地开发域名,例如
servbay-fuelphp-test.local
。ServBay 会自动将此域名解析到本地。 - 网站类型:选择
PHP
。 - PHP 版本:选择您希望使用的 PHP 版本,例如
8.3
。 - 网站根目录:指定 FuelPHP 项目的入口目录。FuelPHP 的公共入口文件是
public/index.php
,所以网站根目录应设置为项目的public
子目录:/Applications/ServBay/www/servbay-fuelphp-app/public
。
- 名字:为您的网站起一个易于识别的名称,例如
- 点击 添加 按钮保存配置。
ServBay 将自动更新 Caddy 配置并重载服务,使新的域名生效。
详细的网站添加步骤可以参考 ServBay 文档中的 添加第一个网站。
配置 FuelPHP 项目服务连接
FuelPHP 项目通常需要配置数据库、缓存等服务的连接信息。
数据库配置
FuelPHP 的数据库配置位于 fuel/app/config/development/db.php
文件中。编辑此文件,配置您的数据库连接信息。假设您使用的是 ServBay 默认的 MySQL 服务:
<?php
/**
* The development database settings. These get merged with the global settings.
*/
return [
'default' => [
'connection' => [
'dsn' => 'mysql:host=localhost;dbname=fuel_dev', // 请确保 fuel_dev 数据库已存在
'username' => 'root', // ServBay MySQL 默认用户
'password' => 'root', // ServBay MySQL 默认密码 (仅用于本地开发!)
],
'identifier' => '`', // MySQL 需要反引号作为标识符
],
];
2
3
4
5
6
7
8
9
10
11
12
13
14
注意:
- 您需要在 ServBay 的数据库管理工具(如 phpMyAdmin 或 Adminer)中手动创建一个名为
fuel_dev
的数据库。ServBay 默认的 MySQL 用户root
的密码也是root
,这仅推荐用于本地开发环境。 'identifier' => '
'` 对于 MySQL 是必需的,确保表名和字段名被正确引用。
缓存配置 (Memcached 和 Redis)
FuelPHP 支持多种缓存驱动。您可以在 fuel/app/config/cache.php
文件中配置缓存驱动和连接信息。确保 ServBay 中的 Memcached 和/或 Redis 服务已启动。
Memcached 配置 (fuel/app/config/cache.php
):
如果使用 Memcached 作为默认缓存:
<?php
return [
'driver' => 'memcached', // 设置默认驱动为 memcached
'memcached' => [
'cache_id' => 'fuel', // 缓存 ID
'servers' => [
'default' => [
'host' => '127.0.0.1', // Memcached 默认监听地址
'port' => 11211, // Memcached 默认端口
'weight' => 100,
],
],
'compression' => false, // 是否启用压缩
],
// ... 其他缓存驱动配置
];
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ServBay 提供的 PHP 版本通常已经预装了 Memcached 扩展。
Redis 配置 (fuel/app/config/redis.php
):
如果使用 Redis,您需要配置 Redis 连接信息。FuelPHP 的 Redis 配置通常在单独的 redis.php
文件中:
<?php
return [
'default' => [
'hostname' => '127.0.0.1', // Redis 默认监听地址
'port' => 6379, // Redis 默认端口
'database' => 0, // Redis 数据库索引
],
// 您可以配置多个 Redis 连接
];
2
3
4
5
6
7
8
9
ServBay 提供的 PHP 版本通常已经预装了 Redis 扩展。
数据库和缓存服务示例
为了演示 FuelPHP 如何与数据库和缓存服务交互,我们将添加一些示例代码。
准备数据库表 (使用 FuelPHP Migrations)
FuelPHP 提供了 Oil 工具来管理数据库迁移 (Migrations),这是一种版本控制数据库结构的方式。
创建迁移文件
在项目根目录 (
servbay-fuelphp-app
) 中,使用 Oil 工具创建一个新的迁移文件来定义users
表结构:bashphp oil generate migration create_users_table
1这将在
fuel/app/migrations
目录下创建一个新的迁移文件,文件名中包含时间戳。编辑迁移文件
打开新创建的迁移文件 (
fuel/app/migrations/xxxxxxxxxxxx_create_users_table.php
),编辑up()
方法来定义表结构,并在down()
方法中定义回滚操作:php<?php namespace Fuel\Migrations; use Fuel\Core\DBUtil; class Create_users_table { public function up() { // 创建 users 表 DBUtil::create_table('users', [ 'id' => ['type' => 'int', 'constraint' => 11, 'auto_increment' => true], 'name' => ['type' => 'varchar', 'constraint' => 100], 'email' => ['type' => 'varchar', 'constraint' => 100, 'unique' => true], ], ['id'], true, 'InnoDB', 'utf8mb4_unicode_ci'); // 指定主键, 启用索引, 设置引擎和字符集 } public function down() { // 删除 users 表 (回滚操作) DBUtil::drop_table('users'); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23运行迁移
在项目根目录 (
servbay-fuelphp-app
) 中,使用 Oil 工具运行迁移,创建数据库表:bashphp oil refine migrate
1如果一切顺利,
users
表将在fuel_dev
数据库中被创建。
添加示例控制器代码
编辑文件 fuel/app/classes/controller/welcome.php
,添加用于演示数据库和缓存操作的方法:
<?php
use Fuel\Core\Controller;
use Fuel\Core\Response;
use Fuel\Core\Cache;
use Fuel\Core\DB; // 引入 DB facade
use Fuel\Core\Redis; // 引入 Redis facade
class Controller_Welcome extends Controller
{
// 默认首页 Action
public function action_index()
{
return Response::forge('Hello ServBay!');
}
// Memcached 示例 Action
public function action_memcached()
{
// 尝试从缓存获取数据
$value = Cache::get('servbay_memcached_key');
if ($value === false) {
// 如果缓存中没有,则设置数据
$value = 'Hello Memcached from ServBay!';
Cache::set('servbay_memcached_key', $value, 60); // 缓存 60 秒
$value .= ' (from cache)';
} else {
$value .= ' (cached)';
}
return Response::forge($value);
}
// Redis 示例 Action
public function action_redis()
{
// 获取 Redis 实例 (使用默认连接)
$redis = \Redis_Db::instance(); // FuelPHP 1.x 使用 Redis_Db::instance()
// 或者如果配置了多个连接,使用 \Redis_Db::instance('connection_name')
// 设置数据到 Redis
$redis->set('servbay_redis_key', 'Hello Redis from ServBay!');
// 从 Redis 获取数据
$value = $redis->get('servbay_redis_key');
return Response::forge($value);
}
// MySQL 写入示例 Action
public function action_mysql_add()
{
try {
// 向 users 表插入一条记录
$result = DB::insert('users')->set([
'name' => 'ServBay Demo User ' . time(), // 使用时间戳确保唯一性
'email' => 'demo_user_' . time() . '@servbay.test',
])->execute(); // execute() 返回一个包含新插入 ID 的数组
return Response::forge('User added with ID: ' . $result[0]);
} catch (\Database_Exception $e) {
// 捕获数据库异常,例如重复的 email
return Response::forge('Error adding user: ' . $e->getMessage(), 500);
}
}
// MySQL 读取示例 Action
public function action_mysql()
{
// 从 users 表中查询所有记录
$users = DB::select('id', 'name', 'email')->from('users')->execute()->as_array();
// 返回 JSON 格式的用户列表
return Response::forge(json_encode($users, JSON_PRETTY_PRINT));
}
}
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
注意:
- 这里引入了
DB
和Redis
facades (use Fuel\Core\DB;
,use Fuel\Core\Redis;
) 以便直接使用。 - Memcached 和 Redis 的键名使用了
servbay_
前缀以避免冲突。 - MySQL 写入示例中添加了时间和简单的错误处理,并使用了更符合实际的示例文案。
- FuelPHP 1.x 中使用
\Redis_Db::instance()
来获取 Redis 实例。
配置路由
为了通过 URL 访问我们刚才添加的控制器 Action,您需要在 fuel/app/config/routes.php
文件中配置相应的路由。FuelPHP 默认已经配置了访问 Controller_Welcome
的路由,但对于 memcached
, redis
, mysql_add
, mysql
这些 Action,我们需要明确指定。
在 fuel/app/config/routes.php
文件中添加或修改返回的数组:
<?php
return array(
'_root_' => 'welcome/index', // 默认路由指向 welcome 控制器的 index Action
'_404_' => 'welcome/404', // 404 错误页路由
// 为新添加的示例 Action 配置路由
'memcached' => 'welcome/memcached',
'redis' => 'welcome/redis',
'mysql_add' => 'welcome/mysql_add',
'mysql' => 'welcome/mysql',
// ... 其他路由配置
);
2
3
4
5
6
7
8
9
10
11
12
13
访问和测试网站
现在,您可以通过浏览器访问之前在 ServBay 中配置的域名 https://servbay-fuelphp-test.local
来测试您的 FuelPHP 项目和各项服务连接。
- 访问默认页:
https://servbay-fuelphp-test.local
- 预期输出:
Hello ServBay!
- 预期输出:
- 测试 Memcached:
https://servbay-fuelphp-test.local/memcached
- 首次访问可能输出:
Hello Memcached from ServBay! (from cache)
(如果缓存服务正常) - 再次访问可能输出:
Hello Memcached from ServBay! (cached)
(如果缓存服务正常且未过期)
- 首次访问可能输出:
- 测试 Redis:
https://servbay-fuelphp-test.local/redis
- 预期输出:
Hello Redis from ServBay!
(如果 Redis 服务正常)
- 预期输出:
- 添加用户到 MySQL:
https://servbay-fuelphp-test.local/mysql_add
- 预期输出:
User added with ID: [新插入的ID]
(如果 MySQL 服务正常且数据库、表存在)
- 预期输出:
- 读取 MySQL 用户列表:
https://servbay-fuelphp-test.local/mysql
- 预期输出: 一个 JSON 数组,包含
users
表中的所有记录 (如果 MySQL 服务正常且表中有数据)
- 预期输出: 一个 JSON 数组,包含
关于 HTTPS: ServBay 默认会为本地网站配置 SSL 证书,并通过 ServBay User CA 或 ServBay Public CA 信任。如果您的浏览器提示证书不受信任,请确保您已在系统中信任了 ServBay 的 CA 证书。
注意事项
- 确保 ServBay 主界面中,您使用的 PHP 版本、Caddy (或 Nginx/Apache)、MySQL (如果使用数据库)、Redis (如果使用 Redis)、Memcached (如果使用 Memcached) 等服务都处于运行中状态。
- 请确认您在 ServBay 的数据库管理工具中手动创建了
fuel_dev
数据库(或者您在db.php
中配置了其他已存在的数据库)。FuelPHP 的迁移工具oil refine migrate
会在指定的数据库中创建表,但不会自动创建数据库本身。 - FuelPHP 的公共入口文件是
public/index.php
,因此在 ServBay 网站配置中,网站根目录务必指向项目的public
子目录。
总结
通过 ServBay,您可以非常便捷地在 macOS 上为 FuelPHP 项目搭建完整的本地开发环境。本文详细介绍了如何创建 FuelPHP 项目、配置 ServBay 的网站功能、连接数据库和缓存服务,并通过示例代码验证了各项功能的正常工作。ServBay 预集成的各种服务和简化的配置流程,将大大提高您的开发效率。
希望本指南能帮助您顺利地在 ServBay 中开始您的 FuelPHP 开发之旅!