Laravel 5 - session doesn't work

2019-01-15 08:44发布

Here's config/session.php:

return [
    'driver' => 'file',
    'files' => storage_path().'/framework/sessions',
];

My storage/framework/sessions have 755 permissions.

When I put these 2 line in my controller

Session::set('aa', 'bb');
dd(Session::get('aa'));

I receive expected "bb" output. But if I comment first line:

// Session::set('aa', 'bb');
dd(Session::get('aa'));

and refresh page, I still expecting "bb" but getting null.

Also, storage/framework/sessions is empty.

What should I do to make Session working?

2条回答
一纸荒年 Trace。
2楼-- · 2019-01-15 09:05

With laravel 5.*, you must change the kernel file like bellow:

  'api' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Session\Middleware\StartSession::class,
            'throttle:60,1',
            'bindings',
        ],

then go to storage/framework/session folder and change the permission to 755 if it has another amount, then delete all files in your storage/framework/session path, use your code again to put something in a session, watch the storage/framework/session folder.

If your session work you can see the weird long file that belong to session right now, and you are done!

If your problem is not yet solved, go to config/session and change:

'driver' => env('SESSION_DRIVER', 'file')

to another predefined amount like:

'driver' => env('SESSION_DRIVER', 'array'),

or even

'driver' => env('SESSION_DRIVER', 'database'),

and finally if you have an empty folder of storage/framework/session, you still have a problem for sure !!!

enter image description here

查看更多
倾城 Initia
3楼-- · 2019-01-15 09:10

Laravel 5 handles sessions via a middleware class called StartSession. More importantly, this middleware is a TerminableMiddleware and the code that actually saves the data (in your case to the session file) is located in the terminate method, which is run at the end of the request lifecycle:

public function terminate($request, $response)
{
    if ($this->sessionHandled && $this->sessionConfigured() && ! $this->usingCookieSessions())
    {
        $this->manager->driver()->save();
    }
}

When calling dd(Session::get('aa')); the request is being interrupted before the terminate method of the middleware can be called.

Funnily enough, the Laravel Middleware Documentation actually explains Terminable Middleware logic by giving the Laravel StartSession middleware as an example:

For example, the "session" middleware included with Laravel writes the session data to storage after the response has been sent to the browser.

That being said, try using var_dump() instead of using dd().

查看更多
登录 后发表回答