【问题标题】:Laravel 5.1 Download PDF with EventLaravel 5.1 下载带有事件的 PDF
【发布时间】:2015-09-07 12:41:27
【问题描述】:

我的 Event 初始控制器代码是:

try {
            $sales = $this->sales->create([
                'customer_id'       =>  $customer->id,
                'sales_details' =>  json_encode($vData),
                'total_price'       =>  ((int)$data['q-rfh'] * (int)$data['p-rfh']) + ((int)$data['q-rfh-spro'] * (int)$data['p-rfh-spro']),
                'created_by'        =>  $user->username,
            ]);

            \Event::fire('print.invoice', $sales);

            return \Response::json([
                'type'      =>  'success',
                'message'   =>  'Success creating sales!',
            ]);
        }
        catch (\Exception $e) {
            return \Response::json([
                'type'      =>  'danger',
                'message'   =>  $e->getMessage(),
            ]);
        }

我需要使用事件打印发票,因为我需要使用 ajax 返回响应以让用户知道销售已经成功。

事件代码就这么简单:

public function handle(SalesModel $sales) {
        if ($sales) {
            $data = [
                'sales' =>  $sales,
            ];

            $pdf = \PDF::loadView('invoice.sales', $data);
            return $pdf->download('inv_' . Carbon::now() . '.pdf');
        }
    }

EventServiceProvider 已经在监听它了:

protected $listen = [
        'print.invoice' => [
            'App\Events\InvoiceEventHandler',
        ],
    ];

一切正常,只是没有下载 PDF。我正在使用https://github.com/barryvdh/laravel-dompdf 创建和下载 PDF。谁能告诉我怎么了?

【问题讨论】:

  • 您不能不返回 ajax 响应并在同一请求下下载 pdf,只是不可能。一个请求 -> 一个响应。
  • 也许您可以在发送成功消息后在您的javascript文件中添加window.location.href

标签: php events pdf laravel-5.1


【解决方案1】:

我给你和想法。创建 pdf 文件并将其临时存储在您的服务器上

// return an absolute url
$pdfFile = \PDF::create('inv_' . Carbon::now() . '.pdf');

现在在您的 json 响应中添加 pdf 文件 url,以便在响应到达客户端后下载它:

return \Response::json([
    'type'      =>  'success',
    'message'   =>  'Success creating sales!',
    'pdf' => pdfFile
]);

通过 javascript,在 success() 方法中,您可以在其他请求中调用 pdf

【讨论】:

  • 这是我的第二种方法,尽管最后我仍然使用事件来创建单个 pdf 并将发票的位置存储到数据库中,因为创建 pdf 确实需要一些时间,以防止相同的发票被其他用户同时加载,响应成功后立即使用另一个 $.get 下载 inv。
猜你喜欢
  • 2016-04-02
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多