إنشاء وتشغيل مشروع CodeIgniter
ما هو CodeIgniter؟
CodeIgniter هو إطار عمل خفيف وعالي الأداء لتطوير تطبيقات الويب بلغة PHP. يعتمد على نمط التصميم Model-View-Controller (MVC)، ويهدف إلى مساعدة المطورين على بناء تطبيقات ويب غنية بالوظائف بسرعة. يتميز CodeIgniter بتركيبه البسيط، أدائه الممتاز، وسهولة تعلمه، مما يجعله خيارًا مفضلاً للعديد من مطوري PHP.
أهم ميزات ومزايا CodeIgniter
- نواة خفيفة الوزن: يأتي نظام CodeIgniter الأساسي بأقل مجموعة من المكونات المطلوبة للتشغيل، مما يساهم في سرعة الإقلاع والأداء.
- أداء قوي: تم تصميم الإطار مع مراعاة الكفاءة، ليتمكن من معالجة الطلبات عالية التوازي وتوفير أداء ممتاز للتطبيقات.
- سهولة البدء: يقدم وثائق واضحة وواجهة برمجية مباشرة تقلل من صعوبة التعلم، ليتمكن المطورون من الإلمام به بسرعة.
- مرونة عالية: يسمح للمطورين باختيار ودمج مكتبات الطرف الثالث وفقًا لاحتياجات المشروع، كما يسهل توسيع الخصائص وتخصيصها.
- دعم مجتمع نشط: يمتلك مجتمعًا كبيرًا وديناميكيًا من المطورين ويوفر موارد ودعمًا وفيرين.
يناسب CodeIgniter جميع احتياجات تطوير المواقع، من المشاريع الصغيرة إلى التطبيقات المؤسسية الكبيرة، ويساعد المطوّرين على بناء حلول ويب فعّالة وعالية الجودة.
إعداد بيئة تطوير CodeIgniter باستخدام ServBay
ServBay هو أداة تطوير ويب محلية مخصصة لنظام macOS، ويجمع بين PHP وقواعد البيانات (MySQL, PostgreSQL, MongoDB)، وخدمات التخزين المؤقت (Redis وMemcached)، وخوادم الويب (Caddy, Nginx, Apache)، بالإضافة إلى واجهة إدارة سهلة الاستخدام. بفضل ServBay يمكنك بناء وإدارة بيئة تطوير CodeIgniter بسهولة.
ستُرشدك هذه المقالة لاستخدام بيئة PHP ضمن ServBay وميزة المواقع لإنشاء وتكوين وتشغيل مشروع CodeIgniter، مع توضيح كيفية دمج قواعد بيانات وخدمات تخزين مؤقت متعددة.
المتطلبات المسبقة
قبل البدء، تأكد من إنجاز التالي:
- أن يكون ServBay مُثبتًا ويعمل على نظام macOS لديك.
- تم تفعيل إصدار PHP المناسب ضمن ServBay (مثلاً PHP 8.3).
- تم تفعيل حزم قواعد البيانات وخدمات التخزين المؤقت التي تخطط لاستخدامها (مثل MySQL, PostgreSQL, Redis, Memcached).
إنشاء مشروع CodeIgniter
توصي ServBay بتخزين جميع مشاريع مواقعك في المسار /Applications/ServBay/www
لسهولة إدارة المواقع المحلية.
تثبيت Composer
يأتي ServBay مع Composer مدمج مسبقًا، لذلك غالبًا لا تحتاج لتثبيته يدويًا. يمكنك استخدام أمر
composer
مباشرة من الطرفية.الانتقال إلى مجلد مواقع الويب
افتح الطرفية وانتقل إلى مجلد المواقع الأساسي الموصى به:
bashcd /Applications/ServBay/www
1إنشاء مشروع CodeIgniter
باستخدام Composer، أنشئ مشروع CodeIgniter 4 جديد. سنطلق على مجلد المشروع اسم
servbay-codeigniter-app
:bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1سيقوم Composer بتنزيل الهيكل الأساسي للتطبيق وجميع الاعتمادات اللازمة في مجلد
servbay-codeigniter-app
.الدخول إلى مجلد المشروع
انتقل إلى مجلد مشروع CodeIgniter الجديد:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1
الإعدادات الأولية
إعداد اتصال قاعدة البيانات
توجد إعدادات قاعدة البيانات في ملف app/Config/Database.php
. قبل استخدام قاعدة البيانات، يجب ضبط بيانات الاتصال فيه.
أولاً، إذا كنت تنوي استخدام قاعدة بيانات، تأكد من إنشاء قاعدة بيانات باسم servbay_codeigniter_app
باستخدام أداة إدارة قواعد البيانات في ServBay (مثل Adminer أو phpMyAdmin من واجهة التطبيق).
بعدها، عدّل ملف 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', // اختر 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'
والمنفذ عادةً يكون 5432
، وقد تحتاج لضبط خيارات الترميز أيضًا.
إعداد اتصال التخزين المؤقت (Memcached/Redis)
إذا كنت تخطط لاستخدام Memcached أو Redis، قم بضبط إعداداتها في ملف app/Config/Cache.php
.
عدل ملف app/Config/Cache.php
، وابحث عن الإعلان المناسب. منفذ Memcached الافتراضي في ServBay هو 11211
، ومنفذ Redis هو 6379
، وغالبًا بلا كلمة مرور.
مثال إعداد Memcached:
public $memcached = [
'host' => '127.0.0.1', // Memcached في ServBay عادة يستمع على 127.0.0.1
'port' => 11211, // المنفذ الافتراضي
'weight' => 1,
];
2
3
4
5
مثال إعداد Redis:
public string $handler = 'redis'; // تعيين redis كمحرك التخزين الافتراضي
public $default = [ // إعدادات Redis عادة داخل مصفوفة default
'host' => '127.0.0.1', // Redis في ServBay يستمع عادة على 127.0.0.1
'password' => null, // عادة بلا كلمة مرور
'port' => 6379, // المنفذ الافتراضي
'timeout' => 0,
'database' => 0,
];
2
3
4
5
6
7
8
9
تأكد من ضبط القسم المناسب حسب حزمة التخزين المؤقت المفعلة.
إعداد خادم الويب (إعداد موقع عبر ServBay)
استخدم ميزة المواقع ضمن ServBay لإعداد خادم الويب وتوجيهه إلى مشروعك.
- افتح واجهة برنامج ServBay.
- انتقل إلى علامة التبويب المواقع (Websites).
- اضغط على زر
+
في أسفل اليسار لإضافة موقع جديد. - أدخل بيانات الموقع:
- الاسم (Name): أدخل اسمًا مميزًا مثل
My First CodeIgniter Dev Site
. - النطاق (Domain): أدخل نطاقًا يمكنك زيارته من متصفحك مثل
servbay-codeigniter-test.local
(سيقوم ServBay تلقائيًا بربط نطاق.local
محليًا). - نوع الموقع (Site Type): اختر
PHP
. - إصدار PHP (PHP Version): اختر النسخة المرغوبة (مثلاً
8.3
). - دليل الجذر (Document Root): هذه خطوة مهمة؛ ملف الإدخال الرئيسي لـ CodeIgniter (
index.php
) داخل مجلدpublic
، لذلك يجب ضبط جذر الموقع كالتالي:/Applications/ServBay/www/servbay-codeigniter-app/public
.
- الاسم (Name): أدخل اسمًا مميزًا مثل
- اضغط إضافة (Add) للحفظ.
- قد يطلب منك ServBay تطبيق التغييرات؛ قم بالموافقة.
للحصول على خطوات تفصيلية، راجع إضافة أول موقع.
إضافة كود تجريبي
لاختبار تشغيل المشروع وكذلك اختبار اتصال قاعدة البيانات وذاكرة التخزين المؤقت، سنقوم بتعديل متحكِّم Home
الافتراضي في CodeIgniter لإضافة بعض الأمثلة.
افتح ملف 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();
// محاولة حفظ بيانات في Redis
$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.';
}
// قراءة البيانات من Redis
$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', // توليد بريد فريد
];
$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();
}
}
}
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)
لكي تتمكن من زيارة الدوال التجريبية الجديدة التي أضفناها في متحكِّم 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
احرص على إضافة هذه التوجيهات إلى القسم الحالي دون حذف أو استبدال التوجيهات الأصلية.
زيارة الموقع
الآن أصبح مشروع CodeIgniter مضبوطًا ويعمل ضمن ServBay. افتح متصفح الإنترنت وتوجه إلى النطاق الذي حددته أثناء الإعداد:
زيارة الصفحة الرئيسية:
https://servbay-codeigniter-test.local
يجب أن ترى صفحة تعرض عبارةHello ServBay and CodeIgniter!
، مما يدل على عمل المشروع بنجاح.زيارة مثال 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)
قبل تجربة دوال قاعدة البيانات، عليك تنفيذ عملية التهجير (Migration) لإنشاء جدول users
.
إنشاء هيكل قاعدة البيانات (تشغيل التهجير)
افتح الطرفية وادخل إلى مجلد مشروع CodeIgniter:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1إنشاء ملف تهجير: استخدم أداة CLI الخاصة بـ CodeIgniter لإنشاء ملف تهجير لجدول
users
:bashphp spark make:migration create_users_table
1سيتم إنشاء ملف PHP جديد في مجلد
app/Database/Migrations
.تعديل ملف التهجير: افتح الملف الجديد (اسمه سيكون على غرار
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
) وعدّل دالةup()
لتعريف بنية الجدول. لاحظ أن هنالك اختلافًا بسيطًا بين MySQL وPostgreSQL في جمل الوقت الافتراضي (CURRENT_TIMESTAMP
مقابلNOW()
)، ويمكن استخدامRawSql
من CodeIgniter لتجاوز ذلك. مثال: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() { // لحذف جدول 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عند النجاح تظهر رسالة تؤكد تنفيذ التهجير. يمكنك التأكد يدويًا من وجود الجدول عبر أداة إدارة قواعد البيانات مثل Adminer.
اختبار أمثلة قاعدة البيانات
تأكد من صحة إعداد اتصال قاعدة البيانات في app/Config/Database.php
وأنك أكملت عملية التهجير.
إضافة مستخدم لقاعدة البيانات: زر
https://servbay-codeigniter-test.local/add-user
عند كل زيارة للرابط سيتم إضافة مستخدم جديد إلى الجدول. تظهر رسالة تؤكد نجاح الإضافة مع البريد الإلكتروني.عرض جميع المستخدمين: زر
https://servbay-codeigniter-test.local/list-users
هذا العنوان يعرض كل المستخدمين بقاعدة البيانات بصيغة JSON.
الخلاصة
باتباع الخطوات أعلاه، أصبحت قادرًا على إنشاء، إعداد، وتشغيل مشروع CodeIgniter محليًا باستخدام ServBay على macOS. تعلّمت كيفية استخدام Composer لإنشاء المشروع، وضبط إعدادات الموقع عبر ServBay لتوجيهه بشكل صحيح، وتكوين اتصال CodeIgniter مع قواعد البيانات وخدمات التخزين المؤقت، بالإضافة إلى اختبار التكامل عن طريق أمثلة برمجية عملية. مع ServBay أصبح بناء وإدارة بيئة التطوير المحلية أكثر سهولة، لتتمكن من التركيز على تطوير تطبيقك بـ CodeIgniter بكفاءة واحترافية.