Laravel5中Cookie的使用详解


Posted in PHP onMay 03, 2017

今天在Laravel框架中使用Cookie的时候,碰到了点问题,自己被迷糊折腾了半多小时.期间研究了Cookie的实现类,也在网站找了许多的资料,包括问答。发现并没有解决问题。网上的答案都是互相抄袭,互相转载。其实并没有什么用处。好在最后,我找到了决绝方法。奔着为广大Laravel爱好者和开发人员负责的精神,同时也希望大家在使用Cookie时少走弯路,在这里把在Laravel中Cookie的设置和读取方法贡献出来,供大家批评指正。

概述

Cookie的添加其实很简单,直接使用Cookie::make(),在使用方法前,需要引入Cookie的门面use Illuminate\Support\Facades\Cookie;,这样就可以完成Cookie的设置了(当然不引入直接 \Cookie 使用也能通过命名空间自动加载)。

不过,设置后我们如何才能取到Cookie值呢?有搜索过相关问题的开发人员肯定知道,网上的答案千篇一律都是:Cookie::get(),有的甚至附上了代码:

Cookie::make('test', 'hello, world', 10);
echo Cookie::get('test');

如果你按照这种类似的回答来测试Cookie,肯定会发现设置cookie的值永远都是null。多次测试无效下,你都会怀疑自己的Laravel框架是不是有问题!

其实,在Laravel框架中使用Cookie,就不得不提到Response和Request。经常用浏览器调试程序的开发者可能会留意过,在请求地址的Response Headers和Request Headers中,都包含有cookie信息。没错,如果你在Laravel框架中使用Cookie都离不开Response和Request,下面我们就来介绍Cookie的正确添加和获取方法。

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

Route::get('cookieset', function()
{
 $foreverCookie = Cookie::forever('forever', 'Success');
 $tempCookie = Cookie::make('temporary', 'Victory', 5);//参数格式:$name, $value, $minutes
 return Response::make()->withCookie($foreverCookie)->withCookie($tempCookie);
});
Route::get('cookietest', function()
{
  $forever = Cookie::get('forever');
  $temporary = Cookie::get('temporary');
  return View::make('cookietest', array('forever' => $forever, 'temporary' => $temporary, 'variableTest' => 'works'));
});
//先上一个demo写入cookie
$cookie = \Cookie('cookie_name', 'value', 5);
  $data = ['title'=>'hello world'];
  return \response()
   ->view('home.hello', $data)
   ->cookie($cookie);

2、Cookie存储数组:

Route::get('cookieset', function()
{
 $user_info = array('name'=>'laravel','age'=>12);
 $user = Cookie::make('user',$user_info,30);
 return Response::make()->withCookie($user);
});
Route::get('cookietest', function()
{
 dd(Cookie::get('user'));
});

下面详细谈谈laravel的cookie具体咋玩吧

添加Cookie

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

<?php
namespace App\Http\Controllers;
use Cookie;
use App\Http\Controllers\Controller;
class DashboardController extends Controller
{
 /**
  * Show the application index.
  *
  * @return Response
  */
 public function index()
 {
  Cookie::queue('test', 'Hello, Laravel', 10);//如果不适用上面的use Cookie,这里可以直接调用 \Cookie
  return view('index');
 }
}

看看Response Headers中是不是多了一条set-cookie记录。当然,如果你使用的是Response,可以直接使用Response中的withCookie()方法,将cookie添加到响应中:

public function index()
{
 //$response = new Response();
 $cookie = Cookie::make('test', 'Hello, Laravel', 10);
 return \Response::make('index')->withCookie($cookie);
 //return $response->make('index')->withCookie($cookie);
}

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

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

Cookie自身并不提供该方法,由于Cookie的门面由\Illuminate\Cookie\CookieJar提供,所以Cookie可以使用该类中的方法。这里附上queue()方法的源码:

/**
* Queue a cookie to send with the next response.
*
* @param mixed
* @return void
*/
public function queue()
{
 if (head(func_get_args()) instanceof Cookie) {
  $cookie = head(func_get_args());
 } else {
  $cookie = call_user_func_array([$this, 'make'], func_get_args());
 }
 $this->queued[$cookie->getName()] = $cookie;
}

从源码可以得知,queue()方法实际上也是调用的make()方法。

注意:有些水友提出在返回的视图上注入cookie的方法 return view('index')->withCookie($cookie),亲测无效。推荐使用 queue()

获取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 = Cookie::forget('test');
return Redirect::route('index')->withCookie($cookie);

以上所述是小编给大家介绍的Laravel5中Cookie的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
第十节--抽象方法和抽象类
Nov 16 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
PHP 递归效率分析
Nov 24 PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
php SQL Injection with MySQL
Feb 27 PHP
PHP用SAX解析XML的实现代码与问题分析
Aug 22 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
php生成二维码
Aug 10 PHP
PHP中危险的file_put_contents函数详解
Nov 04 PHP
Yii框架函数简单用法分析
Sep 09 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
Oct 02 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 #PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
May 03 #PHP
php中的异常和错误浅析
May 03 #PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 #PHP
利用php-cli和任务计划实现订单同步功能的方法
May 03 #PHP
php删除数组指定元素实现代码
May 03 #PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 #PHP
You might like
PHP设计聊天室步步通
2006/10/09 PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
PHP缓存技术的多种方法小结
2012/08/14 PHP
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
php字符串函数学习之substr()
2015/03/27 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
图片自动更新(说明)
2006/10/02 Javascript
js获取url参数的使用扩展实例
2007/12/29 Javascript
YUI的Tab切换实现代码
2010/04/11 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
JS定义网页表单提交(submit)的方法
2015/03/20 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
Python 26进制计算实现方法
2015/05/28 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
python链表类中获取元素实例方法
2021/02/23 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
潘多拉珠宝英国官方网上商店:PANDORA英国
2018/06/12 全球购物
优秀驾驶员先进事迹材料
2014/05/04 职场文书
中职生求职信
2014/07/01 职场文书
装修活动策划方案
2014/08/27 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫