2016年11月17日 星期四

Laravel 5.2 發送內部 Request 來呼叫現成 AJAX API

如果我在 Laravel Controller 內部,想要 call 另外一個現成的 AJAX 做事怎麼辦呢?
我們可以利用內部 Routing 機制,不用真的發 HTTP request,就可以達到類似的效果了。

以下這段程式情境如下:
  1. 我們的顯示購物車頁面,有一個參數是欲加入的商品代號。如果這個參數有值,會先將此商品加入購物車以後才出現商品清單畫面,使用者從這個畫面開始結帳流程。
  2. 在此之前,我們的使用者是利用一隻 AJAX API 來將商品加入購物車。
public function getCheckoutForm(Request $request) {
        $productId = $request->input('product_id', null);
        if(!empty($productId)) {
            // http://stackoverflow.com/questions/16597420/how-can-i-access-query-string-parameters-for-requests-ive-manually-dispatched-i
            $rr = Request::create(route('post.ajax.addcart'), 'POST', ['product_id' => $productId, '_token' => csrf_token()]);

            // Store the original input of the request and then replace the input with your request instances input.
            $originalInput = $request->input();
            $request->replace($rr->input());
            $response = Route::dispatch($rr);
            $request->replace($originalInput);
        }
        // getCheckoutForm() business logic
}

在這裡我們可以看到
  1. 我們先建立新的 Request 物件 $rr。
  2. 然後備份目前的 request input
  3. 將目前的 request input 置換成 $rr 的 input
  4. 利用 Route::dispatch() 產生 Request call
  5. 呼叫完畢以後再把目前 request input 換回來

參考