إنشاء وتشغيل مشروع Symfony
يعد ServBay بيئة تطوير ويب محلية مصممة خصيصًا لنظام macOS، حيث يدمج عدة لغات تشغيل مثل PHP، Node.js، Python، Go، Java، بالإضافة إلى قواعد بيانات مثل MySQL، PostgreSQL، MongoDB، Redis والمزيد، مع دعم لخوادم الويب Apache وCaddy. سيشرح هذا الدليل بالتفصيل كيفية إنشاء وتشغيل مشروع Symfony بسرعة على macOS باستخدام ServBay خطوة بخطوة.
ما هو Symfony؟
Symfony هو إطار عمل ويب مفتوح المصدر للغة PHP، أنشأته SensioLabs، ويهدف إلى تزويد المطورين بمجموعة أدوات قوية ومرنة لتطوير تطبيقات ويب حديثة وواجهات برمجة التطبيقات (APIs). يلتزم Symfony بأفضل ممارسات تطوير الويب ويوفر مكونات غنية مثل نظام التوجيه، محرك القوالب (Twig)، معالجة النماذج، التوثيق، الحقن التبعي والمزيد، مما يسرّع ويبسط مهام التطوير الاعتيادية.
أبرز مزايا وخصائص Symfony
- تصميم معياري: يستند Symfony إلى مكتبة مكونات قابلة لإعادة الاستخدام، ويمكن للمطور اختيار ودمج المكونات المناسبة بحسب حاجة كل مشروع، لبناء تطبيقات خفيفة أو ضخمة.
- أداء عالي: يقدم Symfony أداءً ممتازًا عبر معمارية محسنة، وتخزين مؤقت فعال، ودعم لأحدث ميزات PHP.
- مجتمع دعم قوي: يضم مجتمعًا كبيرًا، ووفرة من الحزم (Bundles) الوثائق التفصيلية، فتجد حلولاً لأي تحدٍ بسهولة.
- مرونة: سهل التكامل مع مكتبات وإضافات طرف ثالث، ويناسب المشاريع بمختلف الأحجام والتعقيد.
- استقرار وقابلية صيانة: يلتزم Symfony بقواعد البرمجة السليمة وأنماط التصاميم، ما يسهل الاختبار، الصيانة والتوسعة.
Symphony مناسب لتطوير مشاريع ويب بمختلف الأحجام من واجهات برمجة التطبيقات الصغيرة حتى الأنظمة المؤسسية الكبيرة.
إنشاء وتشغيل مشروع Symfony باستخدام ServBay
يوفر ServBay بيئة متكاملة لتشغيل مشاريع Symfony، تشمل إصدارات مختلفة من PHP، Composer، خوادم الويب، وقواعد البيانات وخدمات الكاش الضرورية. سيرشدك هذا القسم لاستغلال إمكانات ServBay لإنشاء وتكوين مشروع Symfony جديد بسهولة.
المتطلبات الأساسية
قبل البدء، يرجى التأكد من الأمور التالية:
- تثبيت ServBay: تأكد من تثبيت وتشغيل ServBay على جهازك بنظام macOS. إذا لم تكن قد ثبتّه بعد، راجع دليل تثبيت ServBay.
- تشغيل خدمات ServBay: يجب أن تكون الخدمات الأساسية مثل Caddy أو Apache وأي قاعدة بيانات تحتاجها قيد التشغيل.
- معرفة أساسية: يفضل أن تكون لديك معرفة بمفاهيم PHP وComposer وSymfony.
إنشاء مشروع Symfony
يُوصى بوضع كل مشاريع مواقعك في مجلد /Applications/ServBay/www
لتسهيل عملية الاكتشاف والإدارة من قبل ServBay.
تأكد من توفر Composer
يُدمج Composer تلقائيًا في ServBay مع ضبط متغيرات البيئة، فلا حاجة لتثبيته يدويًا. للتحقق من توفره، يمكنك إدخال:
composer --version
1في الطرفية.
إنشاء مجلد المشروع
لإنشاء مجلد جديد ضمن المسار الموصى به لمشروعك:
bashcd /Applications/ServBay/www mkdir servbay-symfony-app
1
2إنشاء المشروع عبر Composer
ادخل المجلد وأنشئ مشروع Symfony يستند إلى
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:[email protected]:3306/db_name?serverVersion=8.0&charset=utf8mb4" # DATABASE_URL="postgresql://db_user:[email protected]: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)
للوصول للمشروع عبر المتصفح، استخدم ميزة "الموقع" في ServBay لإعداد مضيف افتراضي محلي. دليل موقع مشروع Symfony عادة هو مجلد public/
.
من خلال لوحة تحكم ServBay، توجه لإعدادات "المواقع" (أو "المضيفون" في الإصدارات الأقدم) وأضف موقعًا جديدًا بالإعدادات التالية:
- الاسم: مثلاً
My Symfony Dev Site
. - النطاق: مثل
servbay-symfony-test.local
(يقوم ServBay بضبطه تلقائيًا محليًا). - نوع الموقع:
PHP
. - إصدار PHP: يُوصى بأحدث إصدار مستقر يدعمه مشروعك، مثل
8.3
. - جذر الموقع: يجب أن يشير مباشرة إلى مجلد
public/
الخاص بمشروعك، أي:/Applications/ServBay/www/servbay-symfony-app/public
.
بعد الحفظ وتطبيق التغييرات، سيحدّث ServBay إعدادات خادم الويب تلقائيًا، ويجهز شهادات SSL محلية لتتمكن من الوصول عبر HTTPS مباشرة.
لمزيد من التفاصيل حول الإعداد، راجع إضافة أول موقع على ServBay.
إضافة كود تجريبي أساسي
للتحقق من نجاح إعداد الموقع، سنضيف مسار Controller بسيط ليعرض نصًا عند زيارة الصفحة الرئيسية.
تعديل ملف التوجيه (config/routes.yaml)
أضف ما يلي لتعريف المسار
/
المرتبط بدالة تحكمindex
:yaml# config/routes.yaml index: path: / controller: App\Controller\DefaultController::index
1
2
3
4إنشاء Controller (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ينشئ هذا الكود Controller باسم
DefaultController
فيه دالةindex
مرتبطة بالمسار/
، وتعيد استجابة نصية عند زيارة الجذر.
تصفح الموقع
الآن افتح متصفحك وزر العنوان حسب نطاقك في ServBay:
https://servbay-symfony-test.local
إذا أعددت كل شيء بشكل صحيح، يجب أن ترى:
Hello ServBay and Symfony!
وهذا مؤشر على أن مشروع Symfony يعمل بنجاح من خلال خادم ServBay مع دعم HTTPS.
أمثلة قواعد البيانات والتخزين المؤقت
عادة يستخدم Symfony مكتبة Doctrine ORM لإدارة قواعد البيانات العلائقية، وSymfony Cache للتعامل مع الكاش وقواعد NoSQL. يوفر ServBay جميع الخدمات المطلوبة وإضافات PHP المناسبة.
مثال قواعد بيانات علائقية (Doctrine ORM)
يدعم ServBay كل من MySQL وPostgreSQL. سنوضح كيفية تهيئة واستخدام كلا النوعين في Symfony.
إعداد الاتصال بقاعدة البيانات
في ملف
.env
بجذر المشروع، قم بإزالة التعليق وتحرير متغيرDATABASE_URL
بما يتناسب مع نوع قاعدة البيانات.- لمستخدمي MySQL: اسم المستخدم
root
، كلمة السرpassword
، المنفذ3306
.dotenv# .env DATABASE_URL="mysql://root:[email protected]:3306/servbay_symfony_app?serverVersion=8.0&charset=utf8mb4"
1
2 - لمستخدمي PostgreSQL: اسم المستخدم
root
، كلمة السرpassword
، المنفذ5432
.dotenv# .env DATABASE_URL="postgresql://root:[email protected]:5432/servbay_symfony_app?serverVersion=13&charset=utf8"
1
2
تأكد من تشغيل خدمة قاعدة البيانات المطلوبة من لوحة تحكم ServBay.
- لمستخدمي MySQL: اسم المستخدم
إنشاء قاعدة البيانات
إذا لم تكن قاعدة البيانات
servbay_symfony_app
موجودة، يمكنك إنشاؤها من أدوات ServBay مثل phpMyAdmin أو pgAdmin، أو عبر أمر Symfony:bashphp bin/console doctrine:database:create
1إنشاء Entity وملف التهجير
يمكن إنشاء Entity باستخدام Maker Bundle وإنشاء ملف التهجير:
bashphp bin/console make:entity User
1قم بإضافة الحقول حسب الحاجة (مثلاً:
name
نصي وemail
نصي وفريد).
لإنشاء ملف التهجير:bashphp bin/console make:migration
1سينشئ ذلك ملف تهجير في
src/Migrations
به SQL لإنشاء جدول المستخدمين.تطبيق التهجير
نفذ الأمر التالي لتحديث بنية قاعدة البيانات:
bashphp bin/console doctrine:migrations:migrate
1إضافة مثال عمليات قاعدة البيانات
عدل
src/Controller/DefaultController.php
لإضافة مسارات وطرق للتحكم بالبيانات باستخدام Doctrine:أولًا، تأكد من حقن
EntityManagerInterface
في الكونستركتور: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; // حقن EntityManagerInterface عن طريق البناء 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 # أو /pgsql-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('[email protected]'); // طلب إضافة السجل $this->entityManager->persist($user); // تنفيذ الإضافة $this->entityManager->flush(); return new Response('تم إضافة المستخدم بنجاح!'); } /** * @Route("/get-users", name="app_get_users") */ public function getUsers(): JsonResponse { // جلب جميع المستخدمين من قاعدة البيانات $users = $this->entityManager->getRepository(User::class)->findAll(); // تحويل النتائج لمصفوفة لاستخدام JsonResponse $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، ويمكن استخدامها في Symfony عبر Symfony Cache Component بسهولة.
إعداد الاتصال بالكاش
ضبط متغير الاتصال في ملف
.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 محمي بكلمة سر (غالبًا بلا كلمة سر افتراضيًا) # CACHE_DSN=redis://:[email protected]:6379
1
2
3
4
5
- لـ Memcached: منفذ 11211 افتراضي.
إضافة مثال على استخدام الكاش
قم بتعديل
src/Controller/DefaultController.php
لحقن واستخدام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; // إضافة خاصية الكاش // حقن CacheInterface في الكونستركتور 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; }); // $cacheItem يحتوي البيانات المحفوظة $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)
س: ماذا أفعل إذا ظهرت رسالة "الصفحة غير موجودة" أو خطأ 500 عند زيارة https://servbay-symfony-test.local
؟
ج:
- تحقق أن ServBay يعمل وأن خدمة الموقع (Caddy أو Apache) نشطة.
- التأكد من صحة نطاق الموقع في إعدادات ServBay وأن مجلد الجذر مضبوط على
/Applications/ServBay/www/servbay-symfony-app/public
. - راجع سجل Symfony:
var/log/dev.log
لتفاصيل الخطأ. - في مجلد المشروع شغل:
composer install
لتثبيت كل التبعيات. - تحقق من أن إصدار PHP متوافق مع مشروع Symfony.
س: فشل الاتصال بقاعدة البيانات، ما العمل؟
ج:
- تأكد من أن خدمة قاعدة البيانات (MySQL أو PostgreSQL) تعمل من خلال لوحة تحكم ServBay.
- راجع إعداد
DATABASE_URL
في ملف.env
وتحقق من صحة اسم المستخدم، كلمة المرور، المضيف (127.0.0.1)، المنفذ (MySQL 3306، PostgreSQL 5432) واسم قاعدة البيانات. - تأكد من أن اسم المستخدم وكلمة المرور صحيحان ولا توجد تعديلات لم يتم أخذها بالحسبان.
- احرص على وجود قاعدة البيانات
servbay_symfony_app
.
س: لا أستطيع تشغيل أمر php bin/console
؟
ج: تأكد أنك داخل مجلد /Applications/ServBay/www/servbay-symfony-app
وأن PHP الخاص بـ ServBay مضبوط في متغيرات النظام (PATH
). يمكنك التحقق باستخدام الأمر which php
للتأكد أنك تستخدم PHP من ServBay.
الخلاصة
باتباع هذا الدليل، أصبحت الآن قادرًا على إنشاء، تهيئة وتشغيل مشروع Symfony أساسي على macOS باستخدام ServBay بسهولة. يوفر ServBay كل مكونات Symfony الحيوية (PHP، Composer، خادم الويب، قاعدة البيانات، الكاش) مع تهيئة مبسطة وسريعة تدعم بيئة تطوير محلية قوية، لتبدأ تطوير تطبيقك مباشرة. يمكنك الانطلاق من هذا المشروع لمواصلة استكشاف مزايا Symfony والاستفادة من بقية باقات وخدمات ServBay المدمجة.