刚开始在使用Laravel中的session的时候是遇到了这样的一个问题:
1、Laravel无法跨方法获取???
处理方法:
1)路由置于 web 中间件下,修改app/Http/Kernel.php文件,如下
protected $middlewareGroups = [
'web' => [
...
],
//我使用的是api
'api' => [
/* 加上这段代码,要把路由放在这个中间件了才会启动Session */
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
/* end */
'throttle:60,1',
'bindings',
],
];
2)修改路由
/* 需要用到session的接口放在这里 加['middleware'=>['api'] */
Route::group(['middleware'=>['api']], function () {
require __DIR__.'/api/api.php';
});
3)代码中不能出现exit; die(); dd(); 可换成return
4)使用Session::这种写法时要加上
use Illuminate\Support\Facades\Session;
存储完session后尽量加上 Session::save();
2、那么微信小程序如何使用Laravel中的Session呢???
小程序数据存储必须通过自己服务器的HTTPS的接口存储到你自己的服务器上,但是小程序不支持cookie,这就意味着服务器不能识别每一个客户端,session也随之失效。
处理方法:
通过第三方接口将sessionid传给小程序客户端(一般会包含在header里面的Set-Cookie里),然后使用wx.setStorageSync()存储到本地,然后每次发起请求(wx.request)时,将这个sessionid放在header的Cookie里提交给第三方接口。
Laravel的实现:
Laravel抛弃了PHP原生的Session,也就没有sessionid,不过取而代之laravel使用了一个等同的变量laravel_session。
'cookie' => 'laravel_session',
所以当你在小程序登录后,使用wx.request请求第三方的接口让第三方服务器获取登录状态后,第三方接口在返回的Response Header里会有一个Set-Cookie值,里面包含了laravel_session,可以使用正则表达式获取到laravel_session然后存储到本地。然后在以后的每次请求都加上header,携带参数laravel_session="存储的值"。
下边是我前端的实现代码,用的是uni-app框架,不过道理都是一样的,供大家参考:
let header = { 'Content-Type': 'application/x-www-form-urlencoded'};
// #ifdef MP-WEIXIN
if (uni.getStorageSync('laravel_session')) {
header.Cookie = 'laravel_session=' + uni.getStorageSync('laravel_session');
}
// #endif
uni.request({
url: apiurl + api,
dataType: "json",
data: parmas,
method: "POST",
header: header,
success: function(res) {
// #ifdef MP-WEIXIN
var laravel_session = res.header["Set-Cookie"].match(/laravel_session=(.*?);/)[1];
// console.log(laravel_session);
uni.setStorageSync('laravel_session',laravel_session);
// #endif
callback(res.data);
},
})
有问题欢迎留言,我们一起探讨