Lumen中启用session

作者: 崔小聪 | 来源:发表于2016-11-28 13:02 被阅读1449次

    Lumen框架已经剔除了session的默认支持,但是我们仍然可以自己添加session功能,这一切都得益于强大的Laravel及Composer。

    Lumen5.2 的Release Notes中官方明确的指出Lumen专注于构建无状态API,JSON API 服务,移除了session和view的支持,但其实view还是存在的,session确实真的被移除了

    因为项目需要所以我决定找回session,虽然官方建议需要session功能时可以使用强大的Laravel框架,但是对我小项目确实有点大材小用了。因为喜欢Laravel的优雅,所以我在小项目中都会把Lumen做为项目的首选。

    下面就来一步步找回“丢失”的session吧!

    注册SessionServiceProvider

    打开bootstrap/app.php,在相应位置添加注册SessionServiceProvider,代码如下

    // bootstrap/app.php
    // ...
    /*
    |--------------------------------------------------------------------------| 
    Register Service Providers
    |--------------------------------------------------------------------------|
    ...
    |*/
    // ...
    // 注册 SessionServiceProvider
    $app->register(Illuminate\Session\SessionServiceProvider::class);
    // ...
    

    添加session相关配置所需配置

    同样在bootstrap/app.php中添加配置代码

    // bootstrap/app.php
    // ...
    // 注册 SessionServiceProvider
    $app->register(Illuminate\Session\SessionServiceProvider::class);
    
    // 载入session相关配置
    $app->configure('session');
    

    configure函数会从文件中加载配置,并绑定到container中,接下来只需要在项目根目录创建config文件夹,并新建session.php配置文件

    <?php
    // config/session.php
    // 这里直接从laravel中copy过来了,并且使用了file驱动,当然你也可以使用其他驱动,详细配置请查阅laravel官方文档
    return [
        'driver' => env('SESSION_DRIVER', 'file'),//默认使用file驱动,你可以在.env中配置
        'lifetime' => 120,//缓存失效时间
        'expire_on_close' => false,
        'encrypt' => false,
        'files' => storage_path('framework/session'),//file缓存保存路径
        'connection' => null,
        'table' => 'sessions',
        'lottery' => [2, 100],
        'cookie' => 'laravel_session',
        'path' => '/',
        'domain' => null,
        'secure' => false,
    ];
    

    然后在storage/framework/下建立session文件夹用来存储session缓存,别忘了修改权限

    注册StartSession中间件

    打开bootstrap/app.php,在Register Middleware位置修改

    // bootstrap/app.php
    // ...
    |--------------------------------------------------------------------------
    | Register Middleware
    |--------------------------------------------------------------------------
    // ...
    $app->middleware([
        Illuminate\Session\Middleware\StartSession::class
    ]);
    

    添加Session别名

    因为框架中使用了session别名,所以需要添加alias,不然会报错

    // bootstrap/app.php
    // ...
    // 注册 SessionServiceProvider
    $app->register(Illuminate\Session\SessionServiceProvider::class);
    
    // 载入session相关配置
    $app->configure('session');
    
    // 设置session别名
    $app->alias('session', 'Illuminate\Session\SessionManager');
    

    使用session

    至此,你就可以在代码中使用session了,使用 app('session') 即可获取session实例,示例:

    // 写入一条数据至 session 中...
    app('session')->put('key','value');
    
    // 获取session中键值未key的数据
    app('session')->get('key');
    

    有关session的详细用法可查阅Laravel官方文档

    ps:session辅助函数

    // session辅助函数
    if (! function_exists('session')) {
        function session($key = null, $default = null)
        {
            $session = app('session');
    
            if (is_null($key)) {
                return $session;
            }
            if (is_array($key)) {
                return $session->put($key);
            }
    
            return $session->get($key, $default);
        }
    }
    

    辅助函数可以让你更方便的使用session

    相关文章

      网友评论

      • 云龙789:put存储的数据,下面直接get可以取出来,但是如果不再put,这个数据就没有了。怎么样长久存储数据呢
        崔小聪:@栾金龙 可以啊,我一直这么用的,不会有问题,你检查下是不是哪里配置不对,看看是不是生成session缓存文件了
        laravel对原生的session做了封装,可以有些高级的用法,比如用redis做session缓存
        云龙789:@崔小聪 昨天搞了好久都不行。你试下,在另外一个控制器能不能访问到这个session。应该是不能的。我用了原声的session可以可。在index.php里面添加了session_start() 但我还是不太清楚原生的与laravel的这个由什么区别 加下微信吧 jndx00789
        崔小聪:@栾金龙 你是不是session没有被存储下来?默认是使用文件缓冲,检查下配置项中的文件夹是否存在并且生成了session缓存文件

      本文标题:Lumen中启用session

      本文链接:https://www.haomeiwen.com/subject/zqkopttx.html