2021 年 3 月 5 日的最后更新
(这个答案引起了 Laravel 社区的广泛关注,所以我想更新它。)
Laravel 从 5.2 及更高版本正式停止支持 laravel/lumen 框架中的会话和视图。
但是laravel 仍然有一个组件illuminate/session 可以安装在lumen/framework 中,我们可以玩弄这个。
步骤 - 1
使用安装illuminate/session
composer require illuminate/session
步骤 - 2
现在转到 bootstrap/app.php 并添加此中间件
$app->middleware([
\Illuminate\Session\Middleware\StartSession::class,
]);
添加上述中间件的目的是在每次请求时启动会话并在响应之前保存会话。
步骤 - 3
现在添加config/session.php,因为默认情况下Lumen 中不存在它。你可以从Laravel official repo取session.php。
步骤 - 4
创建框架会话存储目录
mkdir -p storage/framework/sessions
感谢DayDream
步骤 - 5
在bootstrap/app.php 中为\Illuminate\Session\SessionManager 添加绑定
$app->singleton(Illuminate\Session\SessionManager::class, function () use ($app) {
return $app->loadComponent('session', Illuminate\Session\SessionServiceProvider::class, 'session');
});
$app->singleton('session.store', function () use ($app) {
return $app->loadComponent('session', Illuminate\Session\SessionServiceProvider::class, 'session.store');
});
感谢@xxRockOnxx 找到loadComponent 方法。
它需要 3 个参数,
- 第一个是
config 文件名。 (文件应存在于config/ 目录中)
- 第二个是ServiceProvider FQN
- 第三个是这个方法的返回。
loadComponent 只是调用$app->register 并在构建ServiceProvider 时注入$app
如何使用
// Save Session
$router->get('/', function (\Illuminate\Http\Request $request) {
$request->session()->put('name', 'Lumen-Session');
return response()->json([
'session.name' => $request->session()->get('name')
]);
});
// Test session
$router->get('/session', function (\Illuminate\Http\Request $request) {
return response()->json([
'session.name' => $request->session()->get('name'),
]);
});
我还在 github 上添加了示例,支持从 lumen 框架 v5.6 一直到当前版本 v8.0。
https://github.com/rummykhan/lumen-session-example