创建并运行 CodeIgniter 项目
什么是 CodeIgniter?
CodeIgniter 是一个轻量级且高性能的 PHP Web 应用开发框架。它遵循 Model-View-Controller (MVC) 设计模式,旨在帮助开发者快速构建功能丰富的 Web 应用程序。CodeIgniter 以其简洁的结构、优秀的性能和易于学习的特性,成为许多 PHP 开发者的首选框架。
CodeIgniter 的主要特性和优势
- 轻量级核心: CodeIgniter 的核心系统非常精简,仅包含运行所需的基本组件,加载速度极快。
- 卓越性能: 框架设计注重效率,能够处理高并发请求,提供出色的应用性能。
- 易于上手: 提供清晰的文档和直观的 API,降低学习曲线,开发者可以快速掌握。
- 高度灵活性: 允许开发者根据项目需求自由选择和集成第三方库,方便功能扩展和定制。
- 活跃社区支持: 拥有庞大且活跃的开发者社区,提供丰富的资源和支持。
CodeIgniter 适用于从小型项目到大型企业级应用的各种开发需求,助力开发者高效构建高质量的 Web 解决方案。
使用 ServBay 搭建 CodeIgniter 开发环境
ServBay 是一款为 macOS 设计的本地 Web 开发环境工具,集成了 PHP、数据库(MySQL, PostgreSQL, MongoDB)、缓存(Redis, Memcached)、Web 服务器(Caddy, Nginx, Apache)等多种软件包,并提供便捷的管理界面。使用 ServBay,您可以轻松搭建和管理 CodeIgniter 所需的开发环境。
本文将指导您如何利用 ServBay 的 PHP 环境和网站功能来创建、配置并运行一个 CodeIgniter 项目,并演示如何集成多种数据库和缓存服务。
前提条件
在开始之前,请确保您已完成以下准备工作:
- 已在 macOS 系统上成功安装并运行 ServBay。
- 在 ServBay 中已启用您计划使用的 PHP 版本(例如 PHP 8.3)。
- 在 ServBay 中已启用您计划使用的数据库和缓存软件包(例如 MySQL, PostgreSQL, Redis, Memcached)。
创建 CodeIgniter 项目
ServBay 推荐将您的网站项目统一存放在 /Applications/ServBay/www
目录下,这有助于 ServBay 更好地管理本地网站。
安装 Composer
ServBay 在安装时已经自带了 Composer,通常无需额外手动安装。您可以在终端中直接使用
composer
命令。进入网站根目录
打开终端,进入 ServBay 推荐的网站根目录:
bashcd /Applications/ServBay/www
1创建 CodeIgniter 项目
使用 Composer 创建一个新的 CodeIgniter 4 项目。我们将项目目录命名为
servbay-codeigniter-app
:bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1Composer 将下载 CodeIgniter 的骨架应用及依赖项到
servbay-codeigniter-app
目录中。进入项目目录
进入新创建的 CodeIgniter 项目目录:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1
初始化配置
配置数据库连接
CodeIgniter 的数据库配置位于 app/Config/Database.php
文件中。在使用数据库之前,您需要在此文件配置连接信息。
首先,如果您计划使用数据库,请确保您已通过 ServBay 的数据库管理工具(如 Adminer 或 phpMyAdmin,可在 ServBay 应用界面中访问)创建了名为 servbay_codeigniter_app
的数据库。
然后,编辑 app/Config/Database.php
文件,找到 $default
数组,并根据您在 ServBay 中启用的数据库类型(例如 MySQL 或 PostgreSQL)填写连接信息。默认的 ServBay 数据库用户名和密码通常为 root
和 password
。
以下是一个 MySQL 配置示例:
public $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // ServBay 数据库通常监听在 127.0.0.1
'username' => 'root', // ServBay 默认用户名
'password' => 'password', // ServBay 默认密码
'database' => 'servbay_codeigniter_app', // 您创建的数据库名
'DBDriver' => 'MySQLi', // 根据数据库类型设置,MySQL 使用 MySQLi 或 Pdo
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306, // MySQL 默认端口
];
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
如果使用 PostgreSQL,则 DBDriver
应设置为 'Postgre'
,port
通常为 5432
,并且字符集相关的设置可能需要调整。
配置缓存连接 (Memcached/Redis)
如果计划使用 Memcached 或 Redis 作为缓存,您需要在 app/Config/Cache.php
文件中进行配置。
编辑 app/Config/Cache.php
文件。找到相应的配置段落。ServBay 的 Memcached 默认监听端口是 11211
,Redis 默认监听端口是 6379
,通常无需密码。
以下是一个 Memcached 配置示例:
public $memcached = [
'host' => '127.0.0.1', // ServBay Memcached 通常监听在 127.0.0.1
'port' => 11211, // Memcached 默认端口
'weight' => 1,
];
2
3
4
5
以下是一个 Redis 配置示例:
public string $handler = 'redis'; // 将默认缓存处理器设置为 redis
public $default = [ // Redis 配置通常在 default 数组中
'host' => '127.0.0.1', // ServBay Redis 通常监听在 127.0.0.1
'password' => null, // ServBay Redis 默认无密码
'port' => 6379, // Redis 默认端口
'timeout' => 0,
'database' => 0,
];
2
3
4
5
6
7
8
9
确保根据您启用的缓存软件包来配置相应的段落。
配置 Web 服务器 (ServBay 网站设置)
使用 ServBay 的网站功能来配置 Web 服务器,使其指向您的 CodeIgniter 项目。
- 打开 ServBay 应用程序界面。
- 导航到 网站 (Websites) 标签页。
- 点击左下角的
+
按钮添加一个新的网站。 - 填写网站信息:
- 名字 (Name): 输入一个易于识别的名称,例如
My First CodeIgniter Dev Site
。 - 域名 (Domain): 输入您想在本地浏览器中访问的域名,例如
servbay-codeigniter-test.local
。ServBay 会自动将.local
域名解析到本地。 - 网站类型 (Site Type): 选择
PHP
。 - PHP 版本 (PHP Version): 选择您希望使用的 PHP 版本,例如
8.3
。 - 网站根目录 (Document Root): 这是关键步骤。CodeIgniter 的入口文件 (
index.php
) 位于项目根目录下的public
文件夹中。因此,网站根目录必须设置为项目目录内的public
文件夹:/Applications/ServBay/www/servbay-codeigniter-app/public
。
- 名字 (Name): 输入一个易于识别的名称,例如
- 点击 添加 (Add) 按钮保存设置。
- ServBay 可能会提示您应用更改,点击确认。
详细设置步骤请参考 添加第一个网站。
添加示例代码
为了验证项目是否正常运行以及测试数据库和缓存连接,我们修改 CodeIgniter 默认的 Home
控制器,添加一些示例方法。
编辑文件 app/Controllers/Home.php
,将其内容替换为以下代码:
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Database\Exceptions\DatabaseException; // 引入数据库异常类
use CodeIgniter\Cache\Exceptions\CacheException; // 引入缓存异常类
class Home extends Controller
{
/**
* 默认首页方法
*/
public function index(): string
{
// 返回简单的欢迎信息
return '<h1>Hello ServBay and CodeIgniter!</h1><p>Your CodeIgniter project is running on ServBay.</p>';
}
/**
* Memcached 示例方法
*/
public function memcached(): string
{
try {
$cache = \Config\Services::cache();
// 尝试写入缓存
$success = $cache->save('servbay_memcached_key', 'Hello Memcached from CodeIgniter!', 60); // 缓存 60 秒
if (!$success) {
return 'Error: Failed to save data to Memcached. Check Memcached service and configuration.';
}
// 尝试读取缓存
$value = $cache->get('servbay_memcached_key');
if ($value === null) {
return 'Error: Failed to get data from Memcached. Cache might have expired or service is down.';
}
return 'Memcached Test Success: ' . $value;
} catch (CacheException $e) {
// 捕获缓存相关的异常
return 'Cache Error: ' . $e->getMessage() . '. Ensure Memcached service is running and configured correctly.';
} catch (\Exception $e) {
// 捕获其他潜在异常
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* Redis 示例方法
*/
public function redis(): string
{
try {
$cache = \Config\Services::cache();
// 尝试写入缓存
$success = $cache->save('servbay_redis_key', 'Hello Redis from CodeIgniter!', 60); // 缓存 60 秒
if (!$success) {
return 'Error: Failed to save data to Redis. Check Redis service and configuration.';
}
// 尝试读取缓存
$value = $cache->get('servbay_redis_key');
if ($value === null) {
return 'Error: Failed to get data from Redis. Cache might have expired or service is down.';
}
return 'Redis Test Success: ' . $value;
} catch (CacheException $e) {
// 捕获缓存相关的异常
return 'Cache Error: ' . $e->getMessage() . '. Ensure Redis service is running and configured correctly.';
} catch (\Exception $e) {
// 捕获其他潜在异常
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* 将用户数据写入数据库 (MySQL/PostgreSQL)
*/
public function addUser(): string
{
try {
$db = \Config\Database::connect();
// 检查 'users' 表是否存在 (简单的预防措施)
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// 插入数据
$data = [
'name' => 'ServBay Demo User',
'email' => 'user_' . time() . '@servbay.demo', // 使用 time() 创建唯一 email
];
$db->table('users')->insert($data);
// 检查插入是否成功 (可选,insert() 通常返回 true)
// if ($db->affectedRows() > 0) {
return 'User added successfully: ' . $data['email'];
// } else {
// return 'Error: Failed to add user.';
// }
} catch (DatabaseException $e) {
// 捕获数据库相关的异常
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// 捕获其他潜在异常
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* 从数据库读取用户数据 (MySQL/PostgreSQL)
*/
public function listUsers(): string
{
try {
$db = \Config\Database::connect();
// 检查 'users' 表是否存在
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// 查询所有用户
$users = $db->table('users')->get()->getResult();
if (empty($users)) {
return 'No users found in the database.';
}
// 返回 JSON 格式的用户列表
return json_encode($users);
} catch (DatabaseException $e) {
// 捕获数据库相关的异常
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// 捕获其他潜在异常
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
}
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
这个更新后的控制器包含了更清晰的输出和基本的错误处理,以帮助诊断问题。
配置路由
为了能够通过 URL 访问我们刚刚在 Home
控制器中添加的示例方法,需要在 CodeIgniter 的路由文件中添加相应的路由规则。
编辑文件 app/Config/Routes.php
。找到 $routes
定义部分,在其中添加以下路由规则:
// ... 其他路由规则 ...
// Memcached 示例路由
$routes->get('/memcached', 'Home::memcached');
// Redis 示例路由
$routes->get('/redis', 'Home::redis');
// 数据库示例路由
$routes->get('/add-user', 'Home::addUser');
$routes->get('/list-users', 'Home::listUsers');
// ... 其他路由规则 ...
2
3
4
5
6
7
8
9
10
11
12
13
确保将这些新路由添加到现有的 $routes
定义中,不要覆盖原有内容。
访问网站
现在,您的 CodeIgniter 项目已配置并运行在 ServBay 上。打开您的 Web 浏览器,通过之前设置的域名进行访问:
访问首页:
https://servbay-codeigniter-test.local
您应该会看到页面输出Hello ServBay and CodeIgniter!
字样,表明您的项目已通过 ServBay 的 Web 服务器正常运行。访问 Memcached 示例:
https://servbay-codeigniter-test.local/memcached
如果 Memcached 服务和配置正确,您应该看到类似Memcached Test Success: Hello Memcached from CodeIgniter!
的输出。访问 Redis 示例:
https://servbay-codeigniter-test.local/redis
如果 Redis 服务和配置正确,您应该看到类似Redis Test Success: Hello Redis from CodeIgniter!
的输出。
数据库操作示例 (MySQL/PostgreSQL)
在使用数据库示例之前,您需要运行 CodeIgniter 的迁移命令来创建 users
表。
创建数据库结构 (运行迁移)
打开终端,进入 CodeIgniter 项目目录:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1创建迁移文件: 使用 CodeIgniter 的 CLI 工具生成一个迁移文件来定义
users
表结构:bashphp spark make:migration create_users_table
1这会在
app/Database/Migrations
目录下创建一个新的 PHP 文件。编辑迁移文件: 打开新生成的迁移文件(文件名类似
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
),编辑up()
方法来定义users
表的列和索引。请注意,MySQL 和 PostgreSQL 在自动时间戳字段的默认值语法上略有不同 (CURRENT_TIMESTAMP
vsNOW()
),CodeIgniter 的RawSql
可以帮助处理这一点。以下是一个示例:php<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; use CodeIgniter\Database\RawSql; // 确保引入 RawSql 类 class CreateUsersTable extends Migration { public function up() { $this->forge->addField([ 'id' => [ 'type' => 'INT', 'constraint' => 5, 'unsigned' => true, 'auto_increment' => true, ], 'name' => [ 'type' => 'VARCHAR', 'constraint' => '100', ], 'email' => [ 'type' => 'VARCHAR', 'constraint' => '100', 'unique' => true, // 邮箱字段设置为唯一 ], 'created_at' => [ 'type' => 'TIMESTAMP', // 根据数据库类型选择合适的默认值表达式 // MySQL: 'default' => new RawSql('CURRENT_TIMESTAMP'), // PostgreSQL: 'default' => new RawSql('NOW()'), 'default' => new RawSql($this->db->getPlatform() === 'MySQLi' ? 'CURRENT_TIMESTAMP' : 'NOW()'), // 动态选择 ], 'updated_at' => [ 'type' => 'TIMESTAMP', // MySQL: 'default' => new RawSql('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), // PostgreSQL: 'default' => new RawSql('NOW()'), 'default' => new RawSql($this->db->getPlatform() === 'MySQLi' ? 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' : 'NOW()'), // 动态选择 ], ]); $this->forge->addKey('id', true); // 设置 id 为主键 $this->forge->createTable('users'); // 创建 users 表 } public function down() { // 用于回滚迁移,删除 users 表 $this->forge->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注意: 上面的示例使用了简单的逻辑根据数据库平台动态选择时间戳默认值语法。在实际项目中,您可能需要更健壮的迁移策略或为不同数据库维护不同的迁移文件。
运行迁移: 在终端中执行以下命令来运行迁移,创建
users
表:bashphp spark migrate
1如果成功,您应该在终端看到迁移运行成功的提示。您也可以通过 ServBay 的数据库管理工具(如 Adminer)检查
servbay_codeigniter_app
数据库中是否已创建users
表。
访问数据库示例
确保您已经在 app/Config/Database.php
中正确配置了数据库连接信息,并且已经运行了迁移创建了 users
表。
添加用户到数据库: 访问
https://servbay-codeigniter-test.local/add-user
每次访问此 URL,都会向users
表中插入一个新的用户记录。您应该看到类似User added successfully: [email protected]
的输出。列出数据库中的用户: 访问
https://servbay-codeigniter-test.local/list-users
此 URL 将查询users
表中的所有记录,并以 JSON 格式输出。您应该看到一个包含用户数据的 JSON 数组。
总结
通过以上步骤,您已经成功地在 macOS 的 ServBay 环境中创建、配置并运行了一个 CodeIgniter 项目。您学会了如何使用 Composer 创建项目、配置 ServBay 的网站来指向项目的正确目录、配置 CodeIgniter 的数据库和缓存连接,以及如何通过简单的示例代码验证数据库和缓存的集成。ServBay 简化了本地环境搭建和管理过程,让您可以更专注于 CodeIgniter 应用的开发。