Ogarniamy Laravel session flash messages. Jak robiliśmy własny framework MVC musieliśmy napisać middleware, który obsługiwał te jednorazowe wiadomości. W Laravelu je mamy i uczymy się z nich korzystać.

Ok, najpierw dlaczego layouty tak bardzo się przydają (patrz poprzednia lekcja):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Layout App - @yield('title', 'Main Page')</title>
    @vite('resources/js/app.js')
</head>
<body>
    
    @if(session('status'))
    <p>{{session('status')}}</p>
    @endif

    @yield('content')
</body>
</html>

W jedno miejsce wrzucamy tego ifa i na wszystkich stronach te wiadomości już nam działają. Podobnie asset-bundling (vite) oraz jakaś struktura strony, jednolita dla wszystkich.

Ok, pora użyć tej sesji. Do routes, web.php:

Route::get('/', function () {
    return view('welcome2');
})->name("main");


Route::post("/", function(Request $request){
    session()->flash("status", "entry created!");
    return redirect()->route("main");
});

Nazwaliśmy route, który już mamy i zrobiliśmy nowy. Tak w zasadzie nie musielibyśmy nazywać tego route, można zrobić redirect(„/”), ale nie jest to dobra praktyka.

Ok, zróbmy jakiś formularz:

@extends('layouts.app')


@section('content')

 <h1>Hello World!</h1>
  <form action="{{route('main')}}" method="POST">
    <input type="submit" value="send">
    @csrf
  </form>
@endsection

Dlaczego @csrf na końcu? Cóż, wynika to z tego, że bardzo lubię pewien selektor CSS, który wygląda tak:

.container form * + * {
    margin-top: 1rem;
}

Chodzi o to, aby te elementy, które następują po jakimś elemencie miały ten odstęp. I czasem coś mi się psuje, jak robię w odwrotnej kolejności, choć teoretycznie pole hidden nie powinno. Nieważne.

Teraz jak damy send, to zobaczymy nasz flash message, ale już po odświeżeniu tego nie będzie.

Zupełnie jak w naszym frameworku MVC, też miał ten mechanizm i też miał template engine ogarniający te sprawy.