2015-09-07 61 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