بناء التطبيق
التطبيق المدمج (Embedded)
الـ boilerplate
عند إنشاء تطبيق Embedded، يُجهَّز لك مستودع GitHub جديد فيه:
.github/workflows/partner-module-policy.yml ← CI policy scan
scripts/partner-policy/ ← regex Scanner + AST PHPStan rule
app/ ← كود تطبيقك
config/<my-module>.php ← كل مفاتيحك تحت هذه الـ namespace
database/migrations/ ← migrations لجداولك الخاصة
manifest.json
module.json
phpstan.neon ← مع PHPStan rule جاهزة
قواعد العزل
التطبيق المدمج يعيش داخل أوكتا، لكنه ممنوع من:
- ✗ استيراد
App\Models\*(نماذج المنصة) - ✗ استيراد
App\Services\*ما عداApp\Services\PartnerApi\* - ✗ قراءة env keys للمنصة (DB_, REDIS_, الخ)
- ✗ قراءة config المنصة (
database.*,services.*، الخ) - ✗ قراءة
.envمباشرة
الطريقة الصحيحة للوصول للبيانات
استخدم خدمات PartnerApi فقط:
use App\Services\PartnerApi\Education\Students\ListStudents;
class MyController
{
public function __invoke(ListStudents $list)
{
$page = $list(page: 1, perPage: 20);
return view('my-module::dashboard', [
'students' => $page->data, // → list<StudentDto>
'total' => $page->total,
]);
}
}
كل خدمة تتحقق من النطاق المطلوب آلياً قبل تنفيذ أي عملية. إذا كان
المستأجر لم يُعطِ تطبيقك الـ scope المطلوب، تحصل على
MissingScopeException (يتحوّل إلى 403).
الجداول الخاصة بك
أنت تملك schema منفصل تماماً عن أوكتا. اسم الـ schema يُولَّد من slug
تطبيقك (m_<my_module>). لا يلامس وصولك جداول المنصة على الإطلاق
(PostgreSQL يفرض ذلك على مستوى الـ role).
كيف تصل جداولك إلى ذلك الـ schema — وكيف تصحّح ما أخطأت فيه — في قاعدة بيانات التطبيق (Migrations).