コンテンツにスキップ

NextPDF CodeIgniter のブートとディスカバリー

CodeIgniter 4 は Composer のパッケージディスカバリーを通じて、このパッケージの Services クラス、ヘルパー関数、レジストラーを自動的に検出します。このページでは、その正確なシーケンスと、それを制御する構成について説明します。

CodeIgniter 4 は、ディスカバーされたすべての Config\Services クラスをスキャンし、要求されたサービス名と一致する静的メソッドを探してサービスを resolve(解決)します。そのため、アプリケーションが service('pdf') を呼び出すと、フレームワークは最初にディスカバーされた Services クラスの中から、pdf メソッドを宣言しているものを見つけて呼び出します。

ディスカバリーは Config\Modules によって制御されます。

  • $enabled — 自動ディスカバリーのメインスイッチです。デフォルトは true です。
  • $discoverInComposer — ディスカバリー対象を Composer パッケージ全体に広げます。デフォルトは true です。このフラグにより、フレームワークは nextpdf/codeigniter を検出できるようになります。
  • $composerPackages — Composer パッケージ群に適用する任意の only / exclude フィルターです。
  • $aliases — ディスカバリー対象となる要素の種類です。フレームワークのデフォルトには servicesregistrars が含まれており、このパッケージはどちらも使用します。

パッケージクラスは NextPDF\CodeIgniter\Config\Services です。Composer は PSR-4 プレフィックス NextPDF\CodeIgniter\src/CodeIgniter/ にマッピングします。完全修飾クラス名にはトップレベルの名前空間が必須です(PSR-4 §x1.x2.p5、modal MUST)。名前空間プレフィックスはベースディレクトリにマッピングされるため、クラスは対応するファイルに解決されます(PSR-4 §x1.x3)。

  1. Composer オートロード。 Composer は PSR-4 マップと files オートロードエントリを登録します。ヘルパーファイル src/CodeIgniter/Helpers/pdf_helper.php はここで読み込まれます。
  2. フレームワークのブートストラップ。 CodeIgniter は Config\Modules を読み込みます。ディスカバリーが有効な場合、Composer パッケージ全体からディスカバーされた要素のリストを構築します。
  3. レジストラーのディスカバリー。 フレームワークは Registrar クラスを収集します。このパッケージの Registrar::Autoload() は、pdf ヘルパーを CodeIgniter のヘルパーローダーに通知します。
  4. 初回呼び出し時のサービス解決。 サービスファクトリーは遅延評価されます。最初の service('pdf') または Services::pdf() 呼び出しでファクトリーが実行されます。共有サービスは、プロセス中ロケーターにキャッシュされます。

CodeIgniter 4 には PSR-11 コンテナーがありません。「バインディング」とは、Services クラス上の静的ファクトリーメソッドのことです。各メソッドは bool $getShared パラメーターを受け取ります。

サービスデフォルトで共有備考
fontRegistryはいウォームアップ後にロックされます。
imageRegistryはい上限付きの LRU キャッシュです。
documentFactoryはいステートレスです。
pdfDocumentいいえ呼び出しごとに新規生成されます。
pdfいいえ呼び出しごとに新規生成されます。
tsaClientはいTSA URL がない場合は null です。
pdfSignerいいえ署名が無効の場合は null です。

共有インスタンスは、プロセス中 CodeIgniter の BaseService インスタンスキャッシュに保持されます。フレームワークのテストハーネスは BaseService::reset() でそのキャッシュをクリアし、このパッケージの機能テストはケース間でそのリセットが行われることに依存しています。

有効な構成は、次の順序で解決されます。

  1. パッケージデフォルト(NextPDF\CodeIgniter\Config\NextPdf 内)。
  2. パッケージクラスを拡張するアプリケーションクラス Config\NextPdf(存在する場合)。CodeIgniter はパッケージデフォルトではなく、そのクラスを読み込みます。
  3. 環境オーバーライドは BaseConfig によって適用され、小文字の短いクラス名 nextpdf をキーにします(ドット区切りのネストされたキー、または完全修飾クラス形式)。

アプリケーションの構成拡張ファイルはクラスを 1 つ宣言するだけで、副作用を発生させません。これにより、ファイルはシンボルを宣言するか、副作用のあるロジックを実行するかのどちらかであり、両方は行わないという PSR-1 の想定(PSR-1 §x1.x1.p3)に沿った状態が保たれます。ヘルパーファイルは、意図的に副作用を持たせた対になる存在です。このファイルはグローバルな pdf() 関数と pdf_document() 関数を宣言し、それぞれが function_exists チェックで保護されているため、二重ロードが発生しても安全です。

  • composer dump-autoload — アップグレード後に PSR-4 マップと files オートロードリストを再構築します。
  • ディスカバリーを最も手早く確認する方法は、Services::pdfDocument(false) を呼び出して Document が返されることをアサートするコントローラーです。
  • ヘルパーファイルが登録されていることを確認するには、vendor/composer/autoload_files.php を調べます。
  • 障害と原因の対応関係については、/integrations/codeigniter/troubleshooting/ を参照してください。
  • 完全修飾クラス名には、トップレベルの名前空間が必要です(PSR-4 Autoloader §x1.x2.p5)。
  • 名前空間プレフィックスからベースディレクトリへのクラスパスのマッピング(PSR-4 Autoloader §x1.x3)。
  • ファイルはシンボルを宣言するか副作用を引き起こすかのどちらかである — ヘルパーファイルの設計(PSR-1 Basic Coding Standard §x1.x1.p3)。
  • /integrations/codeigniter/integration/ — 配線リファレンスとスモークテスト。
  • /integrations/codeigniter/install/ — インストールとディスカバリーの検証。
  • /integrations/codeigniter/overview/ — API サーフェス全体。
  • /integrations/codeigniter/troubleshooting/ — ディスカバリーの障害モード。