コンテンツにスキップ
getnextpdf.com

Enterprise エディション

PHPStan

NextPDF Enterprise は、Core → Pro → Enterprise のエディション境界をまたぐ use インポートをフラグするカスタム PHPStan ルール EditionBoundaryRule を同梱しています。これは違反を報告する開発者向けの静的チェックです。インポート文を解析するものであり、コードの正しさを保証するものではありません。

この機能は NextPDF Enterprisenextpdf/enterprise)に同梱され、Enterprise ティアのライセンスエンベロープで有効化されます。これは PHPStan の構成を通じて登録されるビルド時の PHPStan ルールであり、静的解析中に実行され、実行時のパスを持ちません。ライセンスゲートは nextpdf/enterprise パッケージの境界であり、機能ごとの個別のケイパビリティコードはありません。エディションを比較してライセンスを取得する

Terminal window
composer require nextpdf/enterprise:^3

PHPStan の構成にルールを登録してください。

rules:
- NextPDF\Enterprise\PHPStan\EditionBoundaryRule

ルールは各 use 文を検査し、インポートしている名前空間を、インポートされるシンボルの名前空間プレフィックスと比較します。一方向の依存順序を強制します。

  • Core のコード(NextPDF\、ただし Pro および Enterprise のサブ名前空間を除く)は、NextPDF\Pro\* または NextPDF\Enterprise\* からインポートしてはなりません。
  • Pro のコード(NextPDF\Pro\*)は、NextPDF\Enterprise\* からインポートしてはなりません。
  • Enterprise のコード(NextPDF\Enterprise\*)は最上位ティアであり、いずれからもインポートできます。

インポートが境界をまたぐ場合、ルールは識別子 nextpdf.editionBoundaryViolation と、インポートしている名前空間、禁止されたプレフィックス、人間が読めるエディションラベルを示すメッセージとともに、エラーを報告します。チェックは純粋に静的です。解析時にインポートグラフを読み取ります。

ルールは実行時ではなく解析時に use 文について推論します。エディション境界が実行時の判断ではなくアーキテクチャ上の不変条件だからです。Core、Pro、Enterprise は別々のパッケージとして出荷されるため、下位ティアが、より小規模なインストールに存在しないシンボルに依存してはなりません。境界をまたぐインポートを静的解析の段階で捕捉することで、その誤りが出荷される前にビルドを失敗させます。代替案はより悪いものです。同じインポートは後になって、Core のみのデプロイメントで致命的なクラス欠落エラーとして表面化します。この順序は意図的に一方向であり、Core → Pro → Enterprise となっています。これはオープンコアのパッケージが互いに積み重なる様子を反映しています。Enterprise は最上位ティアであり、その下のあらゆるエディションを参照できるため、制約を受けません。

設計の背景: オープンコア、ロックインなし

クラス責務
EditionBoundaryRuleuse 文に対する PHPStan ルール。エディション境界違反を報告。

ルールは、Use_ ノードタイプに対する標準の PHPStan Rule コントラクトを実装し、nextpdf.editionBoundaryViolation 識別子のもとでエラーを発行します。

# phpstan.neon
includes:
- vendor/nextpdf/enterprise/phpstan.neon.dist
# phpstan.neon
rules:
- NextPDF\Enterprise\PHPStan\EditionBoundaryRule
parameters:
level: 9
paths:
- src

違反は PHPStan の出力に、たとえば次のように現れます。Core コード内の Enterprise インポートは、nextpdf.editionBoundaryViolation のもとで、問題のある use 行にエディション境界違反として報告されます。

  • ルールは、解析対象ファイルの名前空間と、インポートされるシンボルのプレフィックスについて推論します。NextPDF\ 以外の名前空間のコードは、このルールによる制約を受けません。
  • Enterprise の名前空間は設計上、制限されません。ルールは、Pro や Core をインポートする Enterprise ファイルをフラグすることは決してありません。
  • ルールは use 文を解析します。use なしでインラインに記述された完全修飾クラス参照は、このルールの範囲外です。境界が強制されるよう、インポートを優先してください。
  • チェックは静的かつアドバイザリーです。境界違反を報告します。プログラムがそれ以外の点で正しいことを証明するものではありません。

ルールは PHPStan の解析中に use 文ごとに実行され、文字列プレフィックスの比較を行います。そのオーバーヘッドはインポート文の数に比例し、全体の解析時間に対して無視できるほど小さいものです。

これは静的解析ルールです。ビルド時に PHPStan 内で実行され、ソース構造のみを読み取り、生成される PDF に対する実行時の影響はありません。

ルールは解析時にソースコードを処理し、ドキュメントや個人データを一切扱いません。

ルールの出力は PHPStan の診断情報です。ご自身のコード由来の名前空間とシンボル名が含まれます。解析ログは、ご自身のソースと同じ注意をもって扱ってください。

標準への適合性は主張されません。これは、下流のビルドで内部のアーキテクチャ上の制約(エディションのレイヤリング)を強制する開発者ツールルールです。

該当しません。ルールは暗号操作を実行せず、実行時のパスを持ちません。

実行時のコンポーネントではありません。ルールの目的は、アーキテクチャ上の誤り — エディション境界のインポート — を、静的解析ステージを失敗させることで出荷前に捕捉することです。

  • ルールは各 use 文を検査し、一方向の依存順序を強制します。Core は Pro または Enterprise をインポートしてはならず、Pro は Enterprise をインポートしてはならず、Enterprise はいずれもインポートできます。
  • 境界をまたぐインポートは、インポートしている名前空間と禁止されたプレフィックスとともに、nextpdf.editionBoundaryViolation 識別子のもとで報告されます。
  • NextPDF\ 以外の名前空間のコードは、このルールによる制約を受けません。
  • use なしのインラインな完全修飾クラス参照は、このルールの範囲外です。境界が強制されるよう、インポートを優先してください。

このページは、外部から観測できる挙動とサポートされるパブリック API サーフェスのみを説明します。内部の名前空間パス、ヘルパークラス、メカニズムの表、ランブックのファイル名、チケットプレフィックスは範囲外です。

NextPDF Core は、エディション境界の PHPStan ルールを同梱していません。エディションのレイヤリングを自身のビルドで強制したい Core のみの利用者は、同等のルールを自身で記述または調達する必要があります。

NextPDF Pro は、エディション境界の PHPStan ルールを同梱していません。これは nextpdf/enterprise パッケージにのみ含まれます。Pro のみのデプロイメントには、このルールを登録するための Enterprise コンポーネントがありません。Enterprise のサーフェスについては Enterprise overview を参照してください。

内部のメカニズムの詳細は、ソースリポジトリの内部ドキュメントに残されており、このマニュアルの範囲外です。

これはビルド時の静的解析ルールです。解析中に PHPStan 内で実行され、ソース構造のみを読み取り、生成される PDF やデプロイ済みのサービスに対する実行時の影響はありません。これを登録すること、そして PHPStan のレベルを選択することは、インテグレーターの責任です。

このページは開発者ツールの静的解析ルールについて説明しています。ご自身のコードについて、コンプライアンス、認証、正しさの保証は一切行いません。エディション境界のインポート違反のみを報告し、アドバイザリーです。法的助言を構成しません。ご自身のビルドが、ご自身のアーキテクチャ上または契約上の義務を満たすかどうかの判断は、ご自身の責任です。