Sub*_*ect 10 php session laravel laravel-5
我试图在Laravel 5 Middleware中使用Sessions,但它们无法正常工作.具体来说 - var_dump(Session::all());
在handle方法的开头给我一个数组的值--_tokken,然后在这个方法的最后
Session::put('lang',$locale);
var_dump(Session::all());
Run Code Online (Sandbox Code Playgroud)
给我数组有两个值,_tokken和我的lang键,但刷新后它相同,据我所知,第二次刷新后应该有相同的结果.
我可能在Session中间件之前加载了我的中间件,这是真的,然后我切换了,现在我的Kernel.php看起来像这样 -
protected $middleware = [
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
'Illuminate\Cookie\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
'App\Http\Middleware\VerifyCsrfToken',
'App\Http\Middleware\Language',
];
Run Code Online (Sandbox Code Playgroud)
所以我问 - 我做错了什么?
编辑:挖掘Illuminate\Session\Middleware\StartSession我发现了这个 -
//Note that the Laravel sessions do not make use of PHP "native" sessions in any way since they are crappy.
Run Code Online (Sandbox Code Playgroud)
作为评论,所以我对session_status()的测试不是相关的.
你需要使用
\Session::save();
Run Code Online (Sandbox Code Playgroud)
每当你想保存修改时,我就说我想存储用户的语言
\Session::put('lang','en');
\Session::save();
Run Code Online (Sandbox Code Playgroud)
现在刷新时,您将找到新创建的密钥.
我遇到了同样的问题,我使用Sessions在登录时存储区域设置,然后重定向到主仪表板,但是当中间件加载时,会话尚未启动.所以它不会起作用.
首先我要说的是,我不是Laravel专家,但这种方式适用于Laravel 5.3:
1)php artisan make:中间件SetApplicationLanguage
2)将其添加到app/Http/Kernel.php $ middlewareGroup变量:
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\SetApplicationLanguage::class,
Run Code Online (Sandbox Code Playgroud)
请注意,这个新的中间件在StartSession类之后出现.
3)这是我的app/Http/MiddleWare/SetApplicationLanguage.php:
namespace App\Http\Middleware;
use App;
use Closure;
use Illuminate\Support\Facades\Auth;
class SetApplicationLanguage
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (isset(Auth::user()->locale)) {
App::setLocale(Auth::user()->locale);
}
return $next($request);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在这个例子中没有使用Session.那是因为当我在StartSession类之后添加我的中间件时,会话会起作用,但是Auth :: user()会再次可用,所以我可以使用Auth :: user() - > locale,根本不需要Sessions.
但你可以这样做,只需使用App :: setLocale(Session :: get('locale'))而不是原因包括Session facade.
我有同样的问题。@WoodyDRN 说您需要将 StartSession 中间件添加到您的内核文件中,但这不是解决此问题的最佳方法。那么,我怎么知道呢?因为我添加并请求验证系统坏了。
解决此问题的最佳方法,将您的语言中间件添加到 Web 中间件数组
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Localization::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
Run Code Online (Sandbox Code Playgroud)