Php 拉威尔-Can';无法在控制器构造函数中获取会话

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

在new laravel中,我无法在构造函数中获取会话。为什么?

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',
    ],
];`