2015-09-07 60 views
0

我最初的控制器代码Laravel 5.1下载PDF是:与事件事件

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(), 
      ]); 
     } 

我需要用事件来打印发票,因为我需要返回与阿贾克斯的响应,让用户知道销售已经成功制作。

的事件代码是如此简单:

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。有人能告诉我什么是错的吗?

+0

你不能不返回ajax响应和下载pdf在相同的请求,只是这是不可能的。一个请求 - >一个响应。 – manix

+0

也许你可以在成功发送消息后在javascript文件中添加'window.location.href'。 – mul14

回答

0

我给你和想法。创建PDF文件,并在你的JSON响应现在存储在您的服务器时间

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

添加PDF文件的URL,以便一旦响应到达客户端下载:

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

从JavaScript,在success()方法,你可以在其他请求中调用pdf

+0

这是我的第二种方法,尽管最后我仍然使用event创建一个pdf并将发票的位置存储到数据库,因为创建pdf确实需要一些时间,以防止其他人同时加载相同的发票用户,并在响应成功后立即使用另一个$ .get来下载inv。 – user2002495