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.