コンテンツにスキップ

SPI の安定性ルール

NextPDF のサービスプロバイダーインターフェイスは、セマンティックバージョニング(Semantic Versioning)に従います。各パブリックコントラクトには @stability タグと後方互換性の約束があります。このページでは、何に依存してよいかを判断できるよう、そのルールを説明します。

Terminal window
composer require nextpdf/core:^3

サービスプロバイダーインターフェイスは、NextPDF\Contracts および NextPDF\Event 名前空間に含まれるパブリックコントラクトの集合です。型は、そのソース PHPDoc に @stability タグが付いている場合にのみ、インターフェイスの一部となります。このタグが境界を定義します。タグのない型は、PHP の仕様上 public であっても内部扱いです。

NextPDF はセマンティックバージョニング(Semantic Versioning) 2.0.0 に従います。stable コントラクトに対する破壊的変更では、メジャーバージョンを上げます。新しいコントラクトや破壊的でない追加では、マイナーバージョンを上げます。バグ修正では、パッチバージョンを上げます。

各コントラクトは、3 つの安定性値のいずれかを宣言します。

タグ意味変更ルール
stable本番環境で使用可能。安全に依存可能。マイナーリリースまたはパッチリリースでの破壊的変更なし。新しいメソッドは、デフォルトの動作を伴う場合、または新しいコントラクト上でのみ追加。
experimental使用可能だが、まだ未固定。インターフェイスはマイナーリリースで変更される可能性あり。その場合は事前に非推奨を通知。
deprecated削除予定。コントラクトには、代替手段と削除バージョンを記載。

コントラクトごとの約束は、生成されたコントラクトマップに記録され、リリースごとにソースから再生成されます。約束のテキストには、そのコントラクトに適用される正確なルールが記載されています。唯一の信頼できる情報源として、コントラクトのソース PHPDoc を参照してください。

コントラクトマップには約束が記録されます。約束は 4 つのクラスに分類されます。

  1. インターフェイスの約束。 「マイナーリリースまたはパッチリリースでの破壊的変更なし。新しいメソッドはデフォルト実装を伴う場合のみ。」 ほとんどの stable インターフェイス(FontRegistryInterfaceSignerInterfaceHsmSignerInterfaceHtmlSecurityPolicyInterface を含む)に適用されます。
  2. 列挙型の約束。 「ケースの削除なし。新しいケースはマイナーバージョンで追加される場合がある。」 stable 列挙型(AlignmentOrientationOutputDestination など)に適用されます。
  3. 固定された値オブジェクトの約束。 「コンストラクターのシグネチャとパブリックプロパティは固定。新しいメソッドは追加される場合がある。」 TextPreprocessResultTextSegment などの値オブジェクト、およびそれにバインドされたイベントペイロードに適用されます。
  4. 実験的な約束。 「インターフェイスは非推奨の通知を伴ってマイナーバージョンで変更される場合がある。」 experimental コントラクト(DeferredSignerInterfaceTimestampProviderInterfaceCursorInterfaceStreamingWriterInterface など)に適用されます。

final 修飾子を持つクラス(EventDispatcherListenerProvider など)は、そのパブリックメソッドのシグネチャを固定します。final クラスを拡張する場合は、コンポジションを使用してください。サブクラス化しないでください。

CursorInterfaceStreamingWriterInterfaceexperimental です(3.1.0 以降)。NextPDF は、両方のコントラクトについて、final でテスト済みのエンジン実装を提供します。実装クラスは内部用であり、パブリックなサーフェスの一部ではありません。ストリーミングの動作は、パブリックな experimental コントラクトを通じて利用します。一般的なケースでは、コントラクトを自分で実装する必要はありません。

このコントラクトは experimental であるため、そのシグネチャはマイナーリリースで変更される可能性があり、その際は事前に非推奨の通知が行われます(実験的な約束)。本番環境で依存する前に、厳密にバージョンを固定するか、独自のアダプターでラップしてください。ストリーミングコントラクトは、固定済みの拡張ポイントではなく、安定化が進行中の拡張ポイントとして扱ってください。

このページには実行時 API はありません。関連するサーフェスは、すべてのパブリックコントラクトに付く @stability PHPDoc タグと、コントラクトごとの約束を aggregate(集約)する、再生成されたコントラクトマップです。

コントラクトに依存する前に、そのソースで安定性を確認してください。

<?php
declare(strict_types=1);
use ReflectionClass;
$doc = (new ReflectionClass(\NextPDF\Contracts\FontRegistryInterface::class))
->getDocComment();
// Look for the "@stability stable" line in the contract PHPDoc.
\assert(\is_string($doc) && \str_contains($doc, '@stability stable'));

Composer のバージョン制約はメジャーバージョンを固定します。これは stable コントラクトにおける破壊的変更の単位です。

{
"require": {
"nextpdf/core": "^3.0"
}
}

バージョンを ^3.0 に固定すると、どの stable コントラクトにも破壊的変更が入らない範囲で、マイナーリリースおよびパッチリリースを受け取れます。experimental コントラクトに依存する場合は、より厳密に固定してください。experimental コントラクトはマイナーリリースで変更される可能性があるためです。

  • 可視性ではなくタグ。 PHP の public メソッドは、その宣言元の型に @stability タグが付いていない限り、サービスプロバイダーインターフェイスの一部にはなりません。
  • 実験的コントラクトのドリフト。 experimental コントラクトはマイナーリリースで変更されることがあります。厳密にバージョンを固定するか、独自のアダプターでラップしてください。これは、ストリーミングコントラクトに実装が提供されている場合でも当てはまります。
  • 新しいデフォルトメソッド。 stable インターフェイスには、デフォルトの動作を持つメソッドが追加される場合があります。独自実装の挙動を明確に保つため、アップグレード時には新しいメソッドを実装してください。
  • エディション間の同等性。 NextPDF Pro と NextPDF Enterprise も同じルールに従います。Core で対象とするコントラクトは、同じコントラクトの Premium 実装に対しても有効なままです。

コントラクトは、定義されたライフサイクルに沿って移行します。

  1. マーク。 オーナーがソース PHPDoc に @stability deprecated を設定し、代替手段と削除バージョンを記録します。
  2. 通知。 非推奨は、それをマークするリリースの変更履歴で告知されます。
  3. 重複期間。 非推奨のコントラクトとその代替手段は、少なくとも 1 つのマイナーリリースの間、共存します。
  4. 削除。 コントラクトは、記載されたメジャーリリースで削除されます。削除がマイナーリリースやパッチリリースで行われることはありません。

コントラクトが deprecated としてマークされたら、すぐにアップグレードを計画してください。代替手段は必ず記載されます。

このページはポリシーを定義します。実行時コストはありません。

署名コントラクトは stable であり、インターフェイスの約束に従います。署名コントラクトの新しいメソッドは、デフォルトの動作を伴う場合、または新しいコントラクト上でのみ追加されるため、ハードウェアベースの実装がマイナーアップグレードで壊れることはありません。メジャーバージョンでは stable コントラクトが変更される可能性があるため、メジャーアップグレードの前に変更履歴を確認してください。

バージョニングルールはセマンティックバージョニング(Semantic Versioning) 2.0.0 に準拠します。変更履歴の生成は Conventional Commits 1.0.0 に従います。

NextPDF Pro と NextPDF Enterprise は、Core と同じサービスプロバイダーインターフェイスの安定性ルールに従います。Core で対象とするコントラクトは、そのコントラクトの Premium 実装に対しても有効なままであるため、拡張機能のコードはエディション間で移植できます。

用語集では 安定性タグ後方互換性の約束 を定義しています。それぞれの正式な定義については、公開されている用語集を参照してください。