昨天博主接到一個委託的需求,大數據同事想要在請求日誌抓取數據,但願在個人每一個頁面進行cookie的種植,方便他們進行定位分析,我思考了一下,簡單呀,首先考慮的是經過中間件進行cookie種植,可是隨後發如今如今的項目結構裏貿然增長一個單純的非通用性的中間件,會致使項目的耦合增長因而乎,開始研究項目路由,好在,個人項目裏面,全部路由都指向了同一個控制器(框架結構裏面還有其餘項目),因而乎,開動。
首先,增長了一個cookie種植的私有方法,放到控制器的構造函數裏面,這樣就能夠實現cookie種植啦,cookie操做直接使用了框架自帶的cookie啦,在app.php裏面:
中文官方文檔裏面cookie有兩種用法,第一種就是實例化一個response類 ,而後用withCookie()方法去種植:
return response($content) ->header('Content-Type', $type) ->cookie('name', 'value', $minutes);
或者
$response = new Response();
$cookie = cookie('name,'value',10);//保存10分鐘
return $response->withCookie($cookie);
可是通過百度以後發現了一個更更加靈活的使用方式:
Cookie::queue('name','value',10);
這種方式更加適用於控制器哦
可是這個裏這麼了博主好幾個小時,網上其餘大咖分享的知識,都是在控制器使用以後完美種植,奈何我不管如何都不能實現(response能夠實現),鬱悶,沉浸下來思考了一下,應該是咱們項目和標準框架那裏有差別,因而各類搜索,琢磨開始了,最後發現了一個可疑的類:AddQueuedCookiesToResponse,從字面能夠看出它的功能,添加隊列cookie到響應,並且還使用了getQueuedCookies()方法(注:和queue方法同屬於CookieJar類),後來搜索後發現,標準框架裏面,該類做爲web中間件是被默認開啓的,可是被人給註釋掉了,哭~
好了,cookie種植已經解決,可是有個問題須要思考一下,以前通常用的中間件都是在執行控制器以前執行,爲何這個中間件是在以後執行呢?
關鍵點在於這裏:
沒錯,就是$next($request),這裏應該是把請求轉發到下一個步驟了,也就是控制器,控制器執行完畢,返回一個響應類,若是須要在控制器執行完畢以後處理響應,就能夠對返回的response進行相關操做了,總結完畢~