Dans new Laravel je ne peux pas obtenir de session dans le constructeur. Pourquoi?
public function __construct()
{
dd(Session::all()); //this is empty array
}
puis en dessous
public function index()
{
dd(Session::all()); //here works
}
Dans le vieux laravel, je me souviens qu'il n'y avait pas ce problème. quelque chose a changé?
Vous ne pouvez pas le faire par défaut avec Laravel 5.3. Mais lorsque vous éditez vous Kernel.php
et que vous changez protected $middleware = [];
par ce qui suit, cela fonctionne.
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',
],
];
J'espère que ça marche!
Dans Laravel 5.3, la fonctionnalité relative aux sessions ne fonctionnera pas dans un constructeur de contrôleur , vous devez donc déplacer toute la logique associée aux sessions vers des méthodes.
Aucune autre solution n’a été trouvée pour cela . Mais vous pouvez toujours y accéder en utilisant Middleware dans le constructeur.
Alors, voici un autre hack
public function __construct(){
//No session access from constructor work arround
$this->middleware(function ($request, $next){
$user_id = session('user_id');
return $next($request);
});
}
*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);
});