إنشاء وتشغيل مشروع Zend Framework (Laminas) في ServBay
لمحة عامة
يُعد Zend Framework (الذي أصبح جزءًا من Laminas Project) إطار عمل PHP مفتوح المصدر قوي، يتميز بمجموعة من المكونات عالية الجودة المعتمدة على البرمجة الكائنية، والمصممة لبناء تطبيقات وخدمات ويب حديثة. تشتهر هذه المنصة بمرونتها وتصميمها المعماري المعياري وأدائها العالي، مما يجعلها خيارًا مثاليًا لبناء مواقع بسيطة وحتى تطبيقات مؤسسية معقدة.
ServBay هو بيئة تطوير ويب محلية مخصصة لنظام macOS، وتضم باقة متكاملة من خوادم الويب (مثل Caddy وNginx)، وإصدارات PHP متعددة، وقواعد بيانات (مثل MySQL، PostgreSQL، MongoDB)، وخدمات التخزين المؤقت (مثل Redis وMemcached) وغيرها من الأدوات البرمجية. يوفر ServBay طريقة سهلة ومباشرة لإعداد وإدارة هذه الحزم، مما يجعل عملية إطلاق أي مشروع PHP محليًا أكثر سهولة ومرونة.
يوجهك هذا الدليل لإنشاء وتشغيل مشروع Zend Framework (Laminas) ضمن بيئة ServBay، بالإضافة إلى خطوات التكامل مع قواعد البيانات وخدمات التخزين المؤقت المتوفرة من خلال ServBay.
المتطلبات المسبقة
قبل البدء، تأكد من أنك قمت بما يلي:
- تثبيت ServBay: يجب أن يكون ServBay مثبتًا ويعمل على جهازك بنظام macOS. إذا لم تقم بتثبيته بعد، يُرجى زيارة الموقع الرسمي لـ ServBay للحصول على دليل التنصيب.
- حزم ServBay: تأكد من تثبيت وتشغيل الحزم المطلوبة ضمن ServBay، والتي تشمل:
- إصدار PHP واحد على الأقل (يفضل PHP 8.x أو أحدث لأن الإصدارات الحديثة من Zend Framework/Laminas تتطلب نسخة PHP عالية).
- خادم ويب (Caddy أو Nginx).
- Composer (يأتي مع ServBay افتراضيًا).
- خدمات قواعد البيانات (مثلاً MySQL أو PostgreSQL) وخدمات التخزين المؤقت (مثل Memcached وRedis) التي تنوي استخدامها. يمكنك تشغيلها من لوحة تحكم ServBay بسهولة.
إنشاء مشروع Zend Framework
يوصى بحفظ جميع مشاريع مواقعك داخل المجلد /Applications/ServBay/www
ليسهّل على ServBay عمليات الإدارة والإعداد التلقائية.
الانتقال إلى مجلد المواقع
افتح تطبيق الطرفية (Terminal) وانتقل إلى مجلد المواقع المقترح:
bashcd /Applications/ServBay/www
1إنشاء المشروع باستخدام Composer
يأتي Composer مثبتًا مع ServBay بشكل افتراضي. استخدم أمر
create-project
لإنشاء مشروع جديد من هيكلية 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
إعداد خادم الويب
لتتمكن من الوصول إلى مشروعك عبر المتصفح، عليك إعداد موقع جديد في ServBay.
- افتح لوحة تحكم ServBay: شغّل تطبيق ServBay.
- ادخل إلى إعدادات المواقع: من لوحة التحكم، انتقل إلى تبويب المواقع (Websites).
- أضف موقعًا جديدًا: انقر على زر
+
في أسفل الزاوية اليسرى لإضافة إعداد لموقع جديد. - املأ بيانات الموقع:
- الاسم (Name): اختر اسمًا يسهل تمييزه، مثل
My Zend Dev Site
. - النطاق (Domain): أدخل اسم النطاق الذي تريد استخدامه (مثلاً:
servbay-zend-test.local
). يُفضل استخدام لاحقة.local
أو.test
لتجنب التضارب مع النطاقات الحقيقية. سيقوم ServBay بإعداد DNS محلي تلقائيًا. - نوع الموقع (Website Type): اختر
PHP
. - إصدار PHP (PHP Version): عين إصدار PHP المرغوب لهذا الموقع (مثلاً
8.3
) وتأكد أنه مثبت ومشغّل في ServBay. - الجذر (Document Root): اشر إلى مجلد
public
داخل مشروعك كمجلد الجذر (حيث يوجد ملفindex.php
):/Applications/ServBay/www/servbay-zend-app/public
.
- الاسم (Name): اختر اسمًا يسهل تمييزه، مثل
- احفظ وأعد التشغيل: انقر على زر حفظ (Save). بعد التأكيد، سيقوم ServBay بإعادة تحميل إعدادات الخادم لتنشيط الموقع الجديد.
للمزيد من التفاصيل، راجع قسم إضافة أول موقع في وثائق 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ملاحظة: هذا مثال جزئي من
module.config.php
، يجب دمجه مع باقي الإعدادات وضمان وجود توجيه'home'
وتسجيل الـ Controller المناسب.إنشاء أو تعديل المتحكم (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يستخدم هذا الكود مساعد العرض المدمج في Laminas للوصول إلى بيانات المتحكم.
زيارة الموقع
افتح المتصفح وانتقل إلى النطاق الذي عينته (مثلاً: https://servbay-zend-test.local
).
إذا كان كل شيء مضبوطًا، سترى صفحة تعرض الرسالة Hello ServBay!
، أي أن مشروعك يعمل بنجاح على ServBay.
أمثلة تكامل قواعد البيانات والتخزين المؤقت
ServBay يوفر لك عدة قواعد بيانات وخدمات تخزين مؤقت. سنستعرض الآن أمثلة عملية للتعامل مع Memcached, Redis, MySQL وPostgreSQL من داخل مشروع Zend Framework.
ملحوظة هامة: الأمثلة منفصلة للشرح، ولكن في بيئة حقيقية ستستخدم نوع بيانات وتخزين مؤقت حسب حاجة المشروع وتدير الاتصالات باستخدام ممارسات مثل حقن الاعتمادية. تأكد دومًا من تشغيل الحزمة المطلوبة من لوحة تحكم ServBay (MySQL — PostgreSQL — Memcached — Redis).
مثال تفاعل مع قاعدة بيانات - إنشاء جدول
سنبدأ بمثال لإنشاء جدول باستخدام مكون Laminas DB، مع تنفيذ كود يدوي بدلًا من أداة Migrations الكاملة.
تثبيت مكون Laminas DB
من جذر المشروع، ثبت Laminas DB:
bashcomposer require laminas/laminas-db
1إنشاء قاعدة بيانات يدويًا
قـم بإنشاء قاعدة بيانات باسم
servbay_zend_app
من أدوات إدارة قواعد البيانات داخل ServBay (مثل phpMyAdmin أو pgAdmin). اسم المستخدم الافتراضي MySQL/MariaDB هوroot
وكلمة السرpassword
. كذلك في PostgreSQL.كتابة وتنفيذ كود لإنشاء الجدول (مثال)
أنشئ ملف 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); // تعريف كود SQL لإنشاء الجدول $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 { // تنفيذ الكود $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ملاحظة: هذا مجرد مثال يدوي، في المشاريع الحقيقية استخدم أدوات migrations لإدارة المخطط الهيكلي (schema) لقاعدة البيانات.
للتنفيذ عبر واجهة الطرفية:
bashphp create_users_table.php
1
مثال تكامل 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)
لحقن محول قاعدة البيانات في المتحكم، غيّر إعدادات المصنع ضمن
controllers
في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) { // الحصول على المحول من Service Manager $adapter = $container->get(AdapterInterface::class); // إعادة المتحكم مع المحول return new Controller\IndexController($adapter); }, // مصانع متحكمين إضافيين إذا لزم ], ], 'service_manager' => [ 'aliases' => [ // تعيين alias لـ AdapterInterface AdapterInterface::class => 'Laminas\Db\Adapter\Adapter', ], 'factories' => [ // مصنع الـ Adapter '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
28
29
30
31
32ملاحظة: عليك دمج الكود بما يتناسب مع إعدادات مشروعك الخاصة.
تهيئة توجيه جديد (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
34
35إضافة دوال المتحكم (IndexController.php)
أضف الخاصية والمنشئ ودالتي mysqlAddAction وmysqlAction:
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; } /** * Default action to display the welcome page. */ public function indexAction() { return new ViewModel([ 'message' => 'Hello ServBay!', ]); } /** * Action to add a user to 'users' table using MySQL. */ public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', ]); $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 'users' table using 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
68
69
70
71
72
73
74
75إنشاء ملفات العرض
module/Application/view/application/index/mysql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1module/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
لعرض المستخدمين في الجدول.
مثال تكامل PostgreSQL
شرح مماثل للـ MySQL لكن باستخدام 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إعداد المصنع والتوجيه
تأكد من أن
module.config.php
فيه إعدادات المصنع والتوجيهات المناسبة كما في مثال MySQL، وأضف توجيهات PostgreSQL:php<?php // module/Application/config/module.config.php 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إضافة دوال المتحكم (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; } // ... الدوال السابقة /** * إضافة مستخدم لـ PostgreSQL. */ public function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', ]); $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, ]); } /** * جلب جميع مستخدمي 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
63
64
65إنشاء ملفات العرض
module/Application/view/application/index/pgsql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1module/Application/view/application/index/pgsql.phtml
:php<h1>PostgreSQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2تجربة PostgreSQL
شغّل خدمة PostgreSQL. قم بزيارة
https://servbay-zend-test.local/pgsql-add
ثمhttps://servbay-zend-test.local/pgsql
.
مثال تكامل Memcached
شرح كيفية الاستفادة من Memcached كمخزن مؤقت.
تثبيت محول Memcached
أضف لـ composer.json التالي:
json// composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-memcached": "^2.0" } }
1
2
3
4
5
6
7نفذ التثبيت:
bashcomposer update
1مرفق مع ServBay دعم لمكتبة memcached تلقائيًا.
إضافة توجيه جديد (module.config.php)
أضف توجيه:
php<?php 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إضافة دالة المتحكم (IndexController.php)
أضف التالي:
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 { // ... باقي الكود /** * توضيح استخدام Memcached. */ public function memcachedAction() { // إعداد اتصال Memcached (افتراضيًا 11211 على 127.0.0.1) $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
50
51
52
53إنشاء ملف العرض
module/Application/view/application/index/memcached.phtml
:php<h1>Memcached Example</h1> <p><?php echo $this->message; ?></p>
1
2زيارة مثال Memcached
شغّل الخدمة واختبر عبر
https://servbay-zend-test.local/memcached
.
مثال تكامل Redis
شرح مكافئ للـ Memcached مع Redis.
تثبيت محول Redis
حدث composer.json:
json// composer.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
8وثبت المكتبات:
bashcomposer update
1ServBay يدعم redis افتراضيًا.
إضافة توجيه جديد (module.config.php)
أضف التوجيه:
php<?php 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إضافة دالة المتحكم (IndexController.php)
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 { // ... دوال أخرى /** * استخدام Redis كمخزن مؤقت. */ 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
51
52
53إنشاء ملف العرض
module/Application/view/application/index/redis.phtml
:php<h1>Redis Example</h1> <p><?php echo $this->message; ?></p>
1
2زيارة مثال Redis
شغّل خدمة Redis واختبر عبر الرابط
https://servbay-zend-test.local/redis
.
الخلاصة
باتباعك الخطوات السابقة، أصبحت الآن قادراً على إنشاء، إعداد وتشغيل مشروع Zend Framework (Laminas) محليًا ضمن ServBay على macOS، بالإضافة لتكامل MySQL، PostgreSQL، Memcached وRedis بسهولة. تعلّمت إعداد خادم الويب وربط قواعد البيانات وخدمات التخزين المؤقت ضمن بيئة محلية تحاكي بيئة الإنتاج، مما يعزز إنتاجيتك ويركز جهدك على تطوير الكود بدلاً من إدارة الإعدادات المعقدة.
استفد من قوة ServBay كبيئة تطوير متكاملة لتجربة فعّالة في تطوير تطبيقات الويب باستخدام PHP وLaminas.