// before
public function handle($request, Closure $next)
{
// do stuff here
return $next($request);
}
// after
public function handle($request, Closure $next)
{
$response = $next($request)
// do stuff here
return $response;
}
// global
public function handle($request, Closure $next)
{
$request->user()->name // nie zadziala, bo probujemy null->name
$response = $next($request)
$request->user()->name // Kowalski Jan
// do stuff here
return $response;
}
Wiem po co jest middleware i jak zrobić, żeby działał, ale nie rozumiem dlaczego działa tak jak wyżej przedstawiłem.
-
Dlaczego raz musimy zadeklarować zmienną $response, a drugim razem nie? Co się tam dzieje w międzyczasie, że gdzieś to nam ginie.
-
Czy globalne middleware'y gdzieś tam pod spodem są traktowane jak te
after
(tzn. są wywoływane - jezeli mozna tak powiedziec - po obrobieniu requesta)? Wnioskuję to po tym, że konieczne jest zrobienie tego tak jak wyżej pokazałem, a z dokumentacji laravela wynika, że jeżeli zrobimy w ten sposób to middleware odpali się po przetworzeniu requesta (cokolwiek to oznacza, ja to rozumiem tak, że po przejściu przez controller). Poza tym jak zobaczyłem kolejność wywołań zdebug_backtrace
to są wywoływane właśnie w tym samym miejscu coafter
. Normalnie jak tworzymy middleware dla jakiegoś route'a to musimy manualnie mu powiedzieć $response bla bla i mamy wybór, a tutaj albo tak albo nie zadziała i nie rozumiem dlaczego. -
Jeżeli te middleware'y możemy traktować jako before i after to dlaczego w middleware before mamy bez problemu dostęp do $request->user, a w tym drugim to gdzieś ginie z niewiadomego powodu i trzeba zrobić ten "trik" z
$response
?