コンテンツにスキップ

NextPDF の Laravel 統合

このハウツーでは、NextPDF を Laravel 12 アプリケーションに組み込みます。次の 6 つの段階を順に進めます。パッケージのインストール、Laravel による自動検出、設定の公開、コンテナーバインディングの resolve(解決)、HTTP レスポンスの返却、そしてキュー投入ジョブの実行です。各段階から、該当領域の詳細リファレンスを参照できます。

Terminal window
composer require nextpdf/laravel
php artisan vendor:publish --tag=nextpdf-config

Laravel は、パッケージの composer.jsonextra.laravel ブロックから、サービスプロバイダーとファサードのエイリアスを自動検出します。config/app.php を編集する必要はありません。オートロードマップは、単一の PSR-4 エントリです。PSR-4 のプレフィックスからベースディレクトリへのルール(PSR-4 §3)に従い、NextPDF\Laravel\ プレフィックスは src/Laravel/ に解決されます。このプロバイダーは遅延型で、provides() のいずれかのエントリが最初に解決されたときにブートします。検出の内部動作について詳しくは、/integrations/laravel/boot-and-discovery/ を参照してください。

ドキュメントのコントラクトは、コンテナーから解決します。バインドされた識別子は、登録済みのエントリに解決されます(PSR-11 §1.1.2)。ドキュメントのバインディングはファクトリであるため、解決するたびに新しいドキュメントが得られます。フォントレジストリとイメージレジストリはシングルトンであるため、解決するたびに同じ共有インスタンスが返されます。バインディングのライフタイムの完全な一覧は、/integrations/laravel/overview/ と /integrations/laravel/boot-and-discovery/ にあります。

resource: NextPDF\Contracts\PdfDocumentInterface
<?php
declare(strict_types=1);
use NextPDF\Contracts\PdfDocumentInterface;
$document = app(PdfDocumentInterface::class);
$document->addPage();
$document->cell(0, 10, 'Wired through the container', newLine: true);
Terminal window
php artisan vendor:publish --tag=nextpdf-config

このコマンドは config/nextpdf.php を書き込みます。各キー、その環境変数、および既定値は、/integrations/laravel/configuration/ に記載されています。

このパッケージには、プロバイダーをエンドツーエンドで検証する Testbench ベースのテストスイートが付属しています。利用側のアプリケーションに追加できる最小限のスモークテストを次に示します。

resource: tests/Unit/Laravel/NextPdfServiceProviderTest.php (pattern)
<?php
declare(strict_types=1);
namespace Tests\Feature;
use NextPDF\Contracts\FontRegistryInterface;
use NextPDF\Contracts\PdfDocumentInterface;
use NextPDF\Typography\FontRegistry;
use Tests\TestCase;
final class NextPdfIntegrationTest extends TestCase
{
public function test_document_is_factory_bound(): void
{
$a = app(PdfDocumentInterface::class);
$b = app(PdfDocumentInterface::class);
self::assertNotSame($a, $b);
}
public function test_font_registry_is_singleton_and_locked(): void
{
$registry = app(FontRegistryInterface::class);
self::assertInstanceOf(FontRegistry::class, $registry);
self::assertTrue($registry->isLocked());
}
}

これら 2 つのアサーションは、パッケージ自体の EInvoiceServiceProviderIntegrationTest にある一度限りの適合性チェックを反映したものです。ドキュメントがファクトリとしてバインドされていること、およびフォントレジストリがロックされたシングルトンであることを確認します。

エントリポイント目的リファレンス
NextPDF\Laravel\Facades\Pdf新しいドキュメントに対する静的プロキシクイックスタート: /integrations/laravel/quickstart/
app(NextPDF\Contracts\PdfDocumentInterface::class)コンテナーから解決されたドキュメント本番運用ガイド: /integrations/laravel/production-usage/
NextPDF\Laravel\Http\PdfResponseインライン / ダウンロード / ストリーム配信の HTTP レスポンスセキュリティと運用: /integrations/laravel/security-and-operations/
NextPDF\Laravel\Jobs\GeneratePdfJobキュー投入による生成本番運用ガイド: /integrations/laravel/production-usage/

依存性注入で組み込み、エラー処理を施したコントローラーの全体は、/integrations/laravel/production-usage/ に記載されています。成功時と失敗時のコールバックを含むキュー投入ジョブも同じページに記載されています。

  • 解決するのは PdfDocumentInterface であり、具象クラスの Document ではありません。これにより、バインディングはテスト可能で差し替え可能な状態に保たれます。
  • SignerInterfaceTsaClient は、設定するまで null に解決されます。必ず null チェックを行ってください。
  • e-invoice のコントラクトには nextpdf/premium が必要です。コントラクト自体はバインドされていますが、これがないと最初の解決時にエラーになります。

プロバイダーは遅延型であるため、エンドツーエンドで組み込んでもブートコストは増加しません。最初の解決時の構築コストとフォントのウォームアップコストについては、/integrations/laravel/boot-and-discovery/ で説明しています。

PdfResponse は、固定の OWASP ヘッダーセットを適用します。GeneratePdfJob は、ワーカー上で出力パスを検証します。脅威モデルは、/integrations/laravel/security-and-operations/ にあります。

主張出典条項リファレンス ID
バインドされた識別子が登録済みのエントリに解決されるPSR-11 コンテナー§1.1.2
PSR-4 のプレフィックスがベースディレクトリにマッピングされるPSR-4 オートローダー§3

nextpdf/premium がインストールされている場合、署名、PDF/A、e-invoice のコントラクトは同じプロバイダーを通じて統合されます。これは任意の Enterprise 機能です。ここで説明している Core パッケージでは、これを採用するためにコードを変更する必要はありません。https://nextpdf.dev/get-license/?intent=laravel-signing を参照してください。

  • /integrations/laravel/overview/ — アーキテクチャとバインディング一覧
  • /integrations/laravel/install/ — インストールとオプションの拡張機能
  • /integrations/laravel/quickstart/ — 最初の実行可能な例
  • /integrations/laravel/production-usage/ — DI、エラー処理、キュー
  • /integrations/laravel/boot-and-discovery/ — 検出とライフタイム