Session

未匹配的标注
本文档最新版为 6.x,旧版本可能放弃维护,推荐阅读最新版!

Session

简介

由于 HTTP 协议是无状态的,所以 session 提供了一种保存用户数据的方法。Lumen 附带支持了多种 session 后端驱动,并通过统一的 API 进行使用。也内置支持像是 MemcachedRedis 和数据库这样的后端驱动。

开启会话功能

请在 bootstrap/app.php 文件中把 $app->middleware() 这行代码的注释删除掉。

配置

Session 的在 .env 文件的 SESSION_DRIVER 选项中配置。Lumen 默认使用 memcached 的 session 驱动,它在大多数应用中可以良好运作。你也可以考虑使用 redis 等驱动。

Session driver 定义数据将由什么样的方式进行存储。Lumen 附带了几个不错且可立即使用的驱动:

  • file - 将 sessions 保存在 storage/framework/sessions 中。
  • cookie - 将 sessions 安全的保存在加密后的 cookies 中。
  • database - 将 sessions 保存在应用程序使用的数据库中。
  • memcached / redis - 将 sessions 保存在其中一个快速且基于缓存的存储系统中。
  • array - 将 sessions 保存在简单的 PHP 数组中,并只存在于本次请求。

注意:数组驱动一般应在 测试 环境下使用,以防止 session 数据持续存在。

驱动介绍

数据库

当使用 database session 驱动时,你必需先构建保存 session 项目的数据表。以下例子使用 Schema 语法建表:

Schema::create('sessions', function ($table) {
    $table->string('id')->unique();
    $table->text('payload');
    $table->integer('last_activity');
});

Redis

在 Lumen 使用 Redis Session 之前,你需要先通过 Composer 安装 predis/predis(~1.0) 扩展包,还有 illuminate/redis 扩展包 (~5.1)。

其它的 Session 使用注意事项

Lumen 框架在内部使用了 flash 作为 session 的键,所以应该避免 session 使用此名称。

基本用法

访问 Session

我们可在控制器方法内通过对 HTTP 请求使用类型提示访问 session 实例。请记住,控制器方法的依赖是通过 Lumen 的 服务容器 注入的:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * 显示指定用户的个人文件。
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function showProfile(Request $request, $id)
    {
        $value = $request->session()->get('key');

        //
    }
}

你可以在 get 方法中的第二个参数内设置一个默认值,当指定的键名不存在时,将会返回设置的默认值。如果你传入一个 闭包 作为 get 方法的默认值,该 闭包 将被运行并返回它的结果:

$value = $request->session()->get('key', 'default');

$value = $request->session()->get('key', function() {
    return 'default';
});

如果你想从 session 中获取所有数据,则可以使用 all 方法:

$data = $request->session()->all();

你也可使用全局的 session PHP 函数来获取 session 中保存的数据:

Route::get('home', function () {
    // 获取 session 中的一条数据...
    $value = session('key');

    // 写入一条数据至 session 中...
    session(['key' => 'value']);
});

判断项目在 Session 中是否存在

has 方法被用于检查项目是否存在于 session 内。如果存在将会返回 true

if ($request->session()->has('users')) {
    //
}

保存数据到 Session 中

只要你可以访问到 session 实例,就可以调用多个函数来调整里面的数据。例如,put 方法能将一个新的数据加入现有的 session 内。

$request->session()->put('key', 'value');

保存数据进 Session 数组值中

push 方法可以将一个新的值加入至一个 session 数组内。例如,假设 user.teams 这个键是包含团队名称的数组,则可以将一个新的值加入此数组中:

$request->session()->push('user.teams', 'developers');

从 Session 中取出并删除数据

pull 方法将把数据从 session 内取出,并且删除它:

$value = $request->session()->pull('key', 'default');

从 Session 中移除数据

forget 方法可以从 session 内删除一条数据。如果你想删除 session 内所有数据,则可以使用 flush 方法:

$request->session()->forget('key');

$request->session()->flush();

重新生成 Session ID

如果你想重新生成 session ID,则可以使用 regenerate 方法:

$request->session()->regenerate();

闪存数据

有时候你想存入一条缓存的数据,让它只在下一次的请求内有效,则可以使用 flash 方法。使用这个方法保存 session,只能将数据保留到下个 HTTP 请求,然后就会被自动删除。闪存数据在短期的状态消息中很有用:

$request->session()->flash('status', 'Task was successful!');

如果需要保留闪存数据给更多请求,可以使用 reflash 方法,这将会将所有的闪存数据保留给额外的请求。如果想保留特定的闪存数据,则可以使用 keep 方法:

$request->session()->reflash();

$request->session()->keep(['username', 'email']);

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~