Laravel 5.3以上session丢换问题

这是一个全局方法,设置session的
clipboard.png
登陆时,用HomeController调用session_member存储session
然后在首页IndexController继承Controller

clipboard.png

然后在HomeController里使用$this->data,数据为空,这是为什么?

clipboard.png

阅读 4.8k
8 个回答

这样做真是多此一举,直接在view模板里用Session或session取值即可.

没仔细去考究你的代码,分析原因应该是版本问题,因为我之前貌似碰到过,后来为了便于管理,我单独建了一个自定义的Session Facade,不过官方也给出了推荐的做法,我们来看看5.3的升级文档对该问题的描述:

Session In The Constructor
In previous versions of Laravel, you could access session variables or the authenticated user in your controller's constructor. This was never intended to be an explicit feature of the framework. In Laravel 5.3, you can't access the session or authenticated user in your controller's constructor because the middleware has not run yet(你不能在控制器的构造方法中访问session或auth,因为中间件还没有运行).

As an alternative, you may define a Closure based middleware directly in your controller's constructor. Before using this feature, make sure that your application is running Laravel 5.3.4 or above:

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class ProjectController extends Controller
{
    /**
     * All of the current user's projects.
     */
    protected $projects;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $this->projects = Auth::user()->projects;

            return $next($request);
        });
    }
}

你也可以参考下面的文章:

https://josephsilber.com/post...

https://stackoverflow.com/que...

大家都在想办法帮你解决问题,但是我觉得实现自身业务时的思路就是问题的。

从代码逻辑来看,你是希望用户信息存储在 session 中方便存取,同时希望所有的 Controller 通过继承后,能够简单的拿到常用的数据。

其实完全没有必要性。

  1. 在试图中要拿用户可以直接 auth()->user()
  2. 要把数据共享给试图,可以使用 View Composer

你调用的路由是否在 web 中间件里? (只有 web 中间建立的路由所调用的方法才会启用 session

原来我在 windows 上使用 php artisan serve 开发的时候也同样遇到了这个问题,我通过在 Session::put() 之后添加了 Session::save() 方法,成功读取到了数据。

所以,我换成了 Homestead 开发环境。

你确定不是代码的问题吗?

$member = session_member(); //这里输出一下$member;
session_member();这个没传值就调用下面:
function session_member(member){

return $member = session('member', null); //session('member', null)返回什么值?
}
一步步输出排查吧,另外能贴代码吗,贴图代码有错也不想给你改

必须方路由中间里!!!!他们说什么不符合逻辑,不安全!1年前的事情了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题