Gaurav Mehta
Gaurav Mehta

Reputation: 1153

Setting Cookie in Laravel Custom Middleware

I want to set a cookie in a custom Laravel middleware. The idea is to set the cookie value any time a user visits my website through any landing page.

So what I did was I created a middleware named UUIDMiddleware. I am using this middleware along with web middleware in my routes. Below is its code from the middleware.

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

As you can see I am checking if cookie exists. If not, I am passing control to next request.

The problem is when setting a cookie using return $response, I cannot pass control to next request. How do I resolve this?

What happens in this case is if a cookie is not set, it sets a cookie and a blank screen shows up. If I refresh, I see the website with a cookie set.

There has to be a way to set cookie using middleware in the right way. How do I do it?

Upvotes: 10

Views: 24646

Answers (2)

Rai
Rai

Reputation: 696

The response object in middleware is returned by the $next closure, so you could do something like this:

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

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

Upvotes: 20

Eric McWinNEr
Eric McWinNEr

Reputation: 533

If you're using Laravel 5.8 and like me you want a solution that allows you set the expiration time of the cookie instead of setting it to forever, you could also do something like this in the middleware:

public function handle($request, Closure $next)
{
    $time = time() + 60 * 60 * 24; //One day
    $res = $next($request);
    return $res->cookie('cookie_name', $cookieValue, $time, "/");
} 

This would set the cookie when the controller is done with the request and is returning a response.

Upvotes: 0

Related Questions