Kontynuacja lekcji poprzedniej. Przypominamy sobie, co robiliśmy plus poznajemy jeszcze kilka innych rzeczy wartych odnotowania. Do dzieła.

Ok, poprzednio napisaliśmy coś takiego:

Route::get('/get-cookie', function (Request $request) {
    if($request->hasCookie('user_name')){
        $userName = $request->cookie('user_name');
        return "User Name: $userName";
    } else {
        return "Hello stranger!";
    }
});

Route::get('/set-cookie', function () {
    $cookie = cookie('user_name', 'John Doe', 60); // Name, Value, Minutes
    return response('Cookie has been set')->cookie($cookie);
});

Route::get('/forget-cookie', function () {
    $cookie = cookie('user_name', 'John Doe', -1);
    return redirect()->back()->withCookie($cookie);;
});

Route::get('/set-cookie-redirect', function () {
    $cookie = cookie('user_name', 'John Doe', 60); // Name, Value, Minutes
    return redirect("/get-cookie")->withCookie($cookie);
});

Widzimy, że:

  • cookie tworzymy metodą cookie, ale nie są one zapisywane (cookie to warstwa abstrakcji, nie odpowiednik setcookie z czystego PHP)
  • cookie dołączamy do response metodą ->cookie($cookie) albo redirecta metodą ->withCookie($cookie)
  • request ma metody ->cookie (do pobierania zawartości) oraz ->hasCookie (do sprawdzania, czy cookie istnieje).

Co jeszcze warto wiedzieć? Po pierwsze cookie/withCookie mogą tworzyć i dopisywać te pliki w locie:

return response('Hello World')->cookie(
    'name', 'value', $minutes
);

Po drugie, jak nie mamy instancji response/redirecta, możemy zakolejkować cookie odpowiednią fasadą:

use Illuminate\Support\Facades\Cookie;
 
Cookie::queue('name', 'value', $minutes);

Takie cookie zostanie zapisane przy jakimkolwiek następnym requeście. Wszystko przez to, że Laravel to poważny framework, nasz projekt MVC miał wiele warstw abstrakcji, ale Laravel ma jeszcze więcej.

Nie da się tam „brutalnie” zrobić setcookie, przez te warstwy abstrakcji. Można zakolejkować ustawienie cookie na kolejny request, za pomocą queue, albo dopisując cookie/withCookie do response/redirecta.

Możemy też ustawić, że cookie ma wygasnąć:

Route::get('/forget-cookie', function () {
    Cookie::expire('user_name');
    return redirect()->back();
});

Jest też jeszcze jeden sposób:

Route::get('/forget-cookie', function () {
    return redirect()->back()->withoutCookie('user_name');
});

Od nas zależy, co wolimy, ważne abyśmy mieli jako takie pojęcie jak framework typu Laravel z wieloma warstwami abstrakcji działa i że to nie jest tak, jak w czystym PHP.

Robiąc projekt framework MVC obyliśmy się z takim podejściem, więc nie powinno być trudno to zrozumieć.