Laravel 5 - 会话无效
Laravel 5 - session doesn't work
这里是config/session.php
:
return [
'driver' => 'file',
'files' => storage_path().'/framework/sessions',
];
我的 storage/framework/sessions
有 755 个权限。
当我将这两行放入我的控制器时
Session::set('aa', 'bb');
dd(Session::get('aa'));
我收到预期的 "bb"
输出。但是如果我评论第一行:
// Session::set('aa', 'bb');
dd(Session::get('aa'));
并刷新页面,我仍然期待 "bb"
但得到 null
。
此外,storage/framework/sessions
为空。
我应该怎么做才能让 Session 工作?
Laravel 5 通过名为 StartSession
的中间件 class 处理会话。更重要的是,这个中间件是一个 TerminableMiddleware
,实际保存数据的代码(在你的例子中是保存到会话文件中)位于 terminate
方法中,最后是 运行请求生命周期:
public function terminate($request, $response)
{
if ($this->sessionHandled && $this->sessionConfigured() && ! $this->usingCookieSessions())
{
$this->manager->driver()->save();
}
}
当调用 dd(Session::get('aa'));
时,在可以调用中间件的 terminate
方法之前请求被中断。
有趣的是,Laravel Middleware Documentation 实际上以 Laravel StartSession
中间件为例解释了可终止中间件逻辑:
For example, the "session" middleware included with Laravel writes the session data to storage after the response has been sent to the browser.
也就是说,尝试使用 var_dump()
而不是 dd()
。
使用 laravel 5.*,您必须像下面这样更改内核文件:
'api' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
'throttle:60,1',
'bindings',
],
然后转到 storage/framework/session 文件夹并将权限更改为 755(如果它还有其他数量),然后删除 storage/framework/session 路径中的所有文件,再次使用您的代码将内容放入会话中,观看 storage/framework/session 文件夹。
如果你的会话工作,你现在可以看到属于会话的奇怪的长文件,你就完成了!
如果您的问题还没有解决,请转到config/session并更改:
'driver' => env('SESSION_DRIVER', 'file')
到另一个预定义的数量,例如:
'driver' => env('SESSION_DRIVER', 'array'),
甚至
'driver' => env('SESSION_DRIVER', 'database'),
最后,如果你有一个空文件夹 storage/framework/session,你肯定还有问题!!!
如果您使用 api 路由,您的会话可能会遇到此问题,并且大多数时候会话 return null ,
为此尝试使用网络路由
这里是config/session.php
:
return [
'driver' => 'file',
'files' => storage_path().'/framework/sessions',
];
我的 storage/framework/sessions
有 755 个权限。
当我将这两行放入我的控制器时
Session::set('aa', 'bb');
dd(Session::get('aa'));
我收到预期的 "bb"
输出。但是如果我评论第一行:
// Session::set('aa', 'bb');
dd(Session::get('aa'));
并刷新页面,我仍然期待 "bb"
但得到 null
。
此外,storage/framework/sessions
为空。
我应该怎么做才能让 Session 工作?
Laravel 5 通过名为 StartSession
的中间件 class 处理会话。更重要的是,这个中间件是一个 TerminableMiddleware
,实际保存数据的代码(在你的例子中是保存到会话文件中)位于 terminate
方法中,最后是 运行请求生命周期:
public function terminate($request, $response)
{
if ($this->sessionHandled && $this->sessionConfigured() && ! $this->usingCookieSessions())
{
$this->manager->driver()->save();
}
}
当调用 dd(Session::get('aa'));
时,在可以调用中间件的 terminate
方法之前请求被中断。
有趣的是,Laravel Middleware Documentation 实际上以 Laravel StartSession
中间件为例解释了可终止中间件逻辑:
For example, the "session" middleware included with Laravel writes the session data to storage after the response has been sent to the browser.
也就是说,尝试使用 var_dump()
而不是 dd()
。
使用 laravel 5.*,您必须像下面这样更改内核文件:
'api' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
'throttle:60,1',
'bindings',
],
然后转到 storage/framework/session 文件夹并将权限更改为 755(如果它还有其他数量),然后删除 storage/framework/session 路径中的所有文件,再次使用您的代码将内容放入会话中,观看 storage/framework/session 文件夹。
如果你的会话工作,你现在可以看到属于会话的奇怪的长文件,你就完成了!
如果您的问题还没有解决,请转到config/session并更改:
'driver' => env('SESSION_DRIVER', 'file')
到另一个预定义的数量,例如:
'driver' => env('SESSION_DRIVER', 'array'),
甚至
'driver' => env('SESSION_DRIVER', 'database'),
最后,如果你有一个空文件夹 storage/framework/session,你肯定还有问题!!!
如果您使用 api 路由,您的会话可能会遇到此问题,并且大多数时候会话 return null , 为此尝试使用网络路由