Prośba o wytłumaczenie działania middleware

0
// 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ń z debug_backtrace to są wywoływane właśnie w tym samym miejscu co after. 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?

1

Na początek link do artykułu po angielsku -> http://www.codeheaps.com/php-programming/laravel-5-middleware-stack-decoded/

I najważniejszy schemat:

user image

Ok, teraz krótka odpowiedź na Twoje pytania:

Dlaczego raz musimy zadeklarować zmienną $response, a drugim razem nie? Co się tam dzieje w międzyczasie, że gdzieś to nam ginie.

Nie musimy - możemy, zależy co chcemy osiągną - taka jest przyjęta konwencja, kod zadeklarowany przed przypisaniem:

$response = $next($request);

będzie modyfikował zapytanie / robił dodatkowe rzeczy przed obliczeniem odpowiedzi, natomiast to co jest po tym kodzie będzie modyfikować odpowiedź / robić dodatkowe rzeczy po obiczeniu podstawowej odpowiedzi. Każdy middleware może zawierać oba rodzaje akcji.

Czy globalne middleware'y gdzieś tam pod spodem są traktowane jak te after

Nie - są traktowane tak jak je zadeklarujesz (identycznie jak w zwykłych middleware'ach).

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?

Ponieważ globalne middleware'y, zgodnie z zamieszczonym schematem, są wywoływane zanim jest wywołana metoda dispatch() która rozpakowuje dane requestu (między innymi kto ten request wysłał). "W drodze powrotnej" te dane są już dostępne dla middleware'ów globalnych, są także dostępne cały czas dla middleware'ów przypisanych do routes (bo te są wywoływane już po rozpakowaniu requesta).

0

Wielkie dzięki. Czytałem ten artykuł, ale mimo to nie potrafiłem tego zrozumieć, bo łączyłem fakt dostępu do $request->user z before/after, a to nie ma z tym związku, tylko z tym, że są wywoływane przed dispatch()

są wywoływane zanim jest wywołana metoda dispatch() która rozpakowuje dane requestu (między innymi kto ten request wysłał). "

Dzięki temu mogę dalej spokojnie kodować, niech ci bozia w dzieciach wynagrodzi

1 użytkowników online, w tym zalogowanych: 0, gości: 1