Route::get('test', function () { session(['wechat.oauth_user'=>1]); dd(session('wechat.oauth_user')); });
输出1,然后我把session(['wechat.oauth_user'=>1]);注释了
Route::get('test', function () { //session(['wechat.oauth_user'=>1]); dd(session('wechat.oauth_user')); });
刷新页面,输出null,这是为什么?
我使用了overtrue/wechat的插件,用插件自带的中间件成功获取了用户信息,然后user路由里也输出了session
public function handle($request, Closure $next, $guard = null) { $wechat = app('EasyWeChat\\Foundation\\Application'); if (!session('wechat.oauth_user')) { if ($request->has('state') && $request->has('code')) { session(['wechat.oauth_user' => $wechat->oauth->user()]); return redirect()->to(url($request->url(), array_except($request->query(), ['code', 'state']))); } return $wechat->oauth->redirect($request->fullUrl()); } return $next($request); }
Route::get('user', function () { dd(session('wechat.oauth_user')); });
在这个基础上,我建立了自己的中间件UserMiddleware
public function handle($request, Closure $next) { if(Auth::guard('web')->guest()){ if (!session('wechat.oauth_user')) { return redirect('user'); } else{ User::CreateOrLogin(session('wechat.oauth_user')); } } return $next($request); }
User.php 方法 CreateOrLogin是
public static function CreateOrLogin($data){ $user=self::getByOpenid($data['id']); if(!$user){ $create=['openid'=>$data['id']]; $user=self::create($create); } Auth::guard('web')->login($user); } public static function getByOpenid($openid){ return self::where('openid','=',$openid)->first(); }
一切都是ok的,但是每次刷新页面都会执行微信获取用户信息的接口,然后一个个注释掉,发现Auth::guard('web')->login($user);这句注释掉后,刷新页面就不会再跳转到微信,加上去就要跳转到微信获取用户信息接口,感觉像是login会清除掉session一样
Route::group(['middleware' => ['web']], function () { Route::get('test', function () { dd(auth()->user()); }); Route::get('test2', function () { dd(auth()->loginUsingId(1)); }); });
先访问test2,成功登陆,再访问test,输出null,为什么。。。
问题一和问题二和问题三没有关联,求大神解答
检查是否加载了 web
中间件
把dd注释掉就好了,用dd或者dump打印的话会提前输出laravel还没有把session信息放到响应header里就输出了。设置session的时候不要打印,等页面加载完了session才设置成功,再打印才能看到结果。
我只能回答你关于session的问题,在laravel中session设置之后并不会立刻写入到存储,如果你使用dd函数就会中断代码,导致session没有写入成功,如果你要在dd前写入,需要调用session()->save()方法,包括控制层里面如果要存储session,而且没有其他任何逻辑要么save,要么需要return session->set('ccc',111)