在新的laravel中,我无法在构造函数中获得会话。为什么?
public function __construct()
{
dd(Session::all()); //this is empty array
}
然后在
下面public function index()
{
dd(Session::all()); //here works
}
在旧的laravel我记得没有这个问题。有什么变化?
答案 0 :(得分:28)
默认情况下,您无法使用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',
],
];
希望这有效!
答案 1 :(得分:5)
在Laravel 5.3 sessions related functionality will not work in the a controller constructor中,您应该将所有与会话相关的逻辑移到方法中。
答案 2 :(得分:5)
与其他答案一样,没有开箱即用的解决方案。 但是您仍然可以使用构造函数中的中间件来访问它。
这是另一种黑客手段
public function __construct(){
//No session access from constructor work arround
$this->middleware(function ($request, $next){
$user_id = session('user_id');
return $next($request);
});
}
答案 3 :(得分:1)
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函数中完成所有工作,而不要超出此范围。如果这样做,它将无法在整个类的所有功能中起作用。
答案 4 :(得分:1)
从Laravel 6.18.1开始,将它们添加到kernel.php中的$middleware
数组中
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
它应该可以工作。
答案 5 :(得分:0)
*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);
});
答案 6 :(得分:0)
我在使用中间件的构造中使用了Session,可以尝试一下,这会有所帮助
public function __construct()
{
$this->middleware('PM');
$this->middleware(function ($request, $next){
$school_id = Session::get('school_id');
return $next($request);
});
}
答案 7 :(得分:0)
如果现在有人遇到这个问题,建议您创建一个中间件并将其放在App\Http\Kernel
的“ Web中间件”部分中,而不是在控制器构造函数中访问会话值。
这是因为会话不是传递给Controller构造函数的请求的一部分。然后,要在每个控制器中执行任何会话值检查或操作,创建中间件会更安全。
在此可以将会话值作为进入路由的HTTP请求的一部分进行访问。
`/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
...,
...,
...,
...,
...,
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\MySpecialMiddleWareToAccessSessionVariables::class
],
'api' => [
'throttle:60,1',
'bindings',
],
];`
这是因为\Illuminate\Session\Middleware\StartSession
在会话到达您的路线之前已经开始了会话