新しいlaravel=コンストラクタでセッションを取得できません。なぜですか?
public function __construct()
{
dd(Session::all()); //this is empty array
}
そして次に
public function index()
{
dd(Session::all()); //here works
}
古いlaravelで、この問題はなかったことを覚えています。何か変更されましたか?
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',
],
];
これがうまくいくことを願っています!
他の回答のように、そのままの解決策はありません。しかし、コンストラクターでミドルウェアを使用して引き続きアクセスできます。
ここに別のハックがあります
public function __construct(){
//No session access from constructor work arround
$this->middleware(function ($request, $next){
$user_id = session('user_id');
return $next($request);
});
}
Laravel 5.3セッション関連の機能はコントローラーコンストラクターでは機能しません なので、すべてのセッション関連のロジックをメソッドに移動する必要があります。
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関数ですべての作業を行います。これ以外は行いません。これを行うと、クラス全体のすべての機能で機能しなくなります。
*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);
});
ミドルウェアを使った構成でSessionを使ってみましたが、試してみると参考になります
public function __construct()
{
$this->middleware('PM');
$this->middleware(function ($request, $next){
$school_id = Session::get('school_id');
return $next($request);
});
}
Laravel 6.18.1以降、これらをkernel.phpの$middleware
配列に追加します
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
そしてそれはうまくいくはずです。