Risoluzione dei problemi di NextPDF in CodeIgniter 4
In breve
Sezione intitolata “In breve”Ogni sintomo descritto di seguito rimanda a una causa verificata nel sorgente del pacchetto o del framework ed è accompagnato da una soluzione concreta.
Discovery e risoluzione
Sezione intitolata “Discovery e risoluzione”Services::pdfDocument() restituisce null
Sezione intitolata “Services::pdfDocument() restituisce null”Per risolvere un servizio, CodeIgniter analizza le classi Config\Services rilevate e cerca un metodo corrispondente. Un valore di ritorno null indica che il framework non ha mai rilevato la classe Services del pacchetto.
Le cause e le relative soluzioni:
- Auto-discovery disabilitato. L’applicazione host potrebbe impostare
Config\Modules::$discoverInComposer = false. In tal caso, aggiungerenextpdf/codeignitera$composerPackages['only']. La discovery analizza i pacchetti Composer solo quando questo flag ètrue. - L’autoloader non è aggiornato. Composer mappa il prefisso del namespace
NextPDF\CodeIgniter\alla directory di base corrispondente. Una classmap non aggiornata nasconde la classe (PSR-4 §x1.x3). Eseguirecomposer dump-autoload. - L’elenco
$aliasesè stato ristretto. La discovery viene eseguita solo per le voci presenti inConfig\Modules::$aliases. Il pacchetto richiedeservicese, per gli helper, ancheregistrars. Ripristinare entrambe le voci.
pdf() o pdf_document() non risultano definite
Sezione intitolata “pdf() o pdf_document() non risultano definite”Gli helper vengono registrati attraverso due percorsi: la voce di autoload Composer files del pacchetto e il Registrar del pacchetto. Un errore di funzione non definita indica che la voce files non è stata caricata.
- Eseguire
composer dump-autoloadper ricostruire l’elenco di autoloadfiles. - Verificare che
nextpdf/codeignitercompaia invendor/composer/autoload_files.php. - In alternativa, chiamare direttamente
Services::pdf(false)oServices::pdfDocument(false). Gli helper sono semplici wrapper di queste chiamate.
Configurazione
Sezione intitolata “Configurazione”.env: gli override vengono ignorati
Sezione intitolata “.env: gli override vengono ignorati”Per applicare un override, BaseConfig usa come prefisso il nome breve della classe in minuscolo. La classe è NextPdf, quindi il prefisso è nextpdf. Non è nextPdf e non è NextPdf.
- Usare
nextpdf.fontsPath, nonnextPdf.fontsPath. - Indirizzare una chiave annidata con un punto:
nextpdf.signature.certificate. - Funziona anche la forma completa
NextPDF\CodeIgniter\Config\NextPdf.fontsPath.
Un intero array di configurazione torna ai valori predefiniti
Sezione intitolata “Un intero array di configurazione torna ai valori predefiniti”Quando si estende la classe NextPdf e si assegna un array parziale, l’intero array viene sostituito. Fornire quindi ogni chiave dell’array di cui si esegue l’override. Per un esempio con array completo, vedere /integrations/codeigniter/configuration/.
Errori di runtime
Sezione intitolata “Errori di runtime”RuntimeException: NextPDF requires the ext-… PHP extension
Sezione intitolata “RuntimeException: NextPDF requires the ext-… PHP extension”Il registro dei font convalida mbstring e zlib una volta per processo. Genera questo errore indicando il nome dell’estensione mancante. Installare o abilitare l’estensione indicata nel runtime PHP. Quindi riavviare il worker o il pool PHP-FPM.
RuntimeException: NextPdf fontsPath contains invalid characters
Sezione intitolata “RuntimeException: NextPdf fontsPath contains invalid characters”Il registro dei font rifiuta un fontsPath che contiene uno stream wrapper (://) o un byte null. Impostare fontsPath su un percorso semplice del filesystem. Non impostarlo su un percorso php://, phar:// o su un percorso analogo con wrapper.
Problemi di risposta
Sezione intitolata “Problemi di risposta”Il nome del file nel download appare errato
Sezione intitolata “Il nome del file nel download appare errato”PdfResponse sanifica i nomi dei file. Il comportamento verificato è questo:
- Un nome di file vuoto o composto solo da spazi diventa
document.pdf. - A un nome privo di estensione
.pdf(o.PDF) viene aggiunta.pdf. Un’estensione.PDFgià presente viene conservata invariata. - Un nome non ASCII produce un fallback ASCII e un parametro RFC 5987
filename*=UTF-8''…, in modo che i browser moderni mostrino il nome originale. Questo comportamento è previsto, non è un bug. - I separatori di percorso, i byte null e i caratteri CR/LF vengono rimossi.
Intestazioni di sicurezza mancanti nella risposta
Sezione intitolata “Intestazioni di sicurezza mancanti nella risposta”Ogni risposta PdfResponse include X-Content-Type-Options, X-Frame-Options, Content-Security-Policy, X-Robots-Tag e Referrer-Policy. Se il client non le riceve, un proxy o l’applicazione le sta rimuovendo o sovrascrivendo a valle. Esaminare la risposta sia prima sia dopo il reverse proxy.
QueueException durante l’accodamento del job
Sezione intitolata “QueueException durante l’accodamento del job”La coda confronta il nome del job accodato con le chiavi di Config\Queue::$jobHandlers e rifiuta qualsiasi nome non registrato. Registrare il job con una chiave nominale, quindi accodare quel nome:
public array $jobHandlers = ['generate-pdf' => GeneratePdfJob::class];
// dispatch\service('queue')->push('pdf-queue', 'generate-pdf', [...]);L’inserimento di GeneratePdfJob::class come nome del job non riesce. Il secondo argomento è una chiave nominale, non una stringa di classe.
InvalidArgumentException generata dal job
Sezione intitolata “InvalidArgumentException generata dal job”Il job convalida il proprio payload prima di eseguire qualsiasi operazione. I casi verificati in cui il payload viene rifiutato, con i relativi messaggi, sono i seguenti:
| Causa | Frammento del messaggio |
|---|---|
builder mancante, vuoto o non una stringa | non-empty static callable string |
builder esterno a App\PdfBuilders | not allowed |
builder corrisponde al pattern ma non è callable | not a valid callable |
outputPath mancante o vuoto | non-empty string |
outputPath esterno a WRITEPATH/pdfs/ | outside of allowed directory |
outputPath che non termina con .pdf | must end with .pdf |
Correggere il payload in modo che il builder sia un callable statico App\PdfBuilders\<Class>::<method>. Assicurarsi che il percorso di output venga risolto all’interno di WRITEPATH/pdfs/ con un’estensione .pdf.
class … BaseJob not found
Sezione intitolata “class … BaseJob not found”codeigniter4/queue è una dipendenza del pacchetto destinata esclusivamente allo sviluppo. L’applicazione che esegue i worker deve dichiararla direttamente:
composer require codeigniter4/queueDiagnostica
Sezione intitolata “Diagnostica”composer show nextpdf/codeigniter— conferma che il pacchetto sia stato risolto.composer dump-autoload— ricostruisce la discovery e l’autoload degli helper.php spark routes— conferma che le route PDF siano registrate.- Il controllo più rapido per la discovery è un controller che chiama
Services::pdfDocument(false)e verifica che il risultato sia unDocument.
Conformità
Sezione intitolata “Conformità”- Mappatura da classe a percorso — rilevante per gli errori di discovery (PSR-4 Autoloader §x1.x3).
Vedere anche
Sezione intitolata “Vedere anche”- /integrations/codeigniter/install/ — requisiti della discovery.
- /integrations/codeigniter/configuration/ — prefisso
.enve regola di override dell’array. - /integrations/codeigniter/production-usage/ — registrazione corretta della coda.
- /integrations/codeigniter/boot-and-discovery/ — sequenza di discovery.