Php 拉威尔-Can';无法在控制器构造函数中获取会话
在new laravel中,我无法在构造函数中获取会话。为什么?Php 拉威尔-Can';无法在控制器构造函数中获取会话,php,laravel,session,constructor,Php,Laravel,Session,Constructor,在new laravel中,我无法在构造函数中获取会话。为什么? public function __construct() { dd(Session::all()); //this is empty array } 然后在下面 public function index() { dd(Session::all()); //here works } 在老拉威尔,我记得没有这个问题。有什么变化吗?在中,因此您应该将所有与会话相关的逻辑移到方法。默认情况下,使用Laravel 5
public function __construct()
{
dd(Session::all()); //this is empty array
}
然后在下面
public function index()
{
dd(Session::all()); //here works
}
在老拉威尔,我记得没有这个问题。有什么变化吗?在中,因此您应该将所有与会话相关的逻辑移到方法。默认情况下,使用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.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函数中完成所有工作,而不是在此之外。如果您这样做,它将无法在整个类的所有函数中工作。我在使用中间件的构造中使用了会话,您可以尝试一下,这将非常有用
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,
如果现在有人遇到这个问题,我建议创建一个中间件并将其放在App\Http\Kernel
的Web中间件部分,而不是访问控制器构造函数中的会话值
这是因为会话不是传递给控制器构造函数的请求的一部分。然后,要在每个控制器中执行任何会话值检查或操作,更安全的做法是创建一个中间件
在这里,会话值可以作为进入路由的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',
],
];`
这是因为\illumb\Session\Middleware\StartSession
在会话到达您的路由之前已启动会话您确定这不会中断web.php
或其他内容中路由的会话功能吗?你测试过了吗?@AlexeyMezenin和我的Laravel项目一切正常,我从web
数组中移动了最后2个。@gogagubi nice,如果成功,你可以通过接受这个答案向其他用户显示这一切正常!通过添加这些行,我遇到了另一个问题。控制器和视图之间的会话不起作用。但我找到了解决方案。我已经在$middlewareGroups数组中注释了相同的两行,现在它可以工作了。因为你不应该,真的。为什么不呢,你可以在会话中执行一些身份验证检查这也适用于Laravel 5.4.Laravel 5.6-同样,有一些回调,我可以在其中检查内容,这将在构造函数之后但在实际函数之前调用?您能解释一下这是如何工作的吗?我自己想不出来这个解决方案不起作用。。请建议您是如何做到的。请解释您的答案。我在使用中间件的构造中使用了会话,您可以尝试,它将是helpful@Miron我还没有用Laravel7.0测试它,但很高兴听到它在Laravel7.0更高版本中也能工作。谢谢亲爱的:)谢谢!在《拉雷维尔7》中,我就是这么做的。搜索了整整一个小时,然后很容易…
`/**
* 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',
],
];`