إنشاء وتشغيل مشروع CodeIgniter
ما هو CodeIgniter؟
CodeIgniter هو إطار عمل خفيف وعالي الأداء لتطوير تطبيقات الويب باستخدام PHP. يعتمد نمط تصميم Model-View-Controller (MVC) ويهدف لمساعدة المطورين في بناء تطبيقات قوية بسرعة وبفعالية. يتميز CodeIgniter ببنية واضحة، أداء ممتاز وسهولة التعلم، مما يجعله خيارًا شائعًا لمطوري PHP.
الميزات والفوائد الرئيسية لـ CodeIgniter
- نواة خفيفة: يحتوي الإطار على أساسيات التشغيل فقط، مما يجعله سريع التحميل والأداء.
- أداء ممتاز: مصمم ليحقق كفاءة استجابة عالية حتى عند التعامل مع طلبات كثيرة متزامنة.
- سهولة التعلم: يوفر وثائق واضحة وواجهة برمجية بديهية، مما يجعل بداية العمل به سهلة وسريعة.
- مرونة عالية: يسمح للمطورين بتخصيص الإطار ودمج مكتبات خارجية حسب الحاجة لتوسيع الوظائف.
- دعم مجتمع نشط: يمتلك مجتمع مطورين كبير ونشط يوفر مصادر ودعم متواصل.
يتناسب CodeIgniter مع احتياجات المشاريع الصغيرة وحتى التطبيقات المؤسسية الكبيرة ويساعد المطورين في بناء حلول ويب متقدمة بكفاءة.
إعداد بيئة تطوير CodeIgniter باستخدام ServBay
ServBay هو أداة مخصصة لأنظمة macOS وWindows لتوفير بيئة تطوير ويب محلية متكاملة، حيث يدعم PHP، قواعد بيانات (MySQL، PostgreSQL، MongoDB)، خدمات التخزين المؤقت (Redis، Memcached)، وخوادم ويب (Caddy، Nginx، Apache) من خلال واجهة إدارة مبسطة. باستخدام ServBay يمكنك بسهولة بناء وإدارة البيئة المناسبة لتطوير مشروعك مع CodeIgniter.
هذا الدليل يرشدك خطوة بخطوة لإنشاء وتهيئة وتشغيل مشروع CodeIgniter على ServBay، بالإضافة إلى دمج قواعد البيانات وخدمات التخزين المؤقت.
المتطلبات الأساسية
قبل البدء، تأكد من توفر الآتي:
- تم تثبيت وتشغيل ServBay بنجاح على نظام macOS أو Windows الخاص بك.
- تم تفعيل إصدار PHP الذي ترغب في استخدامه داخل ServBay (مثلاً PHP 8.3).
- تم تفعيل قواعد البيانات وخدمات التخزين المؤقت التي تحتاجها (مثل MySQL، PostgreSQL، Redis، Memcached).
إنشاء مشروع CodeIgniter
يُنصح بحفظ مشاريع المواقع داخل المسارات التالية لسهولة إدارة ServBay:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
تثبيت Composer
يأتي ServBay مُجهّزًا بـComposer. غالبًا لا تحتاج لتثبيته يدويًا ويمكنك تنفيذ أمر
composer
في الطرفية مباشرة.الدخول إلى مجلد الجذر للمواقع
افتح الطرفية وانتقل إلى مجلد المواقع الرئيسي المقترح من ServBay:
macOS:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1إنشاء مشروع CodeIgniter
استخدم Composer لإنشاء مشروع جديد بـ CodeIgniter 4 وسمه مثلاً
servbay-codeigniter-app
:bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1سيقوم Composer بتنزيل تطبيق هيكلي لـ CodeIgniter وجميع المتطلبات إلى مجلد
servbay-codeigniter-app
.الدخول إلى مجلد المشروع
انتقل إلى مجلد المشروع الجديد:
macOS:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1Windows:
cmdcd C:\ServBay\www\servbay-codeigniter-app
1
التهيئة الأولية
إعداد الاتصال بقاعدة البيانات
إعداد قواعد البيانات يتم من خلال ملف app/Config/Database.php
. يجب عليك ضبط بيانات الاتصال فيه قبل استخدام أي قاعدة بيانات.
أولاً، إذا كنت ستستخدم قاعدة بيانات، تأكد من إنشائها باسم servbay_codeigniter_app
عبر أدوات إدارة قواعد البيانات مثل Adminer أو phpMyAdmin المتوفرة في واجهة ServBay.
بعد ذلك، حرر ملف app/Config/Database.php
وابحث عن المصفوفة $default
وقم بتعبئة بيانات الاتصال بحسب نوع قاعدة البيانات التي اخترتها في ServBay (MySQL أو PostgreSQL). اسم المستخدم وكلمة المرور الافتراضية في ServBay عادةً root
وpassword
.
مثال على إعداد MySQL:
php
public $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // قاعدة بيانات ServBay غالبًا تستمع على 127.0.0.1
'username' => 'root', // اسم مستخدم افتراضي
'password' => 'password', // كلمة مرور افتراضية
'database' => 'servbay_codeigniter_app', // اسم قاعدة البيانات
'DBDriver' => 'MySQLi', // نوع المحرك حسب قاعدة البيانات
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306, // المنفذ الافتراضي لـ MySQL
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
إذا اخترت PostgreSQL، اجعل قيمة DBDriver
'Postgre'
، ويكون المنفذ غالباً 5432
وقد تحتاج لضبط خيارات الترميز.
إعداد الاتصال بخدمات التخزين المؤقت (Memcached/Redis)
في حال رغبتك باستخدام Memcached أو Redis كخدمة تخزين مؤقت، يتم الإعداد عبر ملف app/Config/Cache.php
.
عدّل ملف app/Config/Cache.php
وابحث عن قسم الإعداد الخاص بالخدمة. منفذ Memcached في ServBay هو 11211
وRedis هو 6379
، عادةً دون كلمة مرور.
مثال على إعداد Memcached:
php
public $memcached = [
'host' => '127.0.0.1', // Memcached غالبًا يستمع على 127.0.0.1
'port' => 11211, // المنفذ الافتراضي
'weight' => 1,
];
1
2
3
4
5
2
3
4
5
مثال على إعداد Redis:
php
public string $handler = 'redis'; // ضبط المعالج الافتراضي للتخزين المؤقت ليكون Redis
public $default = [ // إعدادات Redis ضمن مصفوفة default
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'timeout' => 0,
'database' => 0,
];
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
تأكد من ضبط الإعدادات حسب الخدمات التي فعلتها في ServBay.
إعداد خادم الويب (إعداد الموقع في ServBay)
استخدم خاصية المواقع في ServBay لضبط خادم الويب بحيث يشير إلى مشروعك في CodeIgniter.
- افتح واجهة تطبيق ServBay.
- انتقل إلى تبويب المواقع (Websites).
- اضغط على زر
+
في الأسفل لإضافة موقع جديد. - أدخل البيانات التالية:
- الاسم (Name): أدخل اسم سهل التمييز مثل
My First CodeIgniter Dev Site
. - النطاق (Domain): أدخل نطاقاً لتستخدمه محلياً مثل
servbay-codeigniter-test.local
(سيتم ربط نطاق .local تلقائياً بالمحلي). - نوع الموقع (Site Type): اختر
PHP
. - إصدار PHP (PHP Version): اختر الإصدار المناسب (مثلاً
8.3
). - المجلد الجذري للموقع (Document Root): هام جداً. الملف الرئيسي للمدخل يوجد داخل مجلد
public
في المشروع. لذا، ضبط المسار ليكونpublic
:/Applications/ServBay/www/servbay-codeigniter-app/public
.
- الاسم (Name): أدخل اسم سهل التمييز مثل
- اضغط إضافة (Add) لحفظ الموقع.
- قد تظهر رسالة لتأكيد التغييرات، وافق عليها.
للمزيد عن الإعدادات، راجع إضافة أول موقع.
إضافة كود برمجي تجريبي
لاختبار المشروع واتصال قواعد البيانات أو التخزين المؤقت، سنعدل وحدة التحكم الافتراضية Home
ونضيف طرقاً تجريبية.
حرر الملف app/Controllers/Home.php
، واستبدل المحتوى بالكود التالي:
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();
// تحقق من وجود جدول المستخدمين
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', // توليد ايميل فريد باستخدام الوقت
];
$db->table('users')->insert($data);
// افتراضيًا، عملية الإدخال تنجح إلا في حالات خاصة
// 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();
// تحقق من وجود الجدول
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();
}
}
}
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
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
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
هذا الكود يقدم رسائل أوضح ويحتوي على معالجة أخطاء لمساعدتك على التشخيص.
إعداد المسارات (Routes)
لكي تستطيع الوصول إلى الطرق الجديدة عبر روابط URL، عليك إضافة قواعد المسارات الخاصة بها في ملف app/Config/Routes.php
.
ابحث عن تعريف $routes
وأضف القواعد التالية:
php
// ... قوانين المسارات الأخرى ...
// مسار اختبار Memcached
$routes->get('/memcached', 'Home::memcached');
// مسار اختبار Redis
$routes->get('/redis', 'Home::redis');
// مسارات قاعدة البيانات
$routes->get('/add-user', 'Home::addUser');
$routes->get('/list-users', 'Home::listUsers');
// ... قوانين المسارات الأخرى ...
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
احرص ألا تستبدل القوانين الأصلية، بل أضف عليها.
الوصول إلى الموقع
بات مشروعك يعمل الآن على ServBay. افتح المتصفح وتوجه إلى النطاق الذي ضبطته سابقًا:
الرئيسية:
https://servbay-codeigniter-test.local
ينبغي أن ترى عبارةHello ServBay and CodeIgniter!
مما يدل على أن الموقع يعمل.اختبار Memcached:
https://servbay-codeigniter-test.local/memcached
إذا كان Memcached مضبوطًا ستظهر رسالة نجاح مشابهة.اختبار Redis:
https://servbay-codeigniter-test.local/redis
إذا كان Redis مضبوطًا ستظهر رسالة نجاح مشابهة.
أمثلة العمليات على قاعدة البيانات (MySQL/PostgreSQL)
قبل تجربة العمليات على قاعدة البيانات، يجب تشغيل عملية الهجرة لإنشاء جدول users
.
إنشاء بنيان قاعدة البيانات (الهجرة)
افتح الطرفية واذهب إلى مجلد المشروع:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1أنشئ ملف الهجرة: استخدم أداة CLI في CodeIgniter لإنشاء الهجرة:
bashphp spark make:migration create_users_table
1سيتم إنشاء ملف جديد داخل
app/Database/Migrations
.عدل ملف الهجرة: افتح ملف الهجرة الجديد (اسمه مثل
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
) وحرر طريقةup()
لتعريف الأعمدة. ملاحظة أن MySQL وPostgreSQL يختلفان في الصياغة الافتراضية لحقل التوقيت (CURRENT_TIMESTAMP
مقابلNOW()
)، ويمكن استخدام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'); // إنشاء جدول المستخدمين } public function down() { // حذف الجدول عند التراجع $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إذا نجح الأمر سترى رسالة بذلك، ويمكنك التحقق عبر Adminer في ServBay من وجود الجدول.
تجربة أمثلة قاعدة البيانات
تأكد من ضبط بيانات الاتصال بقاعدة البيانات في app/Config/Database.php
وأنك أنشأت جدول users عبر الهجرة.
إضافة مستخدم جديد: انتقل إلى
https://servbay-codeigniter-test.local/add-user
ستتم إضافة مستخدم جديد ويظهر لك بريد المستخدم المُضاف.عرض قائمة المستخدمين: انتقل إلى
https://servbay-codeigniter-test.local/list-users
ستظهر قائمة المستخدمين في الجدول بشكل مصفوفة JSON.
الخلاصة
بعد تطبيق الخطوات، تكون قد أنشأت مشروع CodeIgniter متكامل على بيئة ServBay في macOS أو Windows. تعلمت كيف تبدأ مشروعك باستخدام Composer، تحديد مجلد الجذر للموقع، ضبط الاتصال بقواعد البيانات وخدمات التخزين المؤقت، واختبار التكامل عبر كود فعلي. يمكِّنك ServBay من إدارة بيئة التطوير المحلية ببساطة ويجعلك أكثر تركيزاً على بناء تطبيقك بـ CodeIgniter.