Blogger Information
Blog 128
fans 9
comment 5
visits 240785
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
20.)PHPWeb开发框架~laravel中会话控制Session和Cookie的使用操作
 一纸荒凉* Armani
Original
1238 people have browsed it

Session的配置及使用

简介

由于 HTTP 驱动的应用程序是无状态的,Session 提供了一种在多个请求之间存储有关用户信息的方法,Laravel 通过同一个可读性强的 API 处理各种自带的后台驱动程序。支持诸如比较热门的 Memcached, Redis 和数据库。

配置

Session 的配置文件存储在 config/session.php 文件中。默认情况下,Laravel 为绝大多数应用程序配置的 Session 驱动为 file 默认存到文件中。

session文件的目录:storage\framework\sessions

img

在生产环境中,你可以考虑使用 memcachedredis 驱动,让 Session 的性能更加出色。

Session driver 的配置预设了每个请求存储 Session 数据的位置。Laravel 自带了几个不错而且开箱即用的驱动:

  • file - 将 Session 存储在 storage/framework/sessions 中。

  • cookie - Sessions 被存储在安全加密的 cookie 中。

  • database - Sessions 被存储在关系型数据库中。

  • memcached / redis - Sessions 被存储在基于高速缓存的存储系统中。

  • array - Sessions 存储在 PHP 数组中,但不会被持久化。

Request 获取Session数据

Laravel 中处理 Session 数据有两种主要方法:全局辅助函数 session 和通过一个 Request 实例。首先,我们来看看通过控制器方法类型提示一个 Request 实例来访问 session。控制器方法依赖项会通过 Laravel 服务容器 实现自动注入:

<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class UserController extends Controller{    /**     * 展示给定用户的配置文件。     *     * @param  Request  $request     * @param  int  $id     * @return Response     */    public function show(Request $request, $id)    {        $value = $request->session()->get('key');        //    }}

当你从 Session 获取值时,你还可以传递一个默认值作为 get 方法的第二个参数。如果 Session 中不存在指定的键,便会返回这个默认值。若传递一个闭包作为 get 方法的默认值,并且所请求的键并不存在时,get 方法将执行闭包并返回其结果

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

助手函数 Session

你也可以使用全局的 PHP 辅助函数 session 来获取和存储 Session 数据。 使用单个字符串类型的值作为参数调用辅助函数 session 时,它会返回该字该符串对应的 Session 键的值。当使用一个键值对数组作为参数调用辅助函数 session 时,传入的键值将会存储在 Session 中:

Route::get('home', function () {    // 获取 session 中的一条数据...    $value = session('key');    // 指定一个默认值...    $value = session('key', 'default');    // 在 Session 中存储一条数据...    session(['key' => 'value']);});

门面类 Session

当然也可以像tp一样使用门面类,则可以直接静态方式的调用

控制器头部引用 use Illuminate\Support\Facades\Session;

由于session门面在app.php中已经定义好别名,所以在控制器中引入的时候可以直接use Session

img

<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use Illuminate\Http\Request;use Session;class UserController extends Controller{    public function show()    {        $value = Session::get('key');    }}

下面的演示均使用门面类的方式进行获取和或者Session

获取所有的 Session 数据

如果你想要获取所有的 Session 数据,可以使用 all 方法:

$data = $request->session()->all();$data = Request::session()->all();$data = $session->all();$data = Session::all();// 以上这几种方式都可以获取,只是方式不同

判断 Session 中是否存在某个值

要确定 Session 中是否存在某个值,可以使用 has 方法。如果该值存在且不为 null,那么 has 方法会返回 true

if (Session::has('users')) {}

要确定 Session 中是否存在某个值,即使其值为 null,也可以使用 exists 方法。如果值存在,则 exists 方法返回 true

if (Session::exists('users')) {    //}

存储Session数据

想要存储数据到 Session,你可以使用 put 方法,或者使用辅助函数 session

// 通过请求实例...$request->session()->put('key', 'value');// Session门面类Session::put('key', 'value');// 通过全局辅助函数...session(['key' => 'value']);

在 Session 数组中保存数据

push 方法可以将一个新的值添加到 Session 数组内。例如,假设 user.teams 这个键是包括团队名称的数组,你可以这样将一个新的值加入到数组中:

Session::push('user.teams', 'developers');

获取并删除

pull 方法可以只使用一条语句就从 Session 中获取并删除一条语句:

// 先获取key 然后在删除Session::pull('key', 'default');

删除Session数据

forget 方法会从 Session 中删除指定数据,如果想从 Session 中删除所有数据,可以使用 flush 方法:

// 删除单个值...Session::>forget('key');// 删除多个值...Session::forget(['key1', 'key2']);// 删除全部Session::flush();

总结Session使用

Session::all();                   // Session中获取所有变量Session::put('key', 'value');       // Session中存储一个变量**Session::get('key');        //  Session中获取一个变量**Session::get('key', 'default');  // Session中获取一个变量或返回一个默认值(如果变量不存在)Session::get('key', function() {     return 'default'; });  // 默认值也可以是一个回调函数返回值Session::has('users')            // 检查一个变量是否在Session中存在**Session::forget('key');          //  Session中删除一个变量**Session::flush();                // Session中删除所有变量**

补充:session方法也可以在视图中使用,如:{{ Session::get(‘code’)}};

img

Cookie的配置及使用

Cookie的添加其实很简单,直接使用Cookie::make(),在使用方法前,需要引入Cookie的门面use Illuminate\Support\Facades\Cookie;,这样就可以完成Cookie的设置了

不过,设置后我们如何才能取到Cookie值呢?

Cookie::make()、Cookie::forever()、Cookie::get()的使用方法:

$foreverCookie = Cookie::forever('forever', 'Success');$tempCookie = Cookie::make('temporary', 'My name is fantasy', 5);// 参数格式:$name, $value, $minutes$forever = Cookie::get('forever');$temporary = Cookie::get('temporary');// 当然Cookie也可以存储一个数组$user_info = array('name'=>'laravel','age'=>12);$user = Cookie::make('user',$user_info,30);dd(Cookie::get('user'));

添加Cookie

例如,我们需要在控制器中设置一个”Hello, Laravel”的cookie值,并设置有效期为10分钟。这里推荐使用cookie的队列方法Cookie::queue(),因为这样Cookie会自动添加到响应:

<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use Cookie;class DashboardController extends Controller{    /**     * Show the application index.     *     * @return Response     */    public function index()    {        //如果不适用上面的use Cookie,这里可以直接调用 \Cookie        // 参数分别为 名称 值  过期时间 一天过期60*60*24        Cookie::queue('test', 'Hello, Laravel', 10)        return view('index');    }}

看看Response Headers中是不是多了一条set-cookie记录。

要设置一个永不过期的的cookie值,可以使用Cookie::forever()方法:

Cookie::forever('test', 'Hello, Laravel');

Cookie自身并不提供该方法,由于Cookie的门面由\Illuminate\Cookie\CookieJar提供,所以Cookie可以使用该类中的方法。

获取Cookie

Cookie的使用离不开Response和Request。获取Cookie的值有两个层面,一个是服务端,另一个是客户端。如果要服务端获取到Cookie的值,就需要从Request中获得:

public function index(Request $request){    $cookie = $request->cookie('test');    dump($cookie);}

如果想获得所有Cookie的值,可以使用不传参数的方法:

public function index(Request $request){    $cookies = $request->cookie();    dump($cookies);}

再次访问地址,我们会得到一个所有cookie值的数组,包括我们刚刚设置的test:

array:3 [▼  "XSRF-TOKEN" => "CDSXUUYYHJHGDDFGHJAxPNNsVxLHGTRYUGJ"  "laravel_session" => "870a775gthhgef0b9f357edc6r6587878999876556"  "test" => "Hello, Laravel"]

当我们需要在客户端使用的时候,获取Cookie的值就不是这样了。首先,我们通过响应withCookie($cookie)传输到客户端的数据并不是一个字符串,而是一个cookie对象:

Cookie {#1490 ▼  #name: "test"  #value: "Hello, Laravel"  #domain: null  #expire: 1493791460  #path: "/"  #secure: false  #httpOnly: true}

获取value值,Cookie类提供了一个getValue()的方法来拿取。例如在模板中编辑代码:

<div>{{ $cookie->getValue() }}</div>

再次刷新页面时,就会得到设置的test的cookie值:

Hello, Laravel

清除Cookie

清除Cookie的方法比较简单,原理和设置Cookie一样的,只是将过期时间设置成了过去。这里也需要将Cookie加入到HTTP的Response中,使用make()或者forget()方法均可:

Cookie::queue(\Cookie::forget('test'));

无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post