Im trying to work with Sessions in Laravel 5 Middleware, but they are not working.
To be specific - var_dump(Session::all());
at the start of handle method gives me array with one value - _tokken, then at the end of this method
Session::put('lang',$locale);
var_dump(Session::all());
Gives me array with two values, _tokken and my lang key, but after refresh its the same, as I understand there should be same result after second refresh.
I though maybe I have my middleware loaded before Session middleware, which was true, then I switched and now my Kernel.php looks like this -
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',
];
So I ask - what am I doing wrong?
Edit: Digging in Illuminate\Session\Middleware\StartSession I found this -
//Note that the Laravel sessions do not make use of PHP "native" sessions in any way since they are crappy.
as a comment, so my testing with session_status() is not relavent.
To access the session data, we need an instance of session which can be accessed via HTTP request. After getting the instance, we can use the get() method, which will take one argument, “key”, to get the session data.
Since HTTP driven applications are stateless, sessions provide a way to store information about the user across multiple requests. That user information is typically placed in a persistent store / backend that can be accessed from subsequent requests.
The correct syntax for this is: Session::set('variableName', $value); For Laravel 5.4 and later, the correct method to use is put : Session::put('variableName', $value);
I had the same problem, I was using Sessions to store the locale at login, then redirect to the main dashboard, but when the middleware loads, the session is not initiated yet. So it wouldn't work.
Let me say first, I'm no Laravel expert, but this way works in Laravel 5.3:
1) php artisan make:middleware SetApplicationLanguage
2) Add this to app/Http/Kernel.php $middlewareGroup variable:
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\SetApplicationLanguage::class,
Notice that this new Middleware comes AFTER the StartSession class.
3) This is my 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);
}
}
Notice that I don't use Session in it this example. That's because when I add my Middleware AFTER the StartSession class, session would work, but Auth::user() would be available again, so I could just use Auth::user()->locale and no need for Sessions at all.
But you could do it, just use App::setLocale(Session::get('locale')) instead and of cause include the Session facade.
If you need the session in your current middleware I found a(n) (ugly) workaround.
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Session\Middleware\StartSession;
class MiddlewareThatNeedsTheSession
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return app(StartSession::class)->handle($request, function ($request) use ($next) {
/** @var Response $response */
$response = $next($request);
// do something with session
session(['foo' => 'bar']);
return $response;
});
}
}
You need to use
\Session::save();
Whenever you want to save the modification so lets say I want to store the language of the user
\Session::put('lang','en');
\Session::save();
When you refresh now you will find your newly created key.
I had the same problem. @WoodyDRN said you need add StartSession middleware to your kernel file to you but it is not best way to solve this problem. So, how do I know that? Because I added and request the validation system is broken.
Best way to solve this problem, adding your language middleware to web middleware array
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Localization::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
Another thing to note, if you're making some middleware that's manipulating/retrieving data from the session, you need to make sure it's loaded after StartSession
web middleware.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With