鍍金池/ 問(wèn)答/PHP/ Laravel 5.3以上session丟換問(wèn)題

Laravel 5.3以上session丟換問(wèn)題

這是一個(gè)全局方法,設(shè)置session的
clipboard.png
登陸時(shí),用HomeController調(diào)用session_member存儲(chǔ)session
然后在首頁(yè)IndexController繼承Controller

clipboard.png

然后在HomeController里使用$this->data,數(shù)據(jù)為空,這是為什么?

clipboard.png

回答
編輯回答
懶洋洋

$member = session_member(); //這里輸出一下$member;
session_member();這個(gè)沒(méi)傳值就調(diào)用下面:
function session_member(member){

return $member = session('member', null); //session('member', null)返回什么值?
}
一步步輸出排查吧,另外能貼代碼嗎,貼圖代碼有錯(cuò)也不想給你改

2018年9月8日 04:50
編輯回答
陌如玉

你確定不是代碼的問(wèn)題嗎?

2017年10月15日 08:25
編輯回答
病癮

你調(diào)用的路由是否在 web 中間件里? (只有 web 中間建立的路由所調(diào)用的方法才會(huì)啟用 session

2018年5月15日 23:54
編輯回答
葬憶

原來(lái)我在 windows 上使用 php artisan serve 開(kāi)發(fā)的時(shí)候也同樣遇到了這個(gè)問(wèn)題,我通過(guò)在 Session::put() 之后添加了 Session::save() 方法,成功讀取到了數(shù)據(jù)。

所以,我換成了 Homestead 開(kāi)發(fā)環(huán)境。

2017年8月27日 08:15
編輯回答
情已空

大家都在想辦法幫你解決問(wèn)題,但是我覺(jué)得實(shí)現(xiàn)自身業(yè)務(wù)時(shí)的思路就是問(wèn)題的。

從代碼邏輯來(lái)看,你是希望用戶(hù)信息存儲(chǔ)在 session 中方便存取,同時(shí)希望所有的 Controller 通過(guò)繼承后,能夠簡(jiǎn)單的拿到常用的數(shù)據(jù)。

其實(shí)完全沒(méi)有必要性。

  1. 在試圖中要拿用戶(hù)可以直接 auth()->user()
  2. 要把數(shù)據(jù)共享給試圖,可以使用 View Composer
2017年11月30日 04:45
編輯回答
墨染殤

必須方路由中間里?。。。∷麄冋f(shuō)什么不符合邏輯,不安全!1年前的事情了

2017年7月20日 01:03
編輯回答
拮據(jù)

沒(méi)仔細(xì)去考究你的代碼,分析原因應(yīng)該是版本問(wèn)題,因?yàn)槲抑懊菜婆龅竭^(guò),后來(lái)為了便于管理,我單獨(dú)建了一個(gè)自定義的Session Facade,不過(guò)官方也給出了推薦的做法,我們來(lái)看看5.3的升級(jí)文檔對(duì)該問(wèn)題的描述:

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(你不能在控制器的構(gòu)造方法中訪問(wèn)session或auth,因?yàn)橹虚g件還沒(méi)有運(yùn)行).

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...

2017年3月5日 04:59
編輯回答
舊時(shí)光

這樣做真是多此一舉,直接在view模板里用Session或session取值即可.

2017年6月10日 16:28