web-dev-qa-db-ja.com

laravel-コントローラのコンストラクタでセッションを取得できません

新しいlaravel=コンストラクタでセッションを取得できません。なぜですか?

public function __construct()
{
    dd(Session::all()); //this is empty array
}

そして次に

public function index()
{
    dd(Session::all()); //here works
}

古いlaravelで、この問題はなかったことを覚えています。何か変更されましたか?

16
gogagubi

Laravel 5.3ではデフォルトではできませんが、編集するとKernel.phpと変更protected $middleware = [];次のように動作します。

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,

        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

これがうまくいくことを願っています!

31
Robin Dirksen

他の回答のように、そのままの解決策はありません。しかし、コンストラクターでミドルウェアを使用して引き続きアクセスできます。

ここに別のハックがあります

public function __construct(){
    //No session access from constructor work arround
    $this->middleware(function ($request, $next){
        $user_id = session('user_id');
        return $next($request);
    });

}
5
Samy Massoud

Laravel 5.3セッション関連の機能はコントローラーコンストラクターでは機能しません なので、すべてのセッション関連のロジックをメソッドに移動する必要があります。

5
Alexey Mezenin

Laravel 5.7ソリューション

public function __construct()
{

$this->middleware(function ($request, $next) {
// fetch session and use it in entire class with constructor
$this->cart_info = session()->get('custom_cart_information');

return $next($request);
});

}

他の機能、クエリ、またはデータにコンストラクタを使用する場合は、$ this-> middleware関数ですべての作業を行います。これ以外は行いません。これを行うと、クラス全体のすべての機能で機能しなくなります。

3
Kamlesh
 *This one solved mine problem to use session in constructor* 
   $this->middleware(function ($request, $next) {
        if (!session('records_per_page')) {
            session(['records_per_page' => 20]);
        }

        // update rows per page
        if (!empty(\Request::get('records_per_page')) && in_array(\Request::get('records_per_page'), [20, 50, 80, 100])) {
            session(['records_per_page' => \Request::get('records_per_page')]);
        }
        return $next($request);
    });
0
Muhammad Luqman

ミドルウェアを使った構成でSessionを使ってみましたが、試してみると参考になります

public function __construct()
{
    $this->middleware('PM');

    $this->middleware(function ($request, $next){
        $school_id = Session::get('school_id');


        return $next($request);
    });
}
0
Bablu Mazumder

Laravel 6.18.1以降、これらをkernel.phpの$middleware配列に追加します

\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,

そしてそれはうまくいくはずです。

0
Arvind K.