إنشاء وتشغيل مشروع Zend Framework
ما هو Zend Framework؟
Zend Framework هو إطار عمل PHP مفتوح المصدر يوفر مجموعة من المكتبات الكائنية التوجه لبناء تطبيقات وخدمات ويب حديثة. يشتهر بالتصميم المعياري والأداء العالي، وهو مناسب لبناء التطبيقات المؤسساتية من الصغيرة إلى الكبيرة.
الميزات والفوائد الرئيسية لـ Zend Framework
- التصميم المعياري: يتبنى Zend Framework تصميمًا معياريًا يسمح للمطورين باختيار واستخدام المكونات حسب الحاجة.
- الأداء العالي: من خلال البنية المحسّنة وآلية التخزين المؤقت، يقدم Zend Framework أداءً ممتازًا.
- المرونة: يمكن تكامله مع العديد من المكتبات والإضافات التابعة لجهات أخرى، مما يجعله مناسباً لمشاريع ذات نطاقات مختلفة.
- دعم المجتمع: لديه مجتمع مطورين كبير ونظام بيئي غني.
- توثيق جيد: يقدم وثائق ودروس شاملة لمساعدة المطورين على البدء السريع.
Zend Framework مناسب لبناء تطبيقات ويب وواجهات برمجة التطبيقات عالية الجودة، ويصلح للمشاريع الصغيرة حتى الأنظمة المؤسساتية الكبيرة.
استخدام ServBay لإنشاء وتشغيل مشروع Zend Framework
في هذه المقالة، سنستخدم بيئة PHP التي تقدمها ServBay لإنشاء وتشغيل مشروع Zend Framework. سنستخدم ميزة "المضيف" في ServBay لإعداد خادم ويب والوصول إلى المشروع من خلال إعداد بسيط.
ملاحظة: إذا كنت قد استخدمت NGINX أو Apache من قبل
يستخدم ServBay خادم Caddy افتراضياً. للمستخدمين الذين ينتقلون من NGINX وApache إلى ServBay، هناك بعض التغييرات الرئيسية التي يجب ملاحظتها:
تكوين Caddy
تم تضمين Caddy داخل ServBay بالفعل، وتم تحسين إعداداته وتدقيقها افتراضياً. يحتاج المطور فقط إلى استخدام ميزة "المضيف" في ServBay لإدارة المواقع دون الحاجة إلى تعديل ملف تكوين Caddy يدوياً.
قواعد Rewrite و.htaccess
في NGINX وApache، يحتاج المطورون عادة إلى كتابة قواعد Rewrite وملفات .htaccess بأنفسهم لمعالجة إعادة كتابة URL وتكوينات أخرى. ومع ذلك، يأتي ServBay مع إعدادات Caddy مهيأة مسبقاً، لذا لا يلزم كتابة هذه القواعد إلا إذا كانت هناك حاجة خاصة.
تعرف على المزيد
للمزيد من المعلومات، يرجى مراجعة Rewrite و htaccess، كيفية نقل موقع Apache إلى ServBay، كيفية نقل موقع NGINX إلى ServBay.
إنشاء مشروع Zend Framework
TIP
توصي ServBay بأن يقوم المطورون بوضع مواقعهم تحت دليل /Applications/ServBay/www
لأجل سهولة الإدارة.
تثبيت Composer
يأتي ServBay مثبتاً مع Composer تلقائياً، لذا لا حاجة لتثبيته منفصلاً.
إنشاء مشروع Zend Framework
استخدم Composer لإنشاء مشروع Zend Framework جديد:
bashcd /Applications/ServBay/www mkdir servbay-zend-app cd servbay-zend-app composer create-project zendframework/skeleton-application .
1
2
3
4الدخول إلى مجلد المشروع
ادخل إلى مجلد مشروع Zend Framework الجديد:
bashcd /Applications/ServBay/www/servbay-zend-app
1
تكوين التهيئة
تكوين متغيرات البيئة
قم بتكوين معلومات الاتصال بقاعدة البيانات والمتغيرات البيئية الأخرى في ملف
config/autoload/global.php
. تأكد من إعداد التهيئة التالية بشكل صحيح:phpreturn [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ], ];
1
2
3
4
5
6
7
8
9
تكوين خادم الويب
استخدم ميزة "المضيف" في ServBay للوصول إلى مشروع Zend Framework من خلال خادم الويب. في إعدادات "المضيف" في ServBay، أضف مضيفًا جديدًا:
- الاسم:
My First Zend Dev Site
- اسم النطاق:
servbay-zend-test.local
- نوع الموقع:
PHP
- إصدار PHP: اختر
8.3
- دليل الجذر للموقع:
/Applications/ServBay/www/servbay-zend-app/public
يرجى مراجعة إضافة أول موقع للخطوات التفصيلية.
إضافة كود مثالي
أضف الكود التالي في ملف module/Application/config/module.config.php
لعرض "Hello ServBay!":
return [
'router' => [
'routes' => [
'home' => [
'type' => 'Literal',
'options' => [
'route' => '/',
'defaults' => [
'controller' => 'Application\Controller\Index',
'action' => 'index',
],
],
],
],
],
'controllers' => [
'factories' => [
'Application\Controller\Index' => InvokableFactory::class,
],
],
'view_manager' => [
'template_path_stack' => [
__DIR__ . '/../view',
],
],
];
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
أضف الكود التالي في ملف module/Application/src/Controller/IndexController.php
:
namespace Application\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
return new ViewModel([
'message' => 'Hello ServBay!',
]);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
أضف الكود التالي في ملف module/Application/view/application/index/index.phtml
:
<?php echo $this->message; ?>
زيارة الموقع
افتح المتصفح وزيارة https://servbay-zend-test.local
، سترى الصفحة تعرض Hello ServBay!
.
أمثلة قواعد بيانات NoSQL
مثال Memcached
تثبيت امتداد Memcached
يحتوي ServBay على امتداد Memcached مثبت مسبقًا، لذا لا حاجة لتثبيته.
تكوين Memcached
أضف تبعية Memcached إلى ملف
composer.json
:json{ "require": { "laminas/laminas-cache-storage-adapter-memcached": "^2.0" } }
1
2
3
4
5ثم شغل
composer update
لتثبيت التبعيات.تكوين التوجيه
أضف الكود التالي في ملف
module/Application/config/module.config.php
لتكوين التوجيه:phpreturn [ 'router' => [ 'routes' => [ 'memcached' => [ 'type' => 'Literal', 'options' => [ 'route' => '/memcached', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'memcached', ], ], ], ], ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16استخدام Memcached
استخدم التخزين المؤقت في وحدة التحكم:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; class IndexController extends AbstractActionController { public function memcachedAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'memcached', 'options' => [ 'servers' => [ ['127.0.0.1', 11211], ], ], ], ]); $cacheKey = 'my_cache_key'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Memcached!'; $cache->setItem($cacheKey, $cachedData); } 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أضف الكود التالي في ملف
module/Application/view/application/index/memcached.phtml
:php<?php echo $this->message; ?>
1افتح المتصفح وزيارة
https://servbay-zend-test.local/memcached
مثال Redis
تثبيت امتداد Redis
يحتوي ServBay على امتداد Redis مثبت مسبقًا، لذا لا حاجة لتثبيته.
تكوين Redis
أضف تبعية Redis إلى ملف
composer.json
:json{ "require": { "laminas/laminas-cache-storage-adapter-redis": "^2.0" } }
1
2
3
4
5ثم شغل
composer update
لتثبيت التبعيات.تكوين التوجيه
أضف الكود التالي في ملف
module/Application/config/module.config.php
لتكوين التوجيه:phpreturn [ 'router' => [ 'routes' => [ 'redis' => [ 'type' => 'Literal', 'options' => [ 'route' => '/redis', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'redis', ], ], ], ], ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16استخدام Redis
استخدم التخزين المؤقت في وحدة التحكم:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; class IndexController extends AbstractActionController { public function redisAction() { $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'redis', 'options' => [ 'server' => [ 'host' => '127.0.0.1', 'port' => 6379, ], ], ], ]); $cacheKey = 'my_cache_key'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Redis!'; $cache->setItem($cacheKey, $cachedData); } 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أضف الكود التالي في ملف
module/Application/view/application/index/redis.phtml
:php<?php echo $this->message; ?>
1افتح المتصفح وزيارة
https://servbay-zend-test.local/redis
أمثلة قواعد البيانات العلائقية
إنشاء بنية قاعدة بيانات وملفات الترحيل
إنشاء ملف ترحيل
استخدم أداة الترحيل في Laminas لإنشاء ملف ترحيل:
bashcomposer require laminas/laminas-db
1تحرير ملف الترحيل
أنشئ ملف ترحيل جديد في دليل
data/migrations
وقم بتحريره لتعريف هيكل جداول قاعدة البيانات:phpuse Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; class CreateUsersTable { public function up(Adapter $adapter) { $sql = nouvo هيئة Sql; $create = $sql->createTable('users') ->addColumn('id', 'integer', ['auto_increment' => true]) ->addColumn('name', 'varchar', ['length' => 255]) ->addColumn('email', 'varchar', ['length' => 255, 'unique' => true]) ->addPrimaryKey('id'); $adapter->query( $sql->buildSqlString($create), Adapter::QUERY_MODE_EXECUTE ); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20تشغيل الترحيل
شغل الترحيل يدوياً لإنشاء جداول قاعدة البيانات:
php$adapter = new Adapter([ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ]); $migration = new CreateUsersTable(); $migration->up($adapter);
1
2
3
4
5
6
7
8
9
10
مثال MySQL
تكوين MySQL
قم بتكوين معلومات اتصال MySQL في ملف
config/autoload/global.php
:phpreturn [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ], ];
1
2
3
4
5
6
7
8
9تكوين التوجيه
أضف الكود التالي في ملف
module/Application/config/module.config.php
لتكوين التوجيه:phpreturn [ 'router' => [ 'routes' => [ 'mysql-add' => [ 'type' => 'Literal', 'options' => [ 'route' => '/mysql-add', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'mysqlAdd', ], ], ], 'mysql' => [ 'type' => 'Literal', 'options' => [ 'route' => '/mysql', 'defaults' => [ 'controller' => 'Application\Controller\Index', '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إضافة بيانات المستخدم
استخدم البيانات في وحدة التحكم:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { protected $adapter; public function __construct(Adapter $adapter) { $this->$adapter = $adapter; } public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay', 'email' => '[email protected]', ]); $this->adapter->query( $sql->buildSqlString($insert), Adapter::QUERY_MODE_EXECUTE ); return new ViewModel([ 'message' => 'User added', ]); } public function mysqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $result = $this->adapter->query( $sql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE ); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($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
52
53
54
55أضف الكود التالي في ملف
module/Application/view/application/index/mysql-add.phtml
:php<?php echo $this->message; ?>
1أضف الكود التالي في ملف
module/Application/view/application/index/mysql.phtml
:php<?php echo $this->users; ?>
1افتح المتصفح وزيارة
https://servbay-zend-test.local/mysql-add
وhttps://servbay-zend-test.local/mysql
مثال PostgreSQL
تكوين PostgreSQL
قم بتكوين معلومات اتصال PostgreSQL في ملف
config/autoload/global.php
:phpreturn [ 'db' => [ 'driver' => 'Pdo_Pgsql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', ], ];
1
2
3
4
5
6
7
8
9تكوين التوجيه
أضف الكود التالي في ملف
module/Application/config/module.config.php
لتكوين التوجيه:phpreturn [ 'router' => [ 'routes' => [ 'pgsql-add' => [ 'type' => 'Literal', 'options' => [ 'route' => '/pgsql-add', 'defaults' => [ 'controller' => 'Application\Controller\Index', 'action' => 'pgsqlAdd', ], ], ], 'pgsql' => [ 'type' => 'Literal', 'options' => [ 'route' => '/pgsql', 'defaults' => [ 'controller' => 'Application\Controller\Index', '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إضافة بيانات المستخدم
استخدم البيانات في وحدة التحكم:
phpnamespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { protected $adapter; public function __construct(Adapter $adapter) { $this->adapter = $adapter; } public function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay', 'email' => '[email protected]', ]); $this->adapter->query( $sql->buildSqlString($insert), Adapter::QUERY_MODE_EXECUTE ); return new ViewModel([ 'message' => 'User added', ]); } public function pgsqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $result = $this->adapter->query( $sql->buildSqlString($select), Adapter::QUERY_MODE_EXECUTE ); $users = []; foreach ($result
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
as $row) { $users[] =