php - laravel5.2 session的问题

 米年爱秋天 发布于 2022-12-01 04:26

第一个问题

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,为什么。。。

问题一和问题二和问题三没有关联,求大神解答

3 个回答
  • 检查是否加载了 web 中间件

    2022-12-01 05:43 回答
  • 把dd注释掉就好了,用dd或者dump打印的话会提前输出laravel还没有把session信息放到响应header里就输出了。设置session的时候不要打印,等页面加载完了session才设置成功,再打印才能看到结果。

    2022-12-01 05:43 回答
  • 我只能回答你关于session的问题,在laravel中session设置之后并不会立刻写入到存储,如果你使用dd函数就会中断代码,导致session没有写入成功,如果你要在dd前写入,需要调用session()->save()方法,包括控制层里面如果要存储session,而且没有其他任何逻辑要么save,要么需要return session->set('ccc',111)

    2022-12-01 05:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有