Skip to content

MelisDbDeploy ​

مُشغِّل ترحيل قواعد البيانات بلا واجهة لمنصّة Melis — يطبّق دلتا SQL الخاصة بكل وحدة بالترتيب. الحزمة melisplatform/melis-dbdeploy.

الغرض ​

يُبقي MelisDbDeploy مخطّط قاعدة بيانات كل وحدة متزامنًا مع الشيفرة المثبّتة. فكل وحدة تختار المشاركة تشحن تغييرات مخطّطها على هيئة ملفات SQL مرتّبة (deltas) ضمن install/dbdeploy/. يكتشف MelisDbDeploy تلك الدلتا عبر جميع الوحدات، ويطبّق ما لم يُنفَّذ منها بعد، ويسجّل كلًّا منها في جدول سجلّ التغييرات حتى يُطبَّق مرّة واحدة بالضبط — مبنيًّا فوق مَهمّة DbDeployTask الخاصة بـ Phing.

وليست له أي واجهة موجّهة للمستخدم.

علاقته بالمكتب الخلفي React ​

لا يملك MelisDbDeploy أي أداة React، ولا صفحة، ولا مدخل قائمة، ولا مسارًا. ولا يظهر أبدًا في أي مكان ضمن /melis-react. لا توجد لبنة ui-react/، ولا config/react-api.php، ولا config/react.capabilities.php، ولا src/Controller/ — فهو وحدة بلا واجهة، خدميّة فقط.

وصلته بالمكتب الخلفي React غير مباشرة بالكامل، عبر حقيقتين:

  • إنّه يُنشئ الجداول والأعمدة التي تقرأ منها أدوات React وتكتب فيها. فكل أداة React (المستخدمون، صفحات CMS، المواقع، الوسائط، …) تستعلم عن جداول قاعدة البيانات. تلك الجداول — والأعمدة التي تضيفها ميزات React الأحدث — تُنشَأ عبر دلتا install/dbdeploy/*.sql الخاصة بالوحدة المالكة، والتي يطبّقها MelisDbDeploy. فإذا أخفقت أداة React برسالة "table/column not found" مباشرةً بعد تثبيت أو تحديث، فالسبب المعتاد هو ترحيل لم يُشغَّل.
  • إنّه يعمل ضمن مسار النشر الذي يشحن بنية React. فبنية React المُودَعة (melis-core/public/ui-react/، التطبيق على /melis-react) تُشحَن عبر نفس عملية النشر التي تشغّل ترحيلات المخطّط. يتولّى MelisDbDeploy دلتا SQL المشحونة مع الوحدات؛ بينما يتولّى Flyway ترحيلات المنصّة المُصدَّرة بأرقام إصدارات (V*.sql). وهما آليّتان متكاملتان ضمن خطوة النشر ذاتها.

تفعيله ​

أضِف إلى config/melis.module.load.php:

php
return [
    'MelisDbDeploy',
];

يعتمد MelisDbDeploy على phing/phing فقط. وليست له أي تبعية على melis-core — فهو أداة قائمة بذاتها يستدعيها MelisInstaller وتدفّقات تثبيت/تحديث الوحدات، ولا تُستدعى أبدًا من React.

اختيار مشاركة وحدة ​

تُشارك الوحدة في نظام الترحيل بإعلان ما يلي في ملف composer.json الخاص بها:

json
"extra": {
    "dbdeploy": true
}

وتُوضَع دلتا SQL الخاصة بها في install/dbdeploy/*.sql. ويبدأ كل اسم ملف ببادئة رقمية تحدّد ترتيب التنفيذ (مثل 23051701_create_my_table.sql).

الخدمات الرئيسية ​

اسم الخدمة المستعارالدور
MelisDbDeployDiscoveryServiceيعثر على دلتا كل حزمة melisplatform/* مختارة للمشاركة وينسخها إلى ذاكرة العمل المؤقتة (dbdeploy/data/)، ثم يفوّض الأمر إلى خدمة النشر.
MelisDbDeployDeployServiceيتّصل بقاعدة البيانات، ويتأكّد من وجود جدول سجلّ التغييرات، ويطبّق الدلتا المعلّقة عبر DbDeployTask + PDOSQLExecTask الخاصة بـ Phing.

جدول سجلّ التغييرات ​

تُسجَّل كل دلتا مطبَّقة في جدول changelog ثابت (الاسم مطلوب من مَهمّة Phing)، والذي يعمل بوصفه سجلّ "التطبيق مرّة واحدة":

sql
CREATE TABLE IF NOT EXISTS changelog (
  `change_number` BIGINT NOT NULL,
  `delta_set`     VARCHAR(10) NOT NULL,
  `start_dt`      TIMESTAMP NOT NULL,
  `complete_dt`   TIMESTAMP NULL,
  `applied_by`    VARCHAR(100) NOT NULL,
  `description`   VARCHAR(500) NOT NULL,
  PRIMARY KEY `Pkchangelog` (`change_number`, `delta_set`)
);

يتمّ الوصول إلى النموذج عبر MelisDbDeploy\Model\Table\ChangelogTable (باسم مستعار ChangelogTable).

مثال ​

php
// Discovery — gather deltas from all dbdeploy modules
$discovery = $sm->get(\MelisDbDeploy\Service\MelisDbDeployDiscoveryService::class);
$discovery->setComposer($composer);
$discovery->processing();   // discovers modules and copies their *.sql deltas

// Deploy — apply pending deltas
$deploy = new \MelisDbDeploy\Service\MelisDbDeployDeployService(/* db params */);
if (!$deploy->isInstalled()) {
    $deploy->install();                  // creates the changelog table on first run
}
$count = $deploy->changeLogCount();      // number of deltas applied so far
$deploy->applyDeltaPath($pathToDeltas);  // run any not-yet-applied deltas

متى يعمل ​

يُستدعى MelisDbDeploy تلقائيًّا في سيناريوهين، لا يتضمّن أيٌّ منهما واجهة React:

  • التثبيت الأول — عبر MelisInstaller أثناء معالج إعداد المنصّة.
  • تثبيت / تحديث وحدة — عبر أداة الوحدات / المتجر في المكتب الخلفي وخطّاف ما بعد التحديث في Composer (DbDeployOnComposerUpdate::postUpdate())، الذي ينسخ دلتا كل وحدة ويعيد تطبيقها حتى يطابق عدد سجلّ التغييرات عدد ملفات الدلتا (تقارب مُتَّسِق مع إعادة التطبيق).

وهو لا يعرض أي متحكّمات.

استكشاف الأخطاء وإصلاحها ​

إذا أظهرت أداة React بيانات فارغة أو خطأ 500 / "table doesn't exist" مباشرةً بعد تثبيت وحدة أو تحديثها أو نشرها، فالسبب الجذري النمطي هو دلتا dbdeploy لم تُشغَّل (أو ترحيل Flyway مفقود) — لا شيفرة React. وإعادة تشغيل تدفّق الترحيل تُصلح ذلك.

الملفات الرئيسية ​

المجالالمسار
خدمة الاكتشافvendor/melisplatform/melis-dbdeploy/src/Service/MelisDbDeployDiscoveryService.php
خدمة النشرvendor/melisplatform/melis-dbdeploy/src/Service/MelisDbDeployDeployService.php
خطّاف ما بعد التحديث في Composervendor/melisplatform/melis-dbdeploy/src/DbDeployOnComposerUpdate.php
تعريف بنية سجلّ التغييرات (DDL)vendor/melisplatform/melis-dbdeploy/data/changelog.sql
النماذجvendor/melisplatform/melis-dbdeploy/src/Model/
دلتا الوحدة (أي وحدة)vendor/melisplatform/<module>/install/dbdeploy/*.sql

انظر أيضًا: MelisCore · MelisInstaller · MelisComposerDeploy · مفاهيم المنصّة