تخطَّ إلى المحتوى
getnextpdf.com

Enterprise الإصدار

الإصدار — مرجع متعمّق

يُنمذج فضاء الأسماء NextPDF\Enterprise\Release إصدارَ المنتج بوصفه كائنات قيمة غير قابلة للتغيير ومُنمَّطة. يتكوّن سطحه العام من سبع فئات final وخمسة تعدادات مُسنَدة إلى سلاسل نصّية. تُجمِّع ReleaseManifest مُدخلات ArtifactManifest لكلّ منتج، إضافةً إلى مسارات أدلّة سلسلة التوريد. وBuildProfile هي المصدر الوحيد للحقيقة لمتغيّر منتج واحد. وتشتقّ ArtifactNamer وPackageMapping أسماء ملفّات حتمية وهويّة حزمة ⁨Composer⁩ من ملفّ تعريف. وتحلّ PublishingPlan::fromProfiles كلّ ملفّ تعريف إلى مُدخلات PublishingTarget مُنمَّطة بالقناة وحدّ الوصول الصحيحين. وتُنمِّط ReleaseStatus دورة حياة الإصدار. لا تُجري الوحدة أيّ إدخال/إخراج، ولا استدعاءات شبكية، ولا تعمية؛ إنها نمذجة بيانات وصفية صِرفة.

تُشحن هذه الإمكانية في ⁨NextPDF Enterprise⁩ (nextpdf/enterprise) وتُفعَّل بمظروف ترخيص من فئة ⁨Enterprise⁩. النشرُ الذي لا يملك ذلك الاستحقاق لا يُحمِّل فئات الإمكانية. قارن بين الإصدارات واحصل على ترخيص.

يُرخَّص هذا السطح عبر حدود حزمة nextpdf/enterprise وليس له رمز إمكانية منفصل لكلّ ميزة. لا يشحن ⁨Core⁩ و⁨Pro⁩ طبقةَ نمذجة إصدارات.

سطح واجهة برمجة التطبيقات العامّة

قسم بعنوان «سطح واجهة برمجة التطبيقات العامّة»
Terminal window
composer require nextpdf/enterprise:^3
الرمزالمعامِلاتالسلوك الافتراضيالقيمة المُعادةيرمي أو يفشل بـملاحظات
ReleaseManifest::__constructversion, sourceCommit, builtAt, artifacts = [], sbomPath = null, gpgSignature = null, checksumPath = nullيبني مستند الإصدار الأعلى غير القابل للتغييرمثيلfinal readonly؛ SCHEMA_VERSION هو '1.0'؛ رقم ثانوي للحقول الإضافية، ورقم رئيسي للتغييرات الكاسِرة؛ منذ 3.0.0
ReleaseManifest::createWithDefaultsstring $version, string $sourceCommit, DateTimeImmutable $builtAt, array $artifacts = []يُهيّئ مُسبقًا أسماء ملفّات ⁨SBOM⁩ والتوقيع والمجموع التحقّقي الافتراضية عبر ArtifactNamerselfنقطة الدخول المعيارية لبُناة الإصدارات؛ استخدم الباني لتجاوز مسارات فردية
ReleaseManifest::toArray / ::toJsonلا شيءيُسَلسِل البيان مع جميع مُدخلات المنتجاتarray / سلسلة JSONtoJson: JsonException عند فشل الترميزمطبوع بتنسيق مقروء، بشرطات مائلة غير مهرّبة؛ built_at بتنسيق ⁨ATOM⁩
ReleaseManifest::validateلا شيءيتحقّق من أن قائمة المنتجات غير فارغة وأن كلّ منتج يطابق إصدار الإصدار وكوميت المصدرlist<string> من الأخطاء؛ الفراغ يعني صحّةلا يرمي أبدًاعلى المستدعين معاملة القائمة غير الفارغة بوصفها عيبًا
ArtifactManifest::__constructfilename, version, sourceCommit, edition, deliveryMode, encodingTechnology, channel, phpTarget, sha256, ioncubeExpire, builtAtيُسجّل منتجًا مبنيًّا واحدًا: ما الذي بُني، وكيف، وكيفية التحقّق منهمثيلfinal readonly؛ ioncubeExpire هو null للمنتجات غير المنتهية
ArtifactManifest::fromProfileBuildProfile $profile, string $version, string $sourceCommit, string $sha256, ?DateTimeImmutable $builtAt = nullيشتقّ اسم الملفّ وجميع أبعاد ملفّ التعريفselfbuiltAt يكون افتراضيًّا الوقت الحالي
ArtifactManifest::toArrayلا شيءيُسَلسِل لترميز JSONarray<string, string|null>تُسَلسَل حقول التعداد إلى قيم السلاسل المُسنَدة إليها
BuildProfile::__construct / ::fromArrayحقول ملفّ التعريف / array $dataيُعرّف متغيّر منتج واحد؛ المصدر الوحيد للحقيقة للتسمية والبيان والخطةمثيل / selffromArray: InvalidArgumentException عند حقل مطلوب مفقود أو فارغالمفاتيح المطلوبة: name, edition, delivery, encoding_technology, channel, php_target
BuildProfile::requiresEncoding / ::isEvaluationلا شيءمساعِدات محمولية على أبعاد ملفّ التعريفboolيتطلّب الترميز DeliveryMode::Encoded وEncodingTechnology::IonCube معًا
ArtifactNamer::formatBuildProfile $profile, string $versionيُصدِر nextpdf-{edition}-{delivery}-{channel}-php{target}-{version}.zipnon-empty-stringحتمي؛ تُزال النقاط من هدف ⁨PHP⁩ (8.4 يصبح php84)
ArtifactNamer::checksumFile / ::signatureFile / ::sbomFile / ::manifestFilestring $version (manifestFile: لا شيء)يُصدِر SHA256SUMS-{v}.txt، SHA256SUMS-{v}.txt.asc، sbom-{v}.cdx.json، release-manifest.jsonnon-empty-stringيطابق اسم ملفّ ⁨SBOM⁩ مستند ⁨CycloneDX⁩ الذي يكتبه مولّد ⁨SBOM⁩ في ⁨Core⁩
PackageMapping::packageName / ::resolvePackageNameBuildProfile / LicenseEdition + LicenseChannelيربط إلى nextpdf/pro أو nextpdf/enterprise؛ تُلحِق قناة التقييم -evaluationnon-empty-stringInvalidArgumentException عند إصدار غير معروفيمنع فضاء أسماء التقييم المنفصل الخلط مع المنتجات المدفوعة
PackageMapping::distUrlPatternBuildProfile $profile, string $versionيحلّ عنوان ⁨URL⁩ لتنزيل المنتج على مستودع المنتجات المعياريnon-empty-stringيتشارك المُرمَّز والنصّ الصريح اسمَ حزمة واحدًا؛ لكن عناوين ⁨URL⁩ للتوزيع تختلف
PackageMapping::accessBoundary / ::artifactOrigin / ::consumptionChannel / ::allPackageNamesBuildProfile / لا شيء / لا شيء / لا شيءيتبع الحدُّ قناةَ الترخيص؛ قنوات منشأ واستهلاك ثابتة؛ جميع أسماء الحِزم المواجِهة للعملاءAccessBoundary / DistributionChannel / DistributionChannel / list<non-empty-string>⁨Core⁩ ليس حزمة مميّزة ويُستبعد من قائمة الأسماء
PublishingPlan::fromProfilesarray $profiles, string $version, PublishingEnvironment $environment = Stagingيحلّ هدفين لكلّ ملفّ تعريف: منشأ منتج واحد، وطبقة استهلاك واحدةselfتكون البيئة افتراضيًّا Staging؛ الإنتاج دائمًا خيار صريح
PublishingPlan::targetsByBoundary / ::targetsByChannel / ::packageNamesAccessBoundary / DistributionChannel / لا شيءمساعِدات تصفية وتعداد على الأهداف المحلولةlist<PublishingTarget> / list<PublishingTarget> / list<non-empty-string>packageNames مُرتَّبة ومنزوعة التكرار
PublishingPlan::validateلا شيءيتحقّق من أن الأهداف غير فارغة، وأن الإصدارات تطابق الخطة، وألّا تقع أيّ حزمة تقييم في حدّ مدفوعlist<string> من الأخطاء؛ الفراغ يعني صحّةلا يرمي أبدًاشغّله قبل أيّ خطوة رفع
PublishingPlan::toArrayلا شيءيُسَلسِل لمُخرجات التشغيل التجريبي والتسجيلarray<string, mixed>يتضمّن target_count وقائمة الحِزم
PublishingTarget::fromProfileBuildProfile $profile, string $version, PublishingEnvironment $environment, DistributionChannel $channelيحلّ اسم الحزمة وحدّ الوصول واسم ملفّ المنتج لقناة واحدةselffinal readonly؛ toArray تُسَلسِل للتسجيل
AccessBoundaryتعداد: Paid, Evaluation, InternalisCustomerFacing هو true لـ Paid وEvaluation فقطمُسنَد إلى 'paid', 'evaluation', 'internal'requiresAuthentication تُعيد true لكلّ حدّ
DistributionChannelتعداد: GitHubReleases, PrivatePackagist, DirectDownloadisArtifactOrigin وisConsumptionLayer تفصلان الدورينمُسنَد إلى 'github_releases', 'private_packagist', 'direct_download'DirectDownload محجوز لقناة عناوين ⁨URL⁩ موقّعة مستقبلية
EncodingTechnologyتعداد: IonCube, Noneيُسمّي أداة الترميز، متمايزةً عن شكل التسليممُسنَد إلى 'ioncube', 'none'المنتج بنصّ صريح يُبلِّغ دائمًا عن None
PublishingEnvironmentتعداد: Staging, ProductionisCustomerFacing هو true لـ Production فقطمُسنَد إلى 'staging', 'production'⁨Staging⁩ هدف تحقّق داخلي
ReleaseStatusتعداد: Built, Audited, Staged, Published, Revoked, SupersededcanPromote، nextStatus، isCustomerVisible، isTerminal تُنمِّط دورة الحياةnextStatus تُعيد ?selfسلسلة الترقية ⁨Built → Audited → Staged → Published⁩؛ Revoked وSuperseded نهائيان

توقيعات نقاط الدخول، حرفيًّا من المصدر:

public static function createWithDefaults(string $version, string $sourceCommit, DateTimeImmutable $builtAt, array $artifacts = []): self
public static function fromProfile(BuildProfile $profile, string $version, string $sourceCommit, string $sha256, ?DateTimeImmutable $builtAt = null): self
public static function fromArray(array $data): self
public static function format(BuildProfile $profile, string $version): string
public static function fromProfiles(array $profiles, string $version, PublishingEnvironment $environment = PublishingEnvironment::Staging): self
public static function fromProfile(BuildProfile $profile, string $version, PublishingEnvironment $environment, DistributionChannel $channel): self
  • كلّ فئة final؛ وكلّ فئة قيمة readonly. يُثبّت البناءُ الحالةَ بالكامل. لا تُجري الوحدة أيّ عمليات على نظام الملفّات أو الشبكة أو التعمية.
  • ReleaseManifest هي المستند الأعلى غير القابل للتغيير لإصدار: الإصدار الدلالي، وكوميت المصدر، وطابع زمن البناء، وقائمة المنتجات، ومسارات أدلّة سلسلة التوريد الاختيارية (⁨SBOM⁩، وتوقيع ⁨GPG⁩، والمجاميع التحقّقية). إصدار مخطّطها ثانوي-للإضافي ورئيسي-للكاسِر.
  • BuildProfile هي المصدر الوحيد للحقيقة لما يحتويه المنتج وكيفية تحزيمه. تشتقّ التسمية والبيان والخطة جميعُها من ملفّ التعريف؛ لا يوجد مصدر تهيئة ثانوي.
  • EncodingTechnology يُسمّي أداة الترميز؛ وDeliveryMode (من وحدة الترخيص) يُسمّي الشكل المُسلَّم. الاثنان منفصلان عمدًا، والمنتج بنصّ صريح يُبلِّغ دائمًا عن EncodingTechnology::None.
  • DistributionChannel يفصل منشأ المنتج (تخزين ثنائي؛ وجهة الرفع) عن طبقة استهلاك الحزمة (السجلّ الذي يقرؤه composer require). يُخزّن المنشأ الثنائيَّ؛ وتقدّم طبقة الاستهلاك البياناتِ الوصفية التي تشير إليه.
  • AccessBoundary يعدّد ⁨Paid⁩ و⁨Evaluation⁩ و⁨Internal⁩. كلّ حدّ يتطلّب استيثاقًا. تخدم المنتجات الداخلية ⁨CI⁩ و⁨QA⁩ والتشغيل التجريبي وليست مواجِهة للعملاء أبدًا.
  • PublishingPlan::fromProfiles يحلّ كلّ ملفّ تعريف إلى هدفين بالضبط: هدف منشأ منتج وهدف طبقة استهلاك، مع اشتقاق حدّ الوصول من قناة ترخيص ملفّ التعريف كي تُوجَّه المنتجات المدفوعة والتقييمية توجيهًا صحيحًا.
  • الخطة وصفية للأهداف المقصودة، لا للنقل. تُنفّذ أدوات الإصدار المحيطة الرفعَ الفعلي، ويُسجّل البيان أدلّةَ سلسلة التوريد — لكنه لا يُنتجها بنفسه.
  • ReleaseStatus يُنمِّط دورة الحياة: ⁨Built → Audited → Staged → Published⁩، مع Revoked وSuperseded بوصفهما مخرجين نهائيين من Published. ‏Published وحده مرئي للعملاء؛ وcanPromote هو false من Published فصاعدًا.
  • ReleaseManifest::validate وPublishingPlan::validate تُبلِّغان عن أخطاء الاتّساق بوصفها قوائم سلاسل نصّية ولا ترميان أبدًا. القائمة الفارغة هي النتيجة الصحيحة الوحيدة.

الحالات الحدّية وأنماط الفشل

قسم بعنوان «الحالات الحدّية وأنماط الفشل»
  • BuildProfile::fromArray بحقل مطلوب مفقود أو غير نصّي أو فارغ: InvalidArgumentException يُسمّي الحقل.
  • BuildProfile::fromArray بـ ioncube_expire فارغ أو غير نصّي: يُطبَّع إلى null (غير منتهٍ). تُسقَط المُدخلات غير النصّية أو الفارغة في encode_paths وexclude_paths بصمت.
  • PackageMapping::resolvePackageName بإصدار خارج الخريطة المعروفة: InvalidArgumentException.
  • ReleaseManifest::toJson على بيانات غير قابلة للترميز: JsonException. تستخدم السَّلسَلة JSON_THROW_ON_ERROR؛ لا يوجد بديل صامت.
  • ReleaseManifest::validate يُبلِّغ عن قائمة منتجات فارغة، وعن أيّ منتج يختلف إصداره أو كوميت مصدره عن الإصدار، بوصفها أخطاء.
  • PublishingPlan::validate يُبلِّغ عن قائمة أهداف فارغة، وأيّ إصدار هدف يتباعد عن الخطة، وأيّ حزمة تقييم حُلَّت إلى حدّ مدفوع.
  • ReleaseStatus::nextStatus تُعيد null من Published وRevoked وSuperseded. على المستدعين معالجة null؛ لا يوجد التفاف.
  • قنوات المنشأ وطبقة الاستهلاك متمايزة؛ لا توجّه composer require إلى منشأ المنتج.
  • منتجات الحدّ الداخلي ليست مواجِهة للعملاء أبدًا؛ وتوجيهها إلى قناة عملاء خطأ نمذجة صريح.
  • لا تُجري هذه الوحدة أيّ عمليات تعمية. توقيع ⁨GPG⁩ وتوليد المجموع التحقّقي خارجيان ولا يُشار إليهما هنا إلا مرجعيًّا.

لا يُدَّعى أيّ مطابقة معيارية لهذه الوحدة؛ فهي طبقة نمذجة إصدارات، ولا يملك ⁨NextPDF⁩ أيّ شهادة. يطابق اسم ملفّ ⁨SBOM⁩ الافتراضي (sbom-{version}.cdx.json) مستندَ ⁨CycloneDX⁩ الذي يكتبه مولّد ⁨SBOM⁩ في ⁨Core⁩؛ يشير البيان إلى ذلك الدليل ولا يتحقّق منه. تُنتَج توقيعات ⁨GPG⁩ والمجاميع التحقّقية ويُتحقّق منها عبر خطّ أنابيب الإصدار المحيط. تسجيل مسار دليل إمكانيةٌ لا إثبات: البيان ليس دليلًا بذاته، ولا يشهد على الأصل، ولا يعتمد إصدارًا، ولا يُشكّل مشورة قانونية.

  • فضّل ReleaseManifest::createWithDefaults كي تتوافق أسماء ملفّات الدليل دائمًا مع ArtifactNamer. واحجز الباني الخام للتجاوزات المتعمّدة لكلّ مسار.
  • شغّل بوّابتَي validate() كلتيهما في ⁨CI⁩ قبل أيّ خطوة نشر، وأفشِل خطّ الأنابيب عند قائمة أخطاء غير فارغة.
  • PublishingPlan::fromProfiles يكون افتراضيًّا PublishingEnvironment::Staging. مرِّر Production صراحةً؛ لا شيء في هذه الوحدة يُرقّي بيئةً ضمنيًّا.
  • تحمل البيانات المُسَلسَلة قيمَ إسناد التعداد (paid، encoded، ioncube، وهكذا) وطوابع زمن ⁨ATOM⁩؛ عامِل تلك السلاسل بوصفها عقد النقل.
  • تعيش منتجات التقييم في فضاء أسماء حزمة منفصل (لاحقة -evaluation). أبقِ سجلّات المدفوع والتقييم متمايزةً في تهيئة ⁨Composer⁩ لديك.
  • التوجيه لكلّ قناة، وبيانات الاعتماد، والتخزين مسؤولية المُشغّل. تُخبر الخطةُ الأدواتِ بمكان انتماء المنتج، لا بكيفية الاستيثاق إليه.

توثّق هذه الصفحة السلوكَ القابل للملاحظة خارجيًّا وسطحَ واجهة برمجة التطبيقات العامّة المدعوم فقط. مسارات فضاء الأسماء الداخلية، والفئات المساعِدة، وجداول الآليات، وأسماء ملفّات كتيّبات التشغيل، وبادئات التذاكر خارج النطاق.