Ir al contenido

Guía para desarrolladores de CodeIgniter

El paquete de CodeIgniter expone factorías de servicios, funciones auxiliares y un pequeño envoltorio de biblioteca Pdf para un documento. Este envoltorio resulta práctico en controladores. El trabajo en cola usa constructores invocables (callables) estáticos porque las cargas útiles de la cola de CodeIgniter son datos serializados.

Usar esta guía al diseñar flujos de controlador, servicios, constructores de cola o pruebas en torno a nextpdf/codeigniter.

CapaPropiedad deResponsabilidadNo poner aquí
ControladorAplicaciónAutorizar, llamar a un constructor o servicio, y devolver un DownloadResponse.Lógica de diseño compartida.
Envoltorio de bibliotecanextpdf/codeigniterEnvolver un Document y proporcionar funciones auxiliares response/save.Almacenamiento de documentos de larga duración.
Factoría de serviciosnextpdf/codeigniterCrear registros compartidos y documentos nuevos.Raíces de almacenamiento específicas del negocio.
Constructor de colaAplicaciónConstruir un documento a partir de una entrada invocable estática.Objetos de solicitud o estado no serializable.
Motor centralnextpdf/nextpdfConstruir y serializar el PDF.Política de respuesta o de cola de CodeIgniter.
EtapaComportamientoAcción del desarrollador
Registro de carga automáticaRegistrar::Autoload() registra la carga de funciones auxiliares para el módulo.Cargar el módulo a través de la configuración de CodeIgniter.
Resolución de serviciosServices::pdf() devuelve, de forma predeterminada, un envoltorio alrededor de un documento nuevo.Resolver una vez por solicitud.
Creación de contenidoEl código de la aplicación usa Pdf::document() para las llamadas al documento central.Mantener el código de construcción de documentos en servicios o constructores.
RespuestaPdfResponse devuelve un DownloadResponse.Dejar que el paquete establezca los encabezados del PDF.
Ejecución en colaGeneratePdfJob::process() valida el constructor y la ruta de salida, y luego guarda.Colocar los constructores de cola bajo App\PdfBuilders.
RutaPropósito
app/PdfBuilders/*Constructores estáticos seguros para la cola aceptados por GeneratePdfJob.
app/Libraries/*Envoltorios opcionales de la aplicación en torno a flujos de trabajo de documentos repetidos.
app/Services/*Recuperación de datos de dominio y política de almacenamiento.
app/Config/NextPdf.phpSustituciones de la aplicación para la configuración del paquete.
tests/app/PdfBuilders/*Pruebas de constructores y de cargas útiles de la cola.

Usar las funciones auxiliares del paquete para flujos cortos. Usar llamadas explícitas a servicios cuando la construcción del documento pertenezca a una clase que deba probarse directamente.

<?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');
}
}

Los constructores de cola deben ser estáticos, deterministas y estar ubicados bajo App\PdfBuilders. Mantener el arreglo de contexto lo bastante simple como para serializarlo y auditarlo.

<?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;
}
}

El trabajo restringe la salida al directorio de PDF configurado para la aplicación. Si la aplicación necesita almacenamiento específico por inquilino, colocar esa política en un único servicio y probarla antes del despacho a la cola.

Punto de extensiónUsoRestricción
Services::pdfDocument()Personalización de la creación de documentos.Debe devolver un documento nuevo.
Services::fontRegistry()Precalentamiento de fuentes y acceso al registro.Rechazar las rutas no seguras y mantener el registro bloqueado tras el precalentamiento.
Services::pdfSigner()Firma digital opcional.Devolver null cuando la firma esté desactivada.
NextPDF\CodeIgniter\Libraries\PdfEnvoltorio orientado al controlador.Un envoltorio se corresponde con un documento.
App\PdfBuilders::*Constructores de documentos seguros para la cola.Se requiere una cadena invocable estática.
app/Config/NextPdf.phpValores predeterminados de la aplicación y ajustes de integración.Mantener explícitos los valores de producción.
  1. Empezar con un controlador que llame a pdf() o service('pdf').
  2. Trasladar la construcción repetida de documentos a app/PdfBuilders o a un servicio de la aplicación.
  3. Usar GeneratePdfJob cuando la generación sea demasiado lenta para la ruta de la solicitud.
  4. Mantener el contexto de la cola serializable y pequeño.
  5. Almacenar la salida bajo la raíz de almacenamiento de PDF aprobada, salvo que la política se extienda deliberadamente.
  6. Añadir pruebas para las funciones auxiliares, los servicios, las cargas útiles de la cola y las rutas no seguras.
FalloDónde debe manejarseRespuesta recomendada
Extensión faltante o ruta de fuente no seguraFactoría de servicios.Fallar rápido durante la resolución del servicio.
Invocable de constructor no válidoValidación del trabajo en cola.Rechazar el trabajo y registrar la cadena del constructor sin secretos.
Ruta de salida no seguraServicio de almacenamiento y trabajo en cola.Rechazar antes del despacho y mantener la validación del trabajo.
Error de serialización de la respuestaManejo de errores del controlador o del framework.No enviar un cuerpo de respuesta parcial.
Clase Premium opcional no disponibleValor de retorno del método del servicio.Manejar null de forma explícita antes de usar las funciones opcionales de factura electrónica.
AspectoPredeterminadoCuándo sustituirlo
Espacio de nombres del constructor de colaApp\PdfBuilders.Mantener el valor predeterminado salvo que también se actualice la política de seguridad.
Raíz de salidaWRITEPATH/pdfs.Sustituirla solo con una lista de permitidos más estricta.
Nombre de archivo de la respuestadocument.pdf.Usar nombres de archivo de negocio saneados.
Métodos de transmisiónParidad de API con otros frameworks.No apoyarse en la transmisión como límite de memoria en CodeIgniter.
Servicio de documentosNuevo de forma predeterminada.No solicitar documentos compartidos en el código de la solicitud.
  • Las pruebas de servicio verifican que cada resolución de Services::pdf() devuelva un documento independiente.
  • Las pruebas de las funciones auxiliares verifican que pdf() y pdf_document() devuelvan objetos nuevos.
  • Las pruebas de respuesta verifican los encabezados y la normalización del nombre de archivo.
  • Las pruebas de cola cubren cadenas de constructor no válidas y rutas de salida no seguras.
  • Las pruebas de constructor se ejecutan con datos de contexto representativos.
  • Las pruebas de configuración cubren la ruta de fuentes, la ruta de caché, la firma desactivada y los estados con TSA desactivado.