إنشاء وتشغيل مشروع Symfony
إن ServBay هو بيئة تطوير ويب محلية متكاملة مصممة خصيصًا لأنظمة macOS وWindows، وتحتوي على بيئات تشغيل متعددة مثل PHP وNode.js وPython وGo وJava، بالإضافة إلى قواعد بيانات مثل MySQL وPostgreSQL وMongoDB وRedis، وتدعم خوادم الويب Apache وCaddy. هذا الدليل يوضح كيفية إعداد وتشغيل مشروع Symfony على أجهزة macOS وWindows باستخدام ServBay بسهولة وسرعة.
ما هو Symfony؟
Symfony هو إطار عمل ويب مفتوح المصدر بلغة PHP أُنشئ بواسطة SensioLabs، ويهدف إلى تزويد المطورين بمجموعة أدوات قوية ومرنة وكفؤة لبناء تطبيقات ويب حديثة وواجهات برمجية (APIs). يتبع أفضل الممارسات القياسية في تطوير الويب، ويقدم العديد من المكونات الهامة مثل التوجيه (Routing)، وقالب العرض Twig، ومعالجة النماذج، والمصادقة، والحقن التبعي، وغيرها، مما يبسط العديد من مهام تطوير الويب الشائعة.
الميزات والفوائد الرئيسية لـ Symfony
- تصميم معياري: يعتمد Symfony على مكتبة مكونات قابلة لإعادة الاستخدام، حيث يمكن للمطورين اختيار واستخدام المكونات حسب الحاجة لبناء تطبيقات تتراوح بين بسيطة ومتقدمة.
- كفاءة عالية: بفضل هيكلية محسنة، وآليات فعّالة للتخزين المؤقت، ودعم لأحدث ميزات PHP، يوفر Symfony أداءً ممتازًا.
- دعم مجتمعي قوي: مجتمع كبير من المطورين ونظام واسع للإضافات (Bundles) و وثائق مفصلة تجعل العثور على حلول لأي مشكلة أمرًا سهلاً.
- مرونة: سهولة التكامل مع مكتبات وأدوات خارجية تناسب المشاريع بمختلف أحجامها وتعقيدها.
- استقرار وقابلية الصيانة: الالتزام بمعايير كتابة الكود ونماذج التصميم الجيدة يجعل التطبيقات سهلة الاختبار والصيانة والتوسعة.
يُناسب Symfony تطوير كافة أنواع تطبيقات الويب، من الواجهات البرمجية البسيطة حتى الأنظمة المؤسسية المعقدة.
إنشاء وتشغيل مشروع Symfony باستخدام ServBay
يوفر ServBay بيئة جاهزة وكاملة لتشغيل مشاريع Symfony، متضمنة الإصدار المناسب من PHP وComposer وخادم ويب وقواعد البيانات وخدمات التخزين المؤقت. ستتعلم في هذا القسم كيف تنشئ مشروعًا جديدًا وتضبطه باستخدام ServBay.
المتطلبات الأساسية
قبل البدء، تأكد من إتمام الخطوات التالية:
- تثبيت ServBay: يجب أن يكون ServBay مثبتًا ومشغلًا بنجاح على جهاز macOS لديك. إذا لم يكن مثبتًا، راجع دليل تثبيت ServBay.
- تشغيل خدمة ServBay: يجب أن تكون الخدمات الأساسية مثل Caddy أو Apache، وأي قاعدة بيانات تحتاجها، قيد التشغيل.
- المعرفة الأساسية: معرفة أولية بـ PHP وComposer وأساسيات Symfony.
إنشاء مشروع Symfony
ينصح ServBay بوضع جميع مشاريع المواقع في المسار /Applications/ServBay/www
لضمان سهولة الإدارة والتعرف عليها من قبل النظام.
تأكد من توفر Composer
ServBay يأتي مثبتًا بجميع المتطلبات، بما فيها Composer، ومضبوطًا على متغيرات البيئة اللازمة، فلا حاجة لتثبيته بشكل منفصل. يمكن التأكد من توفره بتنفيذ الأمر التالي في الطرفية:
composer --version
إنشاء مجلد المشروع
أنشئ مجلدًا جديدًا للمشروع داخل مجلد المواقع الموصى به:
bashcd /Applications/ServBay/www mkdir servbay-symfony-app
1
2إنشاء مشروع Symfony باستخدام Composer
انتقل إلى مجلد المشروع الجديد واستخدم Composer لإنشاء مشروع مبني على
website-skeleton
، وهو هيكل أساسي يحتوي على الاعتمادات الشائعة لتطبيقات الويب.bashcd /Applications/ServBay/www/servbay-symfony-app composer create-project symfony/website-skeleton .
1
2بعد تنفيذ هذا الأمر، سيقوم Composer بتحميل ملفات Symfony الأساسية وجميع التبعيات المطلوبة إلى المجلد الحالي.
تهيئة الإعدادات
تُدار إعدادات مشروع Symfony عادةً عبر متغيرات البيئة المخزنة في ملف .env
في جذر المشروع.
ضبط متغيرات البيئة (
.env
)افتح ملف
.env
في جذر المشروع، وهو يحتوي على إعدادات مثل معلومات الاتصال بقاعدة البيانات والمفتاح السري للتطبيق. عدل أو أضف القيم حسب حاجتك.تأكد أن الإعدادات التالية مضبوطة بشكل صحيح أو عدلها بحسب بيئة ServBay لديك:
dotenv# مثال على ملف .env APP_ENV=dev # بيئة التطوير APP_SECRET=your_secret_key # استبدله بسلسلة عشوائية فريدة لأغراض الأمان # معلومات اتصال قواعد البيانات (مثال: MySQL، ستوضح لاحقًا) # DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=8.0&charset=utf8mb4" # DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8" # DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
1
2
3
4
5
6
7
8استبدل
your_secret_key
بسلسلة عشوائية وآمنة. غالبًا ما تكون بيانات دخول قاعدة البيانات الافتراضية في ServBay هيroot
للمستخدم وpassword
لكلمة المرور—لكن تأكد من تغيير هذه القيم في البيئة الإنتاجية. سنستخدم اسم قاعدة البياناتservbay_symfony_app
كمثال.
إعداد خادم الويب (موقع ServBay)
لتتمكن من الوصول إلى مشروع Symfony عبر المتصفح، عليك ضبط موقع افتراضي محلي من خلال إدارة "المواقع" في ServBay. جذر تطبيق الويب في Symfony هو مجلد public/
ضمن المشروع.
افتح لوحة تحكم ServBay وانتقل إلى إعدادات "الموقع" (أو "المضيف" في الإصدارات القديمة)، وأضف موقعًا جديدًا بهذه القيم:
- الاسم: اختر اسمًا يسهل التعرف عليه، مثل
My Symfony Dev Site
. - اسم النطاق: عيّن اسم نطاق محلي مثل
servbay-symfony-test.local
، وسيقوم ServBay تلقائيًا بتوجيهه إلى جهازك. - نوع الموقع: اختر
PHP
. - إصدار PHP: حدد إصدارًا متوافقًا مع مشروع Symfony (ينصح بالإصدار الأحدث مثل
8.3
). - جذر الموقع: أهم نقطة، يجب تعيينه إلى
/Applications/ServBay/www/servbay-symfony-app/public
.
بعد الحفظ وتطبيق التغييرات، سيقوم ServBay بتحديث إعدادات خادم الويب. يستخدم ServBay عادةً Caddy أو Apache ويقوم تلقائيًا بإنشاء شهادة SSL موثوقة، ما يسمح بالوصول الآمن عبر HTTPS مباشرة.
للاطلاع على الخطوات التفصيلية راجع إضافة أول موقع في ServBay.
إضافة كود تجريبي أساسي
للتحقق من نجاح الإعداد، سنضيف توجيهًا (route) ومتحكمًا بسيطًا ليعرض نصًا عند زيارة الجذر.
ضبط التوجيه (
config/routes.yaml
)أضف في ملف
config/routes.yaml
توجيهًا للجذر/
يربطه بدالةindex
في المتحكم:yaml# config/routes.yaml index: path: / controller: App\Controller\DefaultController::index
1
2
3
4إنشاء المتحكم (
src/Controller/DefaultController.php
)أنشئ ملفًا جديدًا باسم
DefaultController.php
فيsrc/Controller/
وأضف الكود التالي:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class DefaultController { /** * @Route("/", name="index") */ public function index(): Response { // إرجاع استجابة HTTP بسيطة return new Response('Hello ServBay and Symfony!'); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18هذا الكود ينشئ متحكمًا باسم
DefaultController
ودالةindex
المرتبطة بتوجيه الجذر، وعند زيارة الصفحة الرئيسية سيتم عرض النص "Hello ServBay and Symfony!".
تصفح الموقع
الآن افتح متصفحك وادخل إلى اسم النطاق الذي ضبطته في ServBay مثل https://servbay-symfony-test.local
. إذا كان الإعداد صحيحًا ستشاهد على الصفحة:
Hello ServBay and Symfony!
1
هذا يؤكد نجاح تشغيل مشروع Symfony باستخدام خادم الويب الخاص بـ ServBay. لاحظ أن ServBay يقوم بتفعيل HTTPS تلقائيًا، لذا يُنصح باستخدام الرابط الآمن.
أمثلة على قواعد البيانات وذاكرة التخزين المؤقت
يستخدم Symfony عادة Doctrine ORM للتعامل مع قواعد البيانات العلائقية، وكذلك مكون Cache لإدارة التخزين المؤقت وقواعد بيانات NoSQL. ServBay يوفر خدمات قواعد البيانات والامتدادات المطلوبة لاستخدامها بسهولة.
مثال على قاعدة بيانات علائقية (Doctrine ORM)
يدعم ServBay قواعد بيانات MySQL وPostgreSQL. سنعرض طريقة إعداد واستخدام هاتين القاعدتين في Symfony.
ضبط اتصال قاعدة البيانات
في ملف
.env
في جذر المشروع، أزل التعليق وعدّل إعدادDATABASE_URL
حسب قاعدة البيانات التي تستخدمها.- MySQL: المستخدم الافتراضي هو
root
وكلمة المرورpassword
والمنفذ3306
:dotenv# .env DATABASE_URL="mysql://root:password@127.0.0.1:3306/servbay_symfony_app?serverVersion=8.0&charset=utf8mb4"
1
2 - PostgreSQL: مستخدم
root
وكلمة مرورpassword
والمنفذ5432
:dotenv# .env DATABASE_URL="postgresql://root:password@127.0.0.1:5432/servbay_symfony_app?serverVersion=13&charset=utf8"
1
2
تأكد من أنه تم تشغيل الخدمة المطلوبة في لوحة تحكم ServBay.
- MySQL: المستخدم الافتراضي هو
إنشاء قاعدة البيانات
إذا لم توجد قاعدة البيانات
servbay_symfony_app
يمكنك إنشاؤها يدويًا باستخدام phpMyAdmin أو pgAdmin (متوفر عبر لوحة ServBay)، أو بتنفيذ الأمر التالي:bashphp bin/console doctrine:database:create
1إنشاء كيان (Entity) وملف ترحيل
يمثل Doctrine الكيان (Entity) كجدول في قاعدة البيانات. استخدم Maker Bundle لتوليد الكيان وملف الترحيل.
- إنشاء كيان (مثال: User):bashأضف خصائص مثل
php bin/console make:entity User
1name
(string) وemail
(string مع شرط التفرّد). - إنشاء ملف ترحيل: أنشئ ملف الترحيل استنادًا إلى الكيان الجديد:bashسيُنشئ ملف ترحيل في مجلد
php bin/console make:migration
1src/Migrations
يتضمن تعليمات SQL لإنشاء جدولusers
.
- إنشاء كيان (مثال: User):
تنفيذ الترحيل
نفذ الأمر التالي لتطبيق التغييرات في قاعدة البيانات:
bashphp bin/console doctrine:migrations:migrate
1إضافة مثال على التعامل مع قاعدة البيانات
عدّل ملف
src/Controller/DefaultController.php
لإضافة توجيهات ودوال توضح كيفية تخزين واسترجاع البيانات باستخدام Doctrine عبر حقن واجهةEntityManagerInterface
.أضف أولًا حقن الـ EntityManagerInterface في الباني (constructor):
php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; // استيراد الواجهة use App\Entity\User; // استيراد الكيان User use Symfony\Component\HttpFoundation\JsonResponse; // للاستجابة بصيغة JSON class DefaultController { private $entityManager; // الحقن التبعي لواجهة إدارة الكيان public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } // ... دوال أخرى ... }
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بعدها أضف توجيهات جديدة في ملف
config/routes.yaml
:yaml# config/routes.yaml # ... توجيهات أخرى ... mysql_add_user: path: /mysql-add-user # اسم التوجيه حسب قاعدة البيانات المستخدمة controller: App\Controller\DefaultController::addUser mysql_get_users: path: /mysql-users # أو /pgsql-users controller: App\Controller\DefaultController::getUsers
1
2
3
4
5
6
7
8ثم أضف الدوال الخاصة بهذه التوجيهات في المتحكم:
php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; class DefaultController { private $entityManager; public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } /** * @Route("/add-user", name="app_add_user") */ public function addUser(): Response { $user = new User(); // بيانات تجريبية مرتبطة بعلامة ServBay $user->setName('ServBay Demo User'); $user->setEmail('demo-user@servbay.test'); // تهيئة الكائن للحفظ $this->entityManager->persist($user); // تنفيذ عملية الحفظ $this->entityManager->flush(); return new Response('تمت إضافة المستخدم بنجاح!'); } /** * @Route("/get-users", name="app_get_users") */ public function getUsers(): JsonResponse { // جلب جميع كيانات User من قاعدة البيانات $users = $this->entityManager->getRepository(User::class)->findAll(); // تحويل النتائج لمصفوفة لعرضها كـ JSON $usersArray = []; foreach ($users as $user) { $usersArray[] = [ 'id' => $user->getId(), 'name' => $user->getName(), 'email' => $user->getEmail(), ]; } // إرجاع الاستجابة بصيغة JSON return new JsonResponse($usersArray); } }
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زيارة الأمثلة
- زر
https://servbay-symfony-test.local/add-user
لإضافة مستخدم جديد. - زر
https://servbay-symfony-test.local/get-users
لعرض قائمة المستخدمين (بصيغة JSON).
- زر
أمثلة على التخزين المؤقت وقواعد بيانات NoSQL (Symfony Cache)
يوفر ServBay خدمات Redis وMemcached بالإضافة إلى تمديدات PHP، ويمكن استخدام مكون التخزين المؤقت في Symfony للاستفادة منها مباشرة.
ضبط اتصال التخزين المؤقت
عدّل ملف
.env
لتعيين روابط الاتصال بالخدمة المرغوبة.- Memcached: المنفذ الافتراضي هو
11211
:dotenvتأكد من تشغيل خدمة Memcached من لوحة ServBay.# .env # ... إعدادات أخرى ... CACHE_DSN=memcached://127.0.0.1:11211
1
2
3 - Redis: المنفذ الافتراضي هو
6379
:dotenvتأكد من تشغيل خدمة Redis من لوحة ServBay.# .env # ... إعدادات أخرى ... CACHE_DSN=redis://127.0.0.1:6379 # إذا كانت Redis محمية بكلمة مرور (بشكل افتراضي بدون كلمة مرور في ServBay): # CACHE_DSN=redis://:your_password@127.0.0.1:6379
1
2
3
4
5
- Memcached: المنفذ الافتراضي هو
إضافة مثال على استخدام التخزين المؤقت
عدّل ملف
src/Controller/DefaultController.php
لإضافة دوال توضح طريقة استخدام مكون التخزين المؤقت بالتكامل مع Memcached أو Redis عبر حقنCacheInterface
.في البداية أضف حقن CacheInterface في الباني:
php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Contracts\Cache\CacheInterface; // استيراد واجهة التخزين المؤقت class DefaultController { private $entityManager; private $cache; // خاصية للتخزين المؤقت // الحقن التبعي public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; } // ... دوال أخرى ... }
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أضف توجيهًا جديدًا في
config/routes.yaml
:yaml# config/routes.yaml # ... توجيهات أخرى ... cache_example: path: /cache-example controller: App\Controller\DefaultController::cacheExample
1
2
3
4
5ثم أضف الدالة الخاصة به:
php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Component\Cache\Item\ItemInterface; // استيراد الواجهة class DefaultController { private $entityManager; private $cache; public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; } // ... دوال أخرى ... /** * @Route("/cache-example", name="app_cache_example") */ public function cacheExample(): Response { // محاولة استرجاع البيانات من التخزين المؤقت $cacheItem = $this->cache->get('my_symfony_cache_key', function (ItemInterface $item) { // إذا لم توجد البيانات، ينفذ هذا الجزء $item->expiresAfter(3600); // صلاحية التخزين المؤقت ساعة واحدة // محاكاة إجراء يستغرق وقتًا، مثل استعلام قاعدة بيانات معقد $data = "Data generated at " . date('Y-m-d H:i:s'); // إرجاع البيانات للتخزين المؤقت return $data; }); // البيانات من التخزين المؤقت أو جديدة إذا لم تكن موجودة $output = "From Cache: " . $cacheItem; return new Response($output); } }
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زيارة المثال
- زر
https://servbay-symfony-test.local/cache-example
. في أول زيارة ستُولد البيانات وتخزن مؤقتًا، وفي الزيارات التالية تُقرأ مباشرة طالما لم تنتهِ مدة الصلاحية.
- زر
الأسئلة المتكررة (FAQ)
س: تظهر رسالة خطأ أو صفحة غير موجودة عند زيارة https://servbay-symfony-test.local
، ماذا أفعل؟
ج: تحقق مما يلي:
- تأكد من أن ServBay يعمل وأن خدمة الموقع (Caddy أو Apache) مفعلة.
- راجع إعدادات الموقع في ServBay وتحقق من صحة اسم النطاق (
servbay-symfony-test.local
) وجذر الموقع مضبوط إلى/Applications/ServBay/www/servbay-symfony-app/public
. - تحقق من سجل الأخطاء في Symfony (
var/log/dev.log
) لمعرفة السبب. - نفذ الأمر
composer install
في جذر المشروع لتثبيت جميع الحزم المطلوبة. - تأكد من أن إصدار PHP متوافق مع مشروع Symfony.
س: فشل الاتصال بقاعدة البيانات، ما الحل؟
ج: تحقق مما يلي:
- فعّل خدمة قاعدة البيانات المطلوبة (MySQL أو PostgreSQL) من لوحة ServBay.
- تحقق من دالة الربط في ملف
.env
(DATABASE_URL
) وتأكد من صحة اسم المستخدم وكلمة المرور والعنوان والمنفذ واسم قاعدة البيانات. - تأكد أن بيانات الدخول تطابق الافتراضية أو ما قمت بتعديله.
- تأكد أن قاعدة البيانات
servbay_symfony_app
موجودة بالفعل.
س: لماذا لا يعمل أمر php bin/console
؟
ج: تأكد أنك في المسار /Applications/ServBay/www/servbay-symfony-app
في الطرفية وأن PHP الخاص بـ ServBay مثبت في متغيرات البيئة (PATH
) بشكل صحيح (يتم ذلك تلقائيًا غالبًا في عملية التثبيت). يمكنك التحقق بتنفيذ which php
.
الخلاصة
بهذا الدليل تكون قد أنشأت وضبطت وتشغيلت مشروع Symfony أساسي على macOS باستخدام ServBay بنجاح. يتيح لك ServBay جميع مكونات البيئة المطلوبة لتطوير Symfony (PHP، Composer، خادم ويب، قاعدة بيانات، تخزين مؤقت)، ويسهل الإعدادات لتبدأ التطوير بسرعة. يمكنك الآن تطوير تطبيقك، والتعرف أكثر على إمكانيات Symfony، والاستفادة من باقي الخدمات والبرمجيات التي يوفرها ServBay.