2016-01-11 32 views
4

我想在自定義Laravel中間件中設置cookie。我們的想法是在用戶通過任何登陸頁面訪問我的網站時設置cookie值。在Laravel自定義中間件中設置Cookie

所以我做的是我創建了一個名爲UUIDMiddleware的中間件。我在我的路線中使用這個中間件和網絡中間件。以下是來自中間件的代碼。

if($request->hasCookie('uuid')) 
{ 
    return $next($request);  
} 
else 
{ 
    $uuid = Uuid::generate(); 
    $response = new Response(); 
    return $response->withCookie(cookie()->forever('uuid', $uuid)); 
} 

正如你所看到的,我正在檢查cookie是否存在。如果不是,我將控制權交給下一個請求。

問題是使用return $response設置cookie時,我無法將控制權交給下一個請求。我該如何解決這個問題?

在這種情況下會發生什麼情況是,如果未設置cookie,則會設置cookie並顯示空白屏幕。如果我刷新,我會看到帶有cookie集的網站。

必須以正確的方式使用中間件來設置cookie。我該怎麼做?

回答

6

您可以獲取響應對象middleware像這樣:

public function handle($request, Closure $next) 
{ 
    $response = $next($request); 

    // Do something after the request is handled by the application 

    return $response; 
} 

所以你可以做這樣的事情

if($request->hasCookie('uuid')) { 
    return $next($request);  
} 

$uuid = Uuid::generate(); 
$response = $next($request); 
return $response->withCookie(cookie()->forever('uuid', $uuid)); 
+1

這似乎並沒有工作了。調用'$ next($ request)',不管你是否返回它,或者不打開處理方法並繼續請求。 – Chris

+0

@Chris這是不正確的(至少對於Laravel 5.4來說)。你確定你註冊了中間件嗎? – Boyd

+0

@博德中間件已註冊。我最後要做的是返回$ next($ request) - > withCookie()並提供我的cookie對象。實際上,除非明確定義,否則cookie不會被攜帶 – Chris