session
获取数据
public function showProfile(Request $request, $id) {
$value = $request->session()->get('key');
//
}
存储数据
获取到session实例后,就可以调用多个方法来与底层数据进行交互,例如,put方法存储新的数据到session中:
//通过put方法
$request->session()->put('key', 'value');
//通过全局辅助函数
session(['key' => 'value']);
删除数据
forget方法从session中移除指定数据,如果你想要从session中移除所有数据,可以使用flush方法:
$request->session()->forget('key');
$request->session()->flush();
上一次请求输入
Laravel 允许你在两次请求之间保存上一次输入数据,这个特性在检测校验数据失败后需要重新填充表单数据时很有用,不过如果你使用的是 Laravel 自带的验功能,则不需要手动使用这些方法,因为一些 Laravel 自带的校验设置会自动调用它们。
将输入存储到Session
Illuminate\Http\Request 实例的 flash 方法会将当前输入存放到一次性 Session(所谓的一次性指的是从 Session 中取出数据后,对应数据会从 Session 中销毁)中,这样在下一次请求时上一次输入的数据依然有效:
$request->flash();
你还可以使用 flashOnly 和 flashExcept 方法将输入数据子集存放到 Session 中,这些方法在 Session 之外保存敏感信息时很有用,该功能适用于登录密码填写错误的场景:
$request->flashOnly('username', 'email');
$request->flashExcept('password');
将输入存储到 Session 然后重定向
如果你经常需要一次性存储输入请求输入并返回到表单填写页,可以在 redirect() 之后调用 withInput() 方法实现这样的功能:
return redirect('form')->withInput();
return redirect('form')->withInput($request->except('password'));
取出上次请求数据
要从 Session 中取出上次请求的输入数据,可以使用 Request 实例提供的 old 方法。old 方法可以很方便地从 Session 中取出一次性数据:
$username = $request->old('username');
Laravel 还提供了一个全局的辅助函数 old(),如果你是在 Blade 模板中显示上次输入数据,使用辅助函数 old() 更方便,如果给定参数没有对应输入,返回 null:
<input type="text" name="username" value="{{ old('username') }}">
Cookie
从请求中取出Cookie
为了安全起见,Laravel 框架创建的所有 Cookie 都经过加密并使用一个认证码进行签名,这意味着如果客户端修改了它们则需要对其进行有效性验证。我们使用 Illuminate\Http\Request 实例的 cookie 方法从请求中获取 Cookie 的值:
$value = $request->cookie('name');
添加Cookie到响应
你可以使用 cookie 方法将一个 Cookie 添加到返回的 Illuminate\Http\Response 实例,你需要传递 Cookie 名称、值、以及有效期(分钟)到这个方法:
return response('欢迎来到 Laravel 学院')->cookie( 'name', '学院君', $minutes );
cookie 方法可以接收一些使用频率较低的参数,一般来说,这些参数和 PHP 原生函数 setcookie 作用和意义一致:
return response('欢迎来到 Laravel 学院')->cookie( 'name', '学院君', $minutes, $path, $domain, $secure, $httpOnly );
我们简单演示下该功能的使用,在 routes/web.php 定义两个路由如下:
Route::get('cookie/add', function () {
$minutes = 24 * 60;
return response('欢迎来到 Laravel 学院')->cookie('name', '学院君', $minutes);
});
Route::get('cookie/get', function(\Illuminate\Http\Request $request) {
$cookie = $request->cookie('name');
dd($cookie);
});
先访问 http://blog.dev/cookie/add 设置 Cookie,然后再通过 http://blog.dev/cookie/get 获取 Cookie 值,如果在页面看到输出 学院君,则表示 Cookie 设置成功。
生成Cookie实例
如果你想要生成一个 Symfony\Component\HttpFoundation\Cookie 实例以便后续添加到响应实例,可以使用全局辅助函数 cookie,该 Cookie 只有在添加到响应实例上才会发送到客户端:
$cookie = cookie('name', '学院君', $minutes);
return response('欢迎来到 Laravel 学院')->cookie($cookie);
我们改写下之前的 cookie/add 路由实现逻辑:
Route::get('cookie/add', function () {
$minutes = 24 * 60;
//return response('欢迎来到 Laravel 学院')->cookie('name', '学院君', $minutes);
$cookie = cookie('name', '学院君X', $minutes);
return response('欢迎来到 Laravel 学院')->cookie($cookie);
});
效果和之前一致,这次访问 cookie/get 路由,页面打印结果是 学院君X。