majorsilence/reporting
Genera informes RDL en PDF, Excel, CSV y más desde PHP — vía subproceso, un binario AOT, o FFI de PHP en proceso. PHP 8.1+. Sin dependencias de Composer en tiempo de ejecución.
Instalación
Instala vía Composer (se requiere PHP 8.1+):
composer require majorsilence/reporting
O clona el repositorio e incluye el autoloader manualmente:
require_once __DIR__ . '/vendor/autoload.php';
Sin dependencias de Composer en tiempo de ejecución. El modo nativo FFI requiere además ext-ffi y ffi.enable=true en php.ini.
Modos de integración
| Clase | Mecanismo | Requisito |
|---|---|---|
| Report | Lanza dotnet RdlCmd.dll vía proc_open. | Runtime de .NET en el servidor. |
| ReportAot | Lanza un binario RdlCmd autocontenido compilado con AOT vía proc_open. | Binario AOT desplegado junto a la aplicación. No se necesita runtime de .NET. |
| ReportNative | Carga librdlnative.so en el proceso mediante FFI de PHP. Usa RdlLibrary::load() para obtener la instancia FFI. | ext-ffi, ffi.enable=true, y la biblioteca nativa en LD_LIBRARY_PATH. |
Report — subproceso (dotnet)
use MajorsilenceReporting\Report; $rpt = new Report( '/path/to/report.rdl', '/path/to/RdlCmd.dll' ); $rpt->set_connection_string('Data Source=/path/to/data.db'); $rpt->set_parameter('StartDate', '2026-01-01'); // Guardar en disco $rpt->export('pdf', '/tmp/output.pdf'); // O transmitir al navegador $data = $rpt->export_to_memory('pdf'); header('Content-Type: application/pdf'); header('Content-Disposition: inline; filename="report.pdf"'); echo $data;
ReportAot — binario AOT
Misma API que Report, pero apunta a un binario autocontenido. No se necesita runtime de .NET. También habilita formatos de exportación adicionales (xlsx_table, tifb, mht).
use MajorsilenceReporting\ReportAot; $rpt = new ReportAot( '/path/to/report.rdl', '/path/to/RdlCmd' // binario autocontenido ); $rpt->set_connection_string('Data Source=/path/to/data.db'); $data = $rpt->export_to_memory('xlsx_table'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); echo $data;
ReportNative — PHP FFI
Carga librdlnative.so directamente en el proceso de PHP mediante FFI. No se genera ningún proceso hijo. Requiere ext-ffi y ffi.enable=true.
use MajorsilenceReporting\ReportNative; use MajorsilenceReporting\RdlLibrary; // Cargar la biblioteca nativa una sola vez. Define RDLNATIVE_LIB_DIR automáticamente. $lib = RdlLibrary::load('/path/to/librdlnative.so'); $rpt = new ReportNative($lib, '/path/to/report.rdl'); $rpt->set_connection_string('Data Source=/path/to/data.db'); $data = $rpt->export_to_memory('pdf'); header('Content-Type: application/pdf'); echo $data;
extension=ffi y ffi.enable=true en php.ini. El directorio de la biblioteca nativa debe estar en LD_LIBRARY_PATH antes de que arranque PHP — RdlLibrary::load() define RDLNATIVE_LIB_DIR pero no puede actualizar retroactivamente LD_LIBRARY_PATH para el proceso en curso.
API principal
Las tres clases comparten la misma interfaz (espacio de nombres PSR-4 MajorsilenceReporting\):
| Método | Descripción |
|---|---|
| set_connection_string(string $cs) | Establece la cadena de conexión a la base de datos. Llamar antes de export. |
| set_parameter(string $name, string $value) | Define un parámetro de informe con nombre. Se puede llamar tantas veces como sea necesario. |
| export(string $type, string $path) | Renderiza el informe y escribe la salida en $path en disco. |
| export_to_memory(string $type): string | Renderiza y devuelve la salida como una cadena binaria (para PDF, TIFF, RTF, XLSX) o una cadena UTF-8 (para CSV, XML, HTML). |
Conjuntos de datos en memoria
ReportNative permite suministrar datos completamente en memoria mediante add_data() — sin necesidad de conexión a una base de datos. Pasa un nombre de conjunto de datos y un array de arrays asociativos donde cada valor es una cadena.
$rpt->add_data('SalesData', [ ['Product' => 'PDF Library Pro', 'Revenue' => '1200.00', 'Units' => '3'], ['Product' => 'Report Designer', 'Revenue' => '250.00', 'Units' => '1'], ['Product' => 'Support (12 mo.)', 'Revenue' => '500.00', 'Units' => '1'], ]); $data = $rpt->export_to_memory('pdf');
add_data() solo está disponible en ReportNative, no en Report ni ReportAot. El nombre del conjunto de datos debe coincidir con un conjunto de datos definido en el archivo .rdl. Todos los valores de campo deben ser cadenas.
Formatos de exportación
| Cadena de formato | Salida | Disponible en |
|---|---|---|
pdf | Todos los modos | |
csv | Texto CSV | Todos los modos |
xlsx | Libro de Excel | Todos los modos |
xml | Datos XML | Todos los modos |
rtf | Rich Text Format | Todos los modos |
tif | Imagen TIFF (color) | Todos los modos |
html | HTML | Todos los modos |
xlsx_table | Excel (estilo tabla) | Solo ReportAot + ReportNative |
tifb | Imagen TIFF (blanco y negro) | Solo ReportAot + ReportNative |
mht | Archivo web MHTML | Solo ReportAot + ReportNative |