NextPDF CodeIgniter のブートとディスカバリー
CodeIgniter 4 は Composer のパッケージディスカバリーを通じて、このパッケージの Services クラス、ヘルパー関数、レジストラーを自動的に検出します。このページでは、その正確なシーケンスと、それを制御する構成について説明します。
CodeIgniter の Services ディスカバリーの仕組み
「CodeIgniter の Services ディスカバリーの仕組み」という見出しのセクションCodeIgniter 4 は、ディスカバーされたすべての Config\Services クラスをスキャンし、要求されたサービス名と一致する静的メソッドを探してサービスを resolve(解決)します。そのため、アプリケーションが service('pdf') を呼び出すと、フレームワークは最初にディスカバーされた Services クラスの中から、pdf メソッドを宣言しているものを見つけて呼び出します。
ディスカバリーは Config\Modules によって制御されます。
$enabled— 自動ディスカバリーのメインスイッチです。デフォルトはtrueです。$discoverInComposer— ディスカバリー対象を Composer パッケージ全体に広げます。デフォルトはtrueです。このフラグにより、フレームワークはnextpdf/codeigniterを検出できるようになります。$composerPackages— Composer パッケージ群に適用する任意のonly/excludeフィルターです。$aliases— ディスカバリー対象となる要素の種類です。フレームワークのデフォルトにはservicesとregistrarsが含まれており、このパッケージはどちらも使用します。
パッケージクラスは NextPDF\CodeIgniter\Config\Services です。Composer は PSR-4 プレフィックス NextPDF\CodeIgniter\ を src/CodeIgniter/ にマッピングします。完全修飾クラス名にはトップレベルの名前空間が必須です(PSR-4 §x1.x2.p5、modal MUST)。名前空間プレフィックスはベースディレクトリにマッピングされるため、クラスは対応するファイルに解決されます(PSR-4 §x1.x3)。
ブートシーケンス
「ブートシーケンス」という見出しのセクション- Composer オートロード。 Composer は PSR-4 マップと
filesオートロードエントリを登録します。ヘルパーファイルsrc/CodeIgniter/Helpers/pdf_helper.phpはここで読み込まれます。 - フレームワークのブートストラップ。 CodeIgniter は
Config\Modulesを読み込みます。ディスカバリーが有効な場合、Composer パッケージ全体からディスカバーされた要素のリストを構築します。 - レジストラーのディスカバリー。 フレームワークは
Registrarクラスを収集します。このパッケージのRegistrar::Autoload()は、pdfヘルパーを CodeIgniter のヘルパーローダーに通知します。 - 初回呼び出し時のサービス解決。 サービスファクトリーは遅延評価されます。最初の
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() でそのキャッシュをクリアし、このパッケージの機能テストはケース間でそのリセットが行われることに依存しています。
構成の解決順序
「構成の解決順序」という見出しのセクション有効な構成は、次の順序で解決されます。
- パッケージデフォルト(
NextPDF\CodeIgniter\Config\NextPdf内)。 - パッケージクラスを拡張するアプリケーションクラス
Config\NextPdf(存在する場合)。CodeIgniter はパッケージデフォルトではなく、そのクラスを読み込みます。 - 環境オーバーライドは
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/ — ディスカバリーの障害モード。