es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Laravel 8 descargar PDF con Livewire

En mi página estoy creando una factura que es totalmente compatible con Livewire. Utilizo este paquete: https://github.com/LaravelDaily/laravel-invoices para generar mi factura y todo funciona bien. Pero me encontré con un problema. No puedo descargar mi PDF con Livewire.

Aquí hay un ejemplo básico para generar un PDF y descargarlo:

public function invoice() 
{
    $customer = new Buyer([
        'name'          => 'John Doe',
        'custom_fields' => [
            'email' => 'test@example.com',
        ],
    ]);

$item = (new InvoiceItem())->title('Servicio 1')->pricePerUnit(2);

$invoice = Invoice::make()
    ->buyer($customer)
    ->discountByPercent(10)
    ->taxRate(15)
    ->shipping(1.99)
    ->addItem($item);

return $invoice->download();
}

Cuando hago clic en un botón

<a role="button" class="pdf-download cursor-pointer" wire:click="invoice">descargar</a>

No sucede nada. Entonces, el problema es que Livewire no admite este método de descarga. Y este método de descarga se ve así:

public function download()
{
    $this->render();

    return new Response($this->output, Response::HTTP_OK, [
        'Content-Type'        => 'application/pdf',
        'Content-Disposition' => 'attachment; filename="' . $this->filename . '"',
        'Content-Length'      => strlen($this->output),
    ]);
}

$this->render(); Renderiza una plantilla en una carpeta específica

¿Hay una solución alternativa para esto? ¿Dónde puedo descargar mi pdf con una plantilla o tal vez una estrategia diferente? Ya intenté una cosa. Almacené la factura en una sesión, así:

Session::put('invoice', $invoice);
Session::save();

Y en un controlador diferente tengo:

if ($invoice = Session::get('invoice')) {
    $invoice->download();
}

Pero eso me da este error:

la serialización de ‘closure’ no está permitida

Intenté algunas cosas que encontré aquí: https://github.com/livewire/livewire/issues/483
Pero nada funciona. ¿Alguien puede darme una dirección sobre dónde buscar o cómo solucionar esto? ¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución alternativa para la descarga de PDF compatible con Livewire

    Al utilizar el paquete de facturas de Laravel Daily en Livewire, es posible que encuentres algunas dificultades al intentar descargar la factura como PDF. Esto se debe a que Livewire no admite el método download() del paquete, que envía el PDF como respuesta al navegador.

    Una solución alternativa consiste en almacenar la factura generada en la sesión y luego descargarla desde un controlador diferente. Sin embargo, este enfoque puede generar un error de “serialización de cierre no permitida”.

    Para solucionar este error, puedes intentar lo siguiente:

    1. En lugar de almacenar el objeto completo de la factura en la sesión, simplemente almacena los datos necesarios para generar el PDF. Por ejemplo:
    Session::put('datosFactura', [
        'comprador' => [
            'nombre' => 'John Doe',
            'campos_personalizados' => [
                'email' => 'test@example.com',
            ],
        ],
        'ítem' => [
            'título' => 'Servicio 1',
            'precio_por_unidad' => 2,
        ],
    ]);
    Session::save();
    
    1. En el controlador que descarga el PDF, recupera los datos de la factura de la sesión y construye el objeto de la factura:
    use App\Models\Comprador;
    use App\Models\ÍtemFactura;
    use App\Models\Factura;
    
    public function descargarFactura()
    {
        $datosFactura = Session::get('datosFactura');
    
        $cliente = new Comprador($datosFactura['comprador']);
    
        $ítem = (new ÍtemFactura())
            ->título($datosFactura['ítem']['título'])
            ->precioPorUnidad($datosFactura['ítem']['precio_por_unidad']);
    
        $factura = Factura::make()
            ->comprador($cliente)
            ->descuentoPorcentaje(10)
            ->tarifaImpuesto(15)
            ->envío(1.99)
            ->agregarÍtem($ítem);
    
        return new \Response($factura->stream(), 200, [
            'Content-Type' => 'application/pdf',
            'Content-Disposition' => 'attachment; filename="factura.pdf"',
        ]);
    }
    
    1. En Livewire, llama al método descargarFactura() mediante una solicitud AJAX:
    <a role="button" class="pdf-download cursor-pointer" wire:click.prevent="descargarFactura">Descargar</a>
    
    public function descargarFactura()
    {
        return redirect()->to('/descargar-factura');
    }
    
    1. Asigna la URL /descargar-factura al método de controlador descargarFactura():
    Route::get('/descargar-factura', [ControladorFactura::class, 'descargarFactura']);
    

    Este enfoque implica más pasos, pero debería permitirte descargar un PDF compatible con Livewire.

Comments are closed.