إنشاء وتشغيل مشروع Zend Framework (Laminas) عبر ServBay
نظرة عامة
يعد Zend Framework (الذي أصبح الآن جزءًا من مشروع Laminas) إطار عمل مفتوح المصدر قوي للغة PHP، يوفر مجموعة من المكونات الحديثة عالية الجودة والمبنية بأسلوب البرمجة الكائنية لإنشاء تطبيقات وخدمات ويب متطورة. يتميز بالإمكانيات الفائقة والتصميم المعياري والأداء العالي، وهو خيار مثالي لتطوير مواقع بسيطة وحتى تطبيقات المؤسسات الكبيرة.
يعتبر ServBay بيئة تطوير ويب محلية مصممة خصيصًا لنظامي macOS وWindows، حيث تدمج PHP مع عدة خوادم ويب (مثل Caddy وNginx)، وخدمات قواعد البيانات (مثل MySQL وPostgreSQL وMongoDB) وخدمات التخزين المؤقت (مثل Redis وMemcached) إلى جانب أدوات تطوير أخرى. تتيح ServBay سهولة الإعداد والإدارة لهذه الحزم، ما يجعل تشغيل مشاريع PHP بكافة أطرها أمرًا بسيطًا محليًا.
سيرشدك هذا الدليل خطوة بخطوة لإنشاء مشروع Zend Framework (Laminas) وتشغيله داخل ServBay، مع عرض لأفضل طرق الربط مع قواعد البيانات وخدمات التخزين المؤقت التي توفرها ServBay.
المتطلبات الأساسية
قبل البدء، تأكد من استيفاء النقاط التالية:
- تثبيت ServBay: يجب تثبيت وتشغيل ServBay على حاسوبك (macOS أو Windows). إذا لم تقم بذلك بعد، توجه إلى الموقع الرسمي لـ ServBay للحصول على تعليمات التنزيل.
- مكونات ServBay: تأكد من توفر الحزم المطلوبة في ServBay وتشغيلها، والتي تشمل:
- إصدار PHP واحد على الأقل (ينصح PHP 8.x أو أعلى، حيث تتطلب الإصدارات الحديثة من Zend Framework/Laminas ذلك).
- خادم ويب مثل Caddy أو Nginx.
- Composer (غالبًا يأتي مع ServBay بشكل افتراضي).
- قواعد البيانات التي تنوي استخدامها (مثل MySQL أو PostgreSQL) وخدمات التخزين المؤقت (مثل Memcached أو Redis)، يمكنك تشغيلها بسهولة عبر لوحة تحكم ServBay.
إنشاء مشروع Zend Framework
ينصح ServBay بحفظ جميع مشاريع المواقع في المجلدات التالية لسهولة الإدارة التلقائية:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
الدخول إلى مجلد الجذر الخاص بالموقع
افتح تطبيق الطرفية (Terminal) وانتقل إلى مجلد الجذر المقترح:
macOS:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1إنشاء المشروع باستخدام Composer
يأتي ServBay مزودًا بـ Composer جاهز للعمل. استخدم الأمر التالي لإنشاء مشروع جديد من الهيكل العظمي لـ Zend Framework (تطبيق Laminas Skeleton). سيتم وضع المشروع في مجلد فرعي اسمه
servbay-zend-app
:bashcomposer create-project laminas/laminas-skeleton-application servbay-zend-app
1سيقوم هذا الأمر بتنزيل ملف تطبيق Zend Framework (Laminas) العظمي وتثبيت كافة الاعتمادات المطلوبة داخل مجلد المشروع الجديد.
الدخول إلى مجلد المشروع
انتقل للمجلد الذي أنشئته مؤخرًا:
bashcd servbay-zend-app
1
تكوين خادم الويب
لتمكين تصفح مشروع Zend Framework عبر المتصفح، تحتاج إلى إعداد موقع جديد داخل ServBay.
- فتح لوحة تحكم ServBay: شغّل التطبيق.
- الانتقال لإعدادات المواقع: افتح تبويب المواقع (Websites) داخل لوحة التحكم.
- إضافة موقع جديد: اضغط على زر
+
في الزاوية السفلى اليسرى لإضافة إعداد جديد. - تعبئة بيانات الموقع:
- الاسم (Name): سجل اسمًا يميز الموقع مثل
My Zend Dev Site
. - النطاق (Domain): أدخل المجال الذي ترغب بفتح الموقع عليه في المتصفح. يفضل استخدام مجال ينتهي بـ
.local
أو.test
لتجنب التعارض مع المجالات الحقيقية، مثلservbay-zend-test.local
. سيتم ضبط الـ DNS المحلي تلقائيًا بواسطة ServBay. - نوع الموقع (Website Type): اختر
PHP
. - إصدار PHP (PHP Version): حدد الإصدار الذي تريده (مثلاً
8.3
) واجعله مثبتًا ويعمل في ServBay. - جذر الموقع (Document Root): هذا هو المجلد الذي يقدمه خادم الويب للعامة، وملف الدخول الرئيسي الخاص بـ Zend Framework هو
index.php
داخل مجلدpublic
ضمن المشروع، إذاً الجذر سيكون:/Applications/ServBay/www/servbay-zend-app/public
.
- الاسم (Name): سجل اسمًا يميز الموقع مثل
- احفظ وأعد التشغيل: اضغط زر حفظ (Save)، وافق على إعادة تحميل الإعدادات ليتم تفعيل الموقع الجديد.
للمزيد حول خطوات الإعداد، راجع قسم إضافة أول موقع في وثائق ServBay.
مثال أساسي "Hello ServBay!"
هنا سنقوم بتعديل الشيفرة البرمجية للمشروع ليعرض رسالة "Hello ServBay!" عند زيارة الصفحة الرئيسية (/
).
تكوين المسارات والمتحكم الرئيسي (module.config.php)
قم بتحرير ملف
module/Application/config/module.config.php
والتأكد من وجود إعدادات المسارات والمتحكم كما يلي:php<?php declare(strict_types=1); namespace Application; use Laminas\Router\Http\Literal; use Laminas\Router\Http\Segment; use Laminas\ServiceManager\Factory\InvokableFactory; return [ 'router' => [ 'routes' => [ 'home' => [ 'type' => Literal::class, 'options' => [ 'route' => '/', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'index', ], ], ], // ... إعدادات مسارات أخرى ], ], 'controllers' => [ 'factories' => [ Controller\IndexController::class => InvokableFactory::class, ], ], 'view_manager' => [ 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => [ 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ], 'template_path_stack' => [ __DIR__ . '/../view', ], ], // ... إعدادات أخرى ];
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ملاحظة: الكود أعلاه هو جزء من الملف؛ يجب دمجه مع الكود الموجود بحيث تستوفي متطلبات المسار
'home'
وتعريف المصنع الخاص بـController\IndexController::class
.إنشاء أو تعديل المتحكم (IndexController.php)
قم بتحرير أو إنشاء الملف
module/Application/src/Controller/IndexController.php
. تأكد من أن دالةindexAction
تعيد ViewModel يحتوي رسالة:php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; class IndexController extends AbstractActionController { /** * Default action to display the welcome page. */ public function indexAction() { // إعادة ViewModel وإرسال متغير 'message' إلى العرض return new ViewModel([ 'message' => 'Hello ServBay!', ]); } // ... طرق أخرى }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24إنشاء أو تعديل ملف العرض (index.phtml)
أضف أو حرر الملف
module/Application/view/application/index/index.phtml
ليعرض الرسالة المقدمة من المتحكم:php<h1><?php echo $this->message; ?></h1>
1يستخدم هذا المساعد
$this->message
من Zend Framework (Laminas) لاستقبال الرسالة.
الوصول إلى الموقع
افتح متصفح الإنترنت وانتقل إلى المجال الذي قمت بتكوينه مثل https://servbay-zend-test.local
.
إذا سارت الأمور كما يجب، ستشاهد صفحة تعرض عبارة Hello ServBay!
مما يدل على نجاح تشغيل المشروع عبر ServBay.
مثال على تكامل قواعد البيانات وخدمات التخزين المؤقت
يوفر ServBay عدة خدمات لقواعد البيانات والتخزين المؤقت. في الأمثلة التالية سنشرح كيفية ربط تطبيق Zend Framework مع كل من Memcached وRedis وMySQL وPostgreSQL.
ملاحظة هامة: جميع الأمثلة التالية مستقلة، وعادة في المشاريع الفعلية تختار قاعدة بيانات واحدة وخدمة أو أكثر من التخزين المؤقت وتدير الاتصال من خلال طرق الحقن والاعتماديات. يرجى تشغيل الخدمة المطلوبة في ServBay قبل استخدام الكود (مثل MySQL أو Memcached أو Redis).
مثال التفاعل مع قاعدة البيانات - إنشاء جدول
بداية سنستخدم مكون Laminas DB للربط مع قاعدة بيانات وخلق جدول بسيط يدويًا (بدون أداة الترحيل).
تثبيت مكون Laminas DB
من مجلد المشروع، نفذ أمر التثبيت عبر Composer:
bashcomposer require laminas/laminas-db
1إنشاء قاعدة البيانات يدويًا
قبل تنفيذ الكود، قم بإنشاء قاعدة بيانات باسم
servbay_zend_app
عبر لوحة التحكم في ServBay باستخدام phpMyAdmin أو pgAdmin أو غيرها. اسم المستخدم الافتراضي لـ MySQL/MariaDB هوroot
وكلمة المرورpassword
. لـ PostgreSQL أيضًاroot
وكلمة المرورpassword
.كتابة وتنفيذ سكريبت إنشاء الجدول (مثال)
أنشئ ملف PHP منفصل (مثلاً
create_users_table.php
في جذر المشروع) يتضمن الكود التالي لإنشاء جدولusers
:php<?php // create_users_table.php use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; // نفترض استخدام MySQL أو MariaDB $adapter = new Adapter([ 'driver' => 'Pdo_Mysql', // أو 'Pdo_Pgsql' 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', // كلمة مرور ServBay الافتراضية 'hostname' => '127.0.0.1', // 'port' => 3306, // منفذ MySQL الافتراضي // 'port' => 5432, // منفذ PostgreSQL الافتراضي ]); $sql = new Sql($adapter); // تعريف جملة إنشاء الجدول $create = $sql->createTable('users') ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Integer('id', false, null, ['AUTO_INCREMENT' => true])) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('name', 255)) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('email', 255, ['UNIQUE' => true])) ->addConstraint(new \Laminas\Db\Sql\Ddl\Constraint\PrimaryKey('id')); echo "Executing SQL:\n"; echo $sql->buildSqlString($create, $adapter->getPlatform()) . "\n"; try { // تنفيذ SQL $adapter->query( $sql->buildSqlString($create, $adapter->getPlatform()), Adapter::QUERY_MODE_EXECUTE ); echo "Table 'users' created successfully.\n"; } catch (\Exception $e) { echo "Error creating table: " . $e->getMessage() . "\n"; }
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ملاحظة: هذا مثال يدوي. في المشاريع الحقيقة ينصح باستخدام أدوات ترحيل قواعد البيانات.
لتنفيذ السكريبت عبر واجهة الأوامر الطرفية:
bashphp create_users_table.php
1
مثال تكامل MySQL
توضيح كيفية الربط مع MySQL وتنفيذ استعلامات منها في المتحكم.
إعداد الربط مع MySQL
قم بتعديل/إضافة إعدادات الاتصال في الملف
config/autoload/global.php
:php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', 'port' => 3306, 'charset' => 'utf8mb4', ], // ... إعدادات عالمية أخرى ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14إعداد المصنع الخاص بالمتحكم (module.config.php)
لتمرير Adapter إلى المتحكم، عدل إعدادات
controllers
فيmodule/Application/config/module.config.php
واستبدل المصنع الافتراضي بمصنع وظيفي:php<?php // module/Application/config/module.config.php namespace Application; use Laminas\ServiceManager\Factory\InvokableFactory; use Laminas\Db\Adapter\AdapterInterface; return [ // ... إعدادات أخرى 'controllers' => [ 'factories' => [ Controller\IndexController::class => function($container) { $adapter = $container->get(AdapterInterface::class); return new Controller\IndexController($adapter); }, ], ], 'service_manager' => [ 'aliases' => [ AdapterInterface::class => 'Laminas\Db\Adapter\Adapter', ], 'factories' => [ 'Laminas\Db\Adapter\Adapter' => \Laminas\Db\Adapter\AdapterServiceFactory::class, ], ], // ... إعدادات أخرى ];
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ملاحظة: تأكد من وجود الإعدادات كاملة ضمن المصفوفة الخاصة بالملف.
إعداد المسارات (module.config.php)
أضف مسارات جديدة لـ MySQL:
php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ 'mysql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysqlAdd', ], ], ], 'mysql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysql', ], ], ], ], ], // ... إعدادات أخرى ];
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إضافة دوال المتحكم (IndexController.php)
أضف دوال الربط مع MySQL في ملف
module/Application/src/Controller/IndexController.php
:php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { private $adapter; public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } public function indexAction() { return new ViewModel([ 'message' => 'Hello ServBay!', ]); } /** * Action to add a user to the 'users' table via MySQL. */ public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => 'demo-mysql@servbay.test', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'MySQL User added successfully.' : 'Failed to add MySQL user.'; return new ViewModel([ 'message' => $message, ]); } /** * Action to fetch all users from the 'users' table via MySQL. */ public function mysqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); } }
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إنشاء ملفات العرض
ملف
module/Application/view/application/index/mysql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1ملف
module/Application/view/application/index/mysql.phtml
:php<h1>MySQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2تجربة MySQL
تأكد من تشغيل خدمة MySQL في ServBay. انتقل إلى
https://servbay-zend-test.local/mysql-add
لإضافة مستخدم، ثم إلىhttps://servbay-zend-test.local/mysql
لاستعراض المستخدمين (سيتم عرض النتائج بصيغة JSON).
مثال تكامل PostgreSQL
يوضح كيفية الربط مع PostgreSQL وتنفيذ استعلاماته من المتحكم.
إعداد الربط مع PostgreSQL
عدل الإعدادات في
config/autoload/global.php
:php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Pgsql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', 'port' => 5432, ], // ... إعدادات أخرى ];
1
2
3
4
5
6
7
8
9
10
11
12
13إعداد المصنع الخاص بالمتحكم
إذا قمت بإعداده أثناء مثال MySQL، فلا حاجة لإعادة التعديل هنا.
إعداد المسارات (module.config.php)
أضف:
php<?php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ 'pgsql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsqlAdd', ], ], ], 'pgsql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsql', ], ], ], ], ], // ... إعدادات أخرى ];
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إضافة دوال المتحكم (IndexController.php)
أضف هاتين الدالتين:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { private $adapter; public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } // ... الدوال السابقة /** * Action to add a user to the 'users' table via PostgreSQL. */ public function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => 'demo-pgsql@servbay.test', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'PostgreSQL User added successfully.' : 'Failed to add PostgreSQL user.'; return new ViewModel([ 'message' => $message, ]); } /** * Action to fetch all users from the 'users' table via PostgreSQL. */ public function pgsqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); } }
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إنشاء ملفات العرض
ملف
module/Application/view/application/index/pgsql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1ملف
module/Application/view/application/index/pgsql.phtml
:php<h1>PostgreSQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2تجربة PostgreSQL
شغّل خدمة PostgreSQL في ServBay. انتقل إلى
https://servbay-zend-test.local/pgsql-add
لإضافة مستخدم، ثم إلىhttps://servbay-zend-test.local/pgsql
لاستعراض المستخدمين.
مثال تكامل Memcached
شرح استخدام Memcached لتخزين البيانات مؤقتًا عبر المتحكم.
تثبيت محول Memcached
في ملف
composer.json
الخاص بالمشروع، أضف:json{ "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-memcached": "^2.0" } }
1
2
3
4
5
6ثم نفذ:
bashcomposer update
1الـ extension الخاص بـ PHP عادةً يكون مثبتاً مسبقًا ضمن ServBay.
إضافة مسار Memcached (module.config.php)
أضف:
php<?php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ 'memcached' => [ 'type' => Literal::class, 'options' => [ 'route' => '/memcached', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'memcached', ], ], ], ], ], // ... إعدادات أخرى ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22إضافة دالة المتحكم (IndexController.php)
أضف دالة memcached:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; use Laminas\Cache\Storage\StorageInterface; class IndexController extends AbstractActionController { // ... دوال سابقة public function memcachedAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'memcached', 'options' => [ 'servers' => [ ['127.0.0.1', 11211], ], 'ttl' => 300, ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_memcached_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Memcached! (Data from source, cached at ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); } }
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ملف العرض
module/Application/view/application/index/memcached.phtml
:php<h1>Memcached Example</h1> <p><?php echo $this->message; ?></p>
1
2تجربة Memcached
تأكد من تشغيل خدمة Memcached في ServBay. انتقل إلى
https://servbay-zend-test.local/memcached
وشاهد الرسالة في الصفحة (المرة الأولىCACHE MISS
، ثمCACHE HIT
عند التحديث ضمن فترة التخزين المؤقت).
مثال تكامل Redis
شرح استخدام Redis كخدمة تخزين مؤقت أو قاعدة بيانات مصغرة.
تثبيت محول Redis
أضف لمتطلبات المشروع في ملف
composer.json
:json{ "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-redis": "^2.0", "ext-redis": "*" } }
1
2
3
4
5
6
7ثم نفذ:
bashcomposer update
1عادة يدعم ServBay تثبيت امتداد redis مسبقًا.
إضافة مسار Redis (module.config.php)
أضف:
php<?php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ 'redis' => [ 'type' => Literal::class, 'options' => [ 'route' => '/redis', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'redis', ], ], ], ], ], // ... إعدادات أخرى ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22إضافة دالة المتحكم (IndexController.php)
أضف دالة redis:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; use Laminas\Cache\Storage\StorageInterface; class IndexController extends AbstractActionController { // ... دوال سابقة public function redisAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'redis', 'options' => [ 'server' => [ 'host' => '127.0.0.1', 'port' => 6379, ], 'ttl' => 300, ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_redis_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Redis! (Data from source, cached at ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); } }
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ملف العرض
module/Application/view/application/index/redis.phtml
:php<h1>Redis Example</h1> <p><?php echo $this->message; ?></p>
1
2تجربة Redis
تأكد من تشغيل خدمة Redis في ServBay. انتقل إلى
https://servbay-zend-test.local/redis
لمشاهدة الرسالة.
الملخص
باتباع الخطوات السابقة تكون قد نجحت في إنشاء وتكوين وتشغيل مشروع Zend Framework (Laminas) داخل بيئة ServBay المحلية. تعلمت كيفية إعداد خادم ويب محلي وربط المشروع بقواعد البيانات (MySQL وPostgreSQL) وخدمات التخزين المؤقت (Memcached وRedis).
يمنحك ServBay تجربة تطوير محلية سلسة وسريعة تقربك أكثر من بيئة الإنتاج، ما يعزز كفاءتك ويسهل التركيز على البرمجة وتطوير المشروع.