انتقل إلى المحتوى الرئيسي

إعداد Symfony

يُعدَّ Weaver ORM عبر config/packages/weaver.yaml. تغطي هذه الصفحة كل خيار متاح.

الإعداد الأدنى​

# config/packages/weaver.yaml
weaver_orm:
connection:
driver: pdo_pgsql
url: '%env(DATABASE_URL)%'

mapper_paths:
- '%kernel.project_dir%/src/Mapper'

مرجع الإعداد الكامل​

# config/packages/weaver.yaml
weaver_orm:

# ------------------------------------------------------------------ #
# الاتصال الأساسي (الكتابة)
# ------------------------------------------------------------------ #
connection:
driver: pdo_pgsql # pdo_pgsql | pdo_mysql | pdo_sqlite | pyrosql
url: '%env(DATABASE_URL)%' # DSN له الأولوية على الخيارات الفردية أدناه

# خيارات فردية (بديل لـ url:)
# host: '%env(DB_HOST)%'
# port: '%env(int:DB_PORT)%'
# dbname: '%env(DB_NAME)%'
# user: '%env(DB_USER)%'
# password: '%env(DB_PASSWORD)%'

# خيارات مجموعة الاتصال (FrankenPHP / RoadRunner)
# persistent: true
# charset: utf8mb4 # لـ MySQL فقط

# ------------------------------------------------------------------ #
# نسخة القراءة (اختياري)
# ------------------------------------------------------------------ #
read_connection:
driver: pdo_pgsql
url: '%env(DATABASE_READ_URL)%'

# ------------------------------------------------------------------ #
# اكتشاف المُعيِّنات
# ------------------------------------------------------------------ #
mapper_paths:
- '%kernel.project_dir%/src/Mapper'
# أضف مزيداً من المسارات لسياقات محدودة متعددة:
# - '%kernel.project_dir%/src/Billing/Mapper'
# - '%kernel.project_dir%/src/Catalog/Mapper'

# ------------------------------------------------------------------ #
# الهجرات
# ------------------------------------------------------------------ #
migrations_path: '%kernel.project_dir%/migrations/weaver'
migrations_namespace: 'App\Migrations\Weaver'

# ------------------------------------------------------------------ #
# التصحيح والأمان
# ------------------------------------------------------------------ #
debug: '%kernel.debug%' # يسجّل جميع الاستعلامات إلى Symfony profiler

# اكتشاف وتحذير من أنماط استعلامات N+1 في بيئة التطوير
n1_detector: true # يعمل فقط عند debug: true

# ألقِ استثناءً إذا كان SELECT سيعيد أكثر من N صف.
# يحمي من عمليات مسح الجدول الكاملة العرضية في الإنتاج.
# اضبط على 0 لتعطيله.
max_rows_safety_limit: 5000

برامج تشغيل الاتصال​

pdo_pgsql — PostgreSQL​

weaver_orm:
connection:
driver: pdo_pgsql
url: '%env(DATABASE_URL)%'
DATABASE_URL="postgresql://app:secret@db:5432/myapp?serverVersion=16&charset=utf8"

pdo_mysql — MySQL / MariaDB​

weaver_orm:
connection:
driver: pdo_mysql
url: '%env(DATABASE_URL)%'
DATABASE_URL="mysql://app:secret@db:3306/myapp?serverVersion=8.0&charset=utf8mb4"

pdo_sqlite — SQLite (اختبار / مدمج)​

weaver_orm:
connection:
driver: pdo_sqlite
url: '%env(DATABASE_URL)%'
# في الذاكرة (مفيد لاختبارات التكامل):
DATABASE_URL="sqlite:///:memory:"

# مستند إلى ملف:
DATABASE_URL="sqlite:///%kernel.project_dir%/var/app.db"

pyrosql — محرك PyroSQL التحليلي​

weaver_orm:
connection:
driver: pdo_pgsql
url: '%env(DATABASE_URL)%'

# PyroSQL كاتصال قراءة مخصص للاستعلامات التحليلية
read_connection:
driver: pyrosql
url: '%env(VALKARNSQL_URL)%'

متغيرات البيئة​

إعداد نموذجي لـ .env / .env.local:

# .env
DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8"

# .env.local (لا يُودَع أبداً في نظام التحكم بالإصدارات)
DATABASE_URL="postgresql://app:mylocalpwd@db:5432/app_dev?serverVersion=16&charset=utf8"

# نسخة القراءة (اختياري)
DATABASE_READ_URL="postgresql://app_ro:readpwd@db-replica:5432/app?serverVersion=16&charset=utf8"

إعداد نسخة القراءة​

عند تعريف read_connection، يوجّه Weaver تلقائياً استعلامات SELECT إلى اتصال القراءة واستعلامات INSERT / UPDATE / DELETE إلى الاتصال الأساسي.

weaver_orm:
connection:
driver: pdo_pgsql
url: '%env(DATABASE_URL)%'

read_connection:
driver: pdo_pgsql
url: '%env(DATABASE_READ_URL)%'

لإجبار الاستعلام على الاتصال الأساسي (مثلاً، مباشرةً بعد الكتابة)، استخدم ->onPrimary():

// يقرأ دائماً من الأساسي، متجاوزاً النسخة المتماثلة
$user = $this->users->query()
->onPrimary()
->where('id', '=', $id)
->first();

وضع التصحيح وكاشف N+1​

عند تفعيل debug: true (الإعداد الافتراضي لـ Symfony في بيئة dev)، يقوم Weaver بـ:

  • تسجيل كل استعلام SQL مع ارتباطاته إلى Symfony Web Profiler.
  • تفعيل كاشف N+1 عند تفعيل n1_detector: true. يفحص الكاشف أنماط التحميل المسبق ويُصدر تحذيراً في الـ profiler إذا اكتشف وصولاً إلى علاقة على كيانات متعددة دون تحميلها مسبقاً.
# config/packages/dev/weaver.yaml
weaver_orm:
debug: true
n1_detector: true
max_rows_safety_limit: 1000 # أكثر صرامة في التطوير
# config/packages/prod/weaver.yaml
weaver_orm:
debug: false
n1_detector: false
max_rows_safety_limit: 5000

سياقات محدودة متعددة​

إذا كان تطبيقك يستخدم قواعد بيانات متعددة أو تريد فصلاً صارماً بين السياقات المحدودة، يمكنك تسجيل مجموعات اتصال متعددة باستخدام وسم الخدمات في Symfony مباشرةً. انظر دليل الإعداد المتقدم للتفاصيل.