Przejdź do głównej zawartości

Przewodnik dewelopera CodeIgniter

Pakiet CodeIgniter udostępnia fabryki usług, funkcje pomocnicze oraz niewielki komponent biblioteki Pdf, który opakowuje pojedynczy dokument w formacie Portable Document Format (PDF). Używaj komponentu opakowującego w kontrolerach. Przetwarzanie w kolejce korzysta ze statycznych konstruktorów typu callable, ponieważ ładunki kolejki CodeIgniter muszą być zserializowanymi danymi.

Skorzystaj z tego przewodnika przy projektowaniu przepływów kontrolerów, usług, konstruktorów kolejki oraz testów wokół pakietu nextpdf/codeigniter.

WarstwaWłaścicielOdpowiedzialnośćCzego tu nie umieszczać
KontrolerAplikacjaAutoryzuje, wywołuje konstruktor lub usługę i zwraca obiekt DownloadResponse.Współdzielonej logiki układu.
Komponent opakowujący bibliotekęnextpdf/codeigniterOpakowuje pojedynczy obiekt Document i udostępnia funkcje pomocnicze odpowiedzi oraz zapisu.Długotrwałego przechowywania dokumentów.
Fabryka usługnextpdf/codeigniterTworzy współdzielone rejestry i nowe dokumenty.Katalogów głównych przechowywania specyficznych dla biznesu.
Konstruktor kolejkiAplikacjaBuduje dokument na podstawie statycznego wejścia typu callable.Obiektów żądania ani stanu, których nie można zserializować.
Główny silniknextpdf/nextpdfBuduje i serializuje plik PDF.Zasad dotyczących odpowiedzi lub kolejki CodeIgniter.
EtapZachowanieDziałanie dewelopera
Rejestracja automatycznego ładowaniaRegistrar::Autoload() rejestruje ładowanie funkcji pomocniczych dla modułu.Załaduj moduł w konfiguracji CodeIgniter.
Rozwiązywanie usługServices::pdf() domyślnie zwraca komponent opakowujący wokół nowego dokumentu.Rozwiązuj usługę raz na żądanie.
TworzenieKod aplikacji używa Pdf::document() do podstawowych wywołań dokumentu.Umieszczaj kod budowania dokumentów w usługach lub konstruktorach.
OdpowiedźPdfResponse zwraca obiekt DownloadResponse.Pozwól pakietowi ustawić nagłówki PDF.
Wykonywanie kolejkiGeneratePdfJob::process() weryfikuje konstruktor i ścieżkę wyjściową, a następnie zapisuje plik.Umieszczaj konstruktory kolejki w App\PdfBuilders.
ŚcieżkaPrzeznaczenie
app/PdfBuilders/*Statyczne, bezpieczne dla kolejki konstruktory akceptowane przez GeneratePdfJob.
app/Libraries/*Opcjonalne komponenty opakowujące aplikacji dla powtarzalnych przepływów pracy z dokumentami.
app/Services/*Pobieranie danych domenowych i zasady przechowywania.
app/Config/NextPdf.phpNadpisania konfiguracji pakietu na poziomie aplikacji.
tests/app/PdfBuilders/*Testy konstruktorów i ładunków kolejki.

Korzystaj z funkcji pomocniczych pakietu w krótkich przepływach. Stosuj jawne wywołania usług, gdy budowanie dokumentu należy do klasy, którą można testować bezpośrednio.

<?php
namespace App\Controllers;
final class InvoiceController extends BaseController
{
public function download(int $id)
{
$pdf = pdf();
$pdf->document()
->setTitle('Invoice ' . $id)
->addPage()
->writeHtml('<h1>Invoice ' . $id . '</h1>');
return $pdf->download('invoice-' . $id . '.pdf');
}
}

Konstruktory kolejki powinny być statyczne, deterministyczne oraz umieszczone w App\PdfBuilders. Utrzymuj tablicę kontekstu na tyle prostą, aby można ją było zserializować i poddać audytowi.

<?php
namespace App\PdfBuilders;
use NextPDF\Core\Document;
final class InvoiceBuilder
{
public static function build(Document $document, array $context): Document
{
$document->setTitle((string) $context['title'])
->addPage()
->writeHtml((string) $context['html']);
return $document;
}
}

Zadanie ogranicza dane wyjściowe do skonfigurowanego katalogu PDF aplikacji. Jeśli aplikacja wymaga przechowywania specyficznego dla najemcy, umieść tę zasadę w jednej usłudze i przetestuj ją przed wysłaniem zadania.

Punkt rozszerzeniaZastosowanieOgraniczenie
Services::pdfDocument()Dostosowywanie tworzenia dokumentów.Musi zwrócić nowy dokument.
Services::fontRegistry()Wstępne ładowanie czcionek i dostęp do rejestru.Odrzucaj niebezpieczne ścieżki i utrzymuj rejestr zablokowany po wstępnym załadowaniu.
Services::pdfSigner()Włączanie opcjonalnego podpisu cyfrowego.Zwracaj null, gdy podpisywanie jest wyłączone.
NextPDF\CodeIgniter\Libraries\PdfOpakowywanie pracy z dokumentami po stronie kontrolera.Jeden komponent opakowujący odpowiada jednemu dokumentowi.
App\PdfBuilders::*Bezpieczne dla kolejki konstruktory dokumentów.Wymagany statyczny ciąg znaków typu callable.
app/Config/NextPdf.phpDomyślne wartości aplikacji i ustawienia integracji.Wartości produkcyjne podawaj jawnie.
  1. Zacznij od kontrolera, który wywołuje pdf() lub service('pdf').
  2. Przenieś powtarzalne budowanie dokumentów do app/PdfBuilders lub do usługi aplikacji.
  3. Używaj GeneratePdfJob, gdy generowanie jest zbyt wolne dla ścieżki żądania.
  4. Dbaj, aby kontekst kolejki był niewielki i możliwy do zserializowania.
  5. Przechowuj dane wyjściowe w zatwierdzonym głównym katalogu przechowywania PDF, chyba że celowo rozszerzysz tę zasadę.
  6. Dodaj testy dla funkcji pomocniczych, usług, ładunków kolejki oraz niebezpiecznych ścieżek.
AwariaGdzie należy to obsłużyćZalecana reakcja
Brakujące rozszerzenie lub niebezpieczna ścieżka czcionkiFabryka usług.Zgłoś awarię od razu podczas rozwiązywania usług.
Nieprawidłowy konstruktor typu callableWalidacja zadania kolejki.Odrzuć zadanie i zapisz ciąg konstruktora w logu, bez sekretów.
Niebezpieczna ścieżka wyjściowaUsługa przechowywania i zadanie kolejki.Odrzuć przed wysłaniem i utrzymaj walidację w zadaniu.
Błąd serializacji odpowiedziObsługa błędów kontrolera lub frameworka.Nie wysyłaj częściowego ciała odpowiedzi.
Niedostępna opcjonalna klasa PremiumWartość zwracana przez metodę usługi.Obsłuż null jawnie przed użyciem opcjonalnych funkcji e-faktury.
ZagadnienieWartość domyślnaKiedy nadpisać
Przestrzeń nazw konstruktorów kolejkiApp\PdfBuilders.Zachowaj wartość domyślną, chyba że zaktualizujesz również zasady bezpieczeństwa.
Główny katalog danych wyjściowychWRITEPATH/pdfs.Nadpisuj wyłącznie przy użyciu silniejszej listy dozwolonych lokalizacji.
Nazwa pliku odpowiedzidocument.pdf.Używaj oczyszczonych biznesowych nazw plików.
Metody strumienioweZgodność interfejsu programowania aplikacji (API) z innymi frameworkami.Nie traktuj strumieniowania jako granicy pamięci w CodeIgniter.
Usługa dokumentówDomyślnie nowy dokument.Nie żądaj współdzielonych dokumentów z kodu obsługującego żądanie.
  • Testy usług weryfikują, że każde rozwiązanie usługi Services::pdf() zwraca niezależny dokument.
  • Testy funkcji pomocniczych weryfikują, że pdf() oraz pdf_document() zwracają nowe obiekty.
  • Testy odpowiedzi weryfikują nagłówki i normalizację nazwy pliku.
  • Testy kolejki obejmują nieprawidłowe ciągi konstruktorów i niebezpieczne ścieżki wyjściowe.
  • Testy konstruktorów wykorzystują reprezentatywne dane kontekstowe.
  • Testy konfiguracji obejmują ścieżkę czcionek, ścieżkę pamięci podręcznej, przypadek wyłączonego podpisywania oraz przypadek wyłączonego urzędu znaczników czasu (Time-Stamp Authority, TSA).