laravel - 无法在控制器构造函数中获取会话

时间:2017-01-09 07:15:04

标签: php laravel session constructor

在新的laravel中,我无法在构造函数中获得会话。为什么?

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

然后在

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

在旧的laravel我记得没有这个问题。有什么变化?

8 个答案:

答案 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在会话到达您的路线之前已经开始了会话