Lewati ke konten

Boot dan penemuan NextPDF Cloudflare

Jembatan ini tidak menyertakan penyedia layanan, bundle, atau hook penemuan otomatis sendiri. Jembatan ini adalah sekumpulan kelas final dengan konstruktor eksplisit. Di sini, “penemuan” berarti memilih kolaborator yang akan diinjeksikan dan mengikatnya di dalam container framework Anda. Halaman ini menjelaskan proses pengikatan tersebut. Halaman ini tidak menambahkan mekanisme registrasi yang memang tidak dimiliki paket ini.

Anda membuat CloudflareHtmlRenderer; Anda tidak menemukannya. Dependensinya adalah kontrak PHP Standard Recommendation (PSR): PSR-18, PSR-17, dan PSR-3, ditambah tipe config dan kontrak milik paket itu sendiri. Framework apa pun yang dapat membangun kolaborator tersebut dapat membangun renderer ini. Paket ini hanya bergantung pada kontrak PSR; pengujian tests/Unit/Architecture/PsrConformanceTest.php menegaskan bahwa tidak ada klien konkret yang terikat ke renderer. Aplikasi host Anda dapat menggunakan kembali binding klien HTTP yang sudah ada tanpa perubahan. Adapter NextPDF untuk Laravel, Symfony, dan CodeIgniter menggunakan kembali binding PSR-18 yang sama. Paket ini tidak menambahkan paket framework sendiri.

Resolusikan kolaborator dalam urutan ini, sesuai dengan konstruktor CloudflareHtmlRenderer:

  1. Resolusikan ClientInterface PSR-18 dari binding klien HTTP yang sudah ada di aplikasi.
  2. Resolusikan RequestFactoryInterface dan StreamFactoryInterface PSR-17; resolusikan juga ResponseFactoryInterface bila Anda menginginkan transport cURL yang dipatok.
  3. Bangun sebuah CloudflareRendererConfig dari hasil resolusi konfigurasi (lihat “Urutan resolusi konfigurasi”).
  4. Secara opsional, resolusikan LoggerInterface PSR-3, sebuah LocalRendererFactoryInterface, dan sebuah HtmlSecurityPolicyInterface yang eksplisit.
  5. Buat CloudflareHtmlRenderer dengan kolaborator tersebut.

Tidak ada langkah di atas yang menghubungi jaringan. Interaksi jaringan pertama terjadi ketika Anda memanggil render() atau isAvailable().

Contoh binding yang representatif (pseudokode yang agnostik terhadap framework):

<?php
declare(strict_types=1);
use NextPDF\Cloudflare\CloudflareHtmlRenderer;
use NextPDF\Cloudflare\CloudflareRendererConfig;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Log\LoggerInterface;
$container->singleton(CloudflareHtmlRenderer::class, function ($c) {
return new CloudflareHtmlRenderer(
config: CloudflareRendererConfig::fromArray($c->get('config')['cloudflare']),
httpClient: $c->get(ClientInterface::class),
requestFactory: $c->get(RequestFactoryInterface::class),
streamFactory: $c->get(StreamFactoryInterface::class),
logger: $c->get(LoggerInterface::class),
responseFactory: $c->get(ResponseFactoryInterface::class),
);
});

Paket ini tidak membaca variabel lingkungan sendiri. Paket ini menerima sebuah CloudflareRendererConfig yang sudah terbentuk lengkap. Di aplikasi host, resolusikan konfigurasi dalam urutan ini: variabel lingkungan terlebih dahulu, lalu config yang dipublikasikan atau config framework, kemudian nilai standar paket yang tertanam di dalam konstruktor (didokumentasikan di /integrations/cloudflare/configuration/). CloudflareRendererConfig::fromArray() menerapkan nilai standar konstruktor untuk setiap kunci yang tidak ada atau bertipe keliru, sehingga array config parsial kembali ke nilai bawaan secara terprediksi, alih-alih gagal.

CloudflareRendererConfig::isValid() adalah sinyal pada saat boot. Ini adalah pemeriksaan murni bahwa workerUrl dan apiToken sama-sama tidak kosong dan tidak melakukan panggilan jaringan, sehingga Anda dapat menggunakannya sebagai gerbang deploy. Sinyal saat runtime adalah CloudflareHtmlRenderer::isAvailable(), yaitu HEAD HTTP terautentikasi yang mengembalikan true untuk status di bawah 500; untuk selain itu, ia mengembalikan false (tidak pernah melempar eksepsi), sehingga Anda dapat menggunakannya sebagai probe kesiapan. Probe yang lolos adalah petunjuk, bukan jaminan: POST berikutnya tetap dapat gagal.

  • /integrations/cloudflare/integration/ — panduan integrasi lengkap.
  • /integrations/cloudflare/overview/ — apa itu jembatan ini dan batas mana yang dilintasinya.
  • /integrations/cloudflare/configuration/ — setiap field dan nilai standar.
  • /integrations/cloudflare/security-and-operations/ — kapan transport yang dipatok diaktifkan.