2015-04-22 5 views
7

Próbuję pracować z Sesjami w oprogramowaniu Laravel 5 Middleware, ale one nie działają. Mówiąc konkretnie - var_dump(Session::all()); na początku metody rączką daje mi tablicę z jednej wartości - _tokken, a następnie pod koniec tej metodySesja nie działa w oprogramowaniu pośrednim Laravel 5

Session::put('lang',$locale); 
var_dump(Session::all()); 

Daje mi tablicę z dwóch wartości, _tokken i mój klucz lang, ale po odśwież ją tak samo, jak rozumiem, że powinien być taki sam wynik po drugim odświeżeniu.

I choć może Mam middleware załadowany przed Session middleware, co było prawdą, to przeszedłem i teraz mój Kernel.php wygląda następująco -

protected $middleware = [ 
     'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 
     'Illuminate\Cookie\Middleware\EncryptCookies', 
     'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 
     'Illuminate\Session\Middleware\StartSession', 
     'Illuminate\View\Middleware\ShareErrorsFromSession', 
     'App\Http\Middleware\VerifyCsrfToken', 
     'App\Http\Middleware\Language', 

    ]; 

Więc pytam - co robię źle?

Edit: Kopanie w Illuminate \ Session \ Middleware \ StartSession Znalazłem -

//Note that the Laravel sessions do not make use of PHP "native" sessions in any way since they are crappy. 

jako komentarz, więc moje badania z session_status() nie jest relavent.

+0

Właśnie usunąłem odpowiedź, ponieważ była ona niepoprawna. Testowałem '' Session :: all() '' w oprogramowaniu middleware mojego projektu i działa dobrze. Przepraszamy za niepoprawną odpowiedź. –

+0

@limonte nie martwi się, tak napisałem, że Session :: all() zwraca _token, ale nie później ustawić własną wartość – Subject

+0

dla mnie działa tak jak należy, tj. _token, _previous i moje niestandardowe wartości –

Odpowiedz

5

Trzeba użyć

\Session::save(); 

Kiedy chcesz zapisać modyfikację więc powiedzmy, że chcę, aby przechowywać języka użytkownika

\Session::put('lang','en'); 
\Session::save(); 

Po odświeżeniu teraz znajdziesz nowo stworzony klucz.

+0

Ta metoda "save" nie jest wymagana w Laravel 5.2 – Daan

+1

Czasami jest to konieczne. Jeśli wykonasz 'redirect() -> route ('myroute') -> send()', to nie przechowuje danych sesji, więc powinieneś wcześniej dodać 'Session :: save();'. –

+0

to nie pomogło –

0

Inną rzeczą, na którą należy zwrócić uwagę, jeśli tworzysz jakieś oprogramowanie pośredniczące, które przetwarza/pobiera dane z sesji, musisz upewnić się, że jest ono załadowane po oprogramowaniu sieciowym w wersji StartSession.

4

Miałem ten sam problem, używałem sesji do przechowywania ustawień narodowych podczas logowania, a następnie przekierowania do głównego pulpitu, ale po załadowaniu oprogramowania pośredniego sesja jeszcze się nie rozpoczęła. Więc to by nie działało.

Pozwól mi powiedzieć, po pierwsze, nie jestem ekspertem laravel, ale w ten sposób działa w laravel 5.3:

1) php rzemieślnik Producent: middleware SetApplicationLanguage

2) Dodaj do tego app/HTTP/Kernel Zmienna .php $ middlewareGroup:

\Illuminate\Session\Middleware\StartSession::class, 
\App\Http\Middleware\SetApplicationLanguage::class, 

Zauważ, że to nowe oprogramowanie pośredniczące pojawia się PO klasie StartSession.

3) To jest mój app/HTTP/Middleware/SetApplicationLanguage.php:

namespace App\Http\Middleware; 

use App; 
use Closure; 
use Illuminate\Support\Facades\Auth; 

class SetApplicationLanguage 
{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request    
    * @param \Closure $next    
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (isset(Auth::user()->locale)) { 
      App::setLocale(Auth::user()->locale); 
     } 

     return $next($request); 
    } 
} 

Zauważ, że nie używam Sesja w nim ten przykład. To dlatego, że po dodaniu mojego middleware PO klasie StartSession, sesja by działała, ale Auth :: user() byłaby znowu dostępna, więc mógłbym po prostu użyć Auth :: user() -> locale i nie potrzebować Sesji w ogóle.

Ale możesz to zrobić, po prostu użyj App :: setLocale (Sesja :: get ("locale")) zamiast tego z powodu obejmują fasadę Sesji.

0

Miałem ten sam problem, ustawiłem wartość w oprogramowaniu pośredniczącym i rozbrajałem w tym samym miejscu, jeśli jakiś warunek jest prawdziwy.

Całkowicie zapomniałem o 404, niektóre pliki otrzymywały 404 (brakujące obrazy), więc nginx przekazywał żądanie do aplikacji Laravel, aby wyświetlać stronę 404, a ponieważ był to inny adres URL, który tam ustawiałam. Myślę, że jest to ten sam problem z przechowywaniem rzeczy językowych w sesji. Po prostu sprawdź sieć przeglądarek i zobacz, jakie żądania są tworzone podczas ładowania strony, możesz ustawić i rozbrojenie w tym samym czasie