我试图在Laravel 5中间件中使用Sessions,但它们无法正常工作。
具体来说 - 在句柄方法的开头var_dump(Session::all());
给我一个数组的值 - _tokken,然后在这个方法的末尾
Session::put('lang',$locale);
var_dump(Session::all());
给我带有两个值的数组,_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',
];
所以我问 - 我做错了什么?
编辑:挖掘Illuminate \ Session \ Middleware \ StartSession我发现了这个 -
//Note that the Laravel sessions do not make use of PHP "native" sessions in any way since they are crappy.
作为评论,所以我对session_status()的测试不是相关的。
答案 0 :(得分:7)
您需要使用
\Session::save();
每当您想要保存修改时,我们就要说我想存储用户的语言
\Session::put('lang','en');
\Session::save();
现在刷新时,您将找到新创建的密钥。
答案 1 :(得分:6)
我遇到了同样的问题,我在登录时使用Sessions存储区域设置,然后重定向到主仪表板,但是当中间件加载时,会话尚未启动。所以它不会起作用。
首先我要说的是,我没有Laravel专家,但这种方式适用于Laravel 5.3:
1)php artisan make:middleware SetApplicationLanguage
2)将其添加到app / Http / Kernel.php $ middlewareGroup变量:
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\SetApplicationLanguage::class,
请注意,这个新的中间件是在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);
}
}
请注意,我没有在此示例中使用Session。这是因为当我在StartSession类之后添加我的中间件时,会话会起作用,但是Auth :: user()会再次可用,所以我可以使用Auth :: user() - > locale而不需要适用于Sessions。
但你可以这样做,只需使用App :: setLocale(Session :: get(' locale'))而不是原因包括Session facade。
答案 2 :(得分:1)
如果您需要当前中间件中的会话,我发现了一种(丑陋的)解决方法。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Session\Middleware\StartSession;
class MiddlewareThatNeedsTheSession
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return app(StartSession::class)->handle($request, function ($request) use ($next) {
/** @var Response $response */
$response = $next($request);
// do something with session
session(['foo' => 'bar']);
return $response;
});
}
}
答案 3 :(得分:0)
另外需要注意的是,如果你正在制作一些操纵/检索会话数据的中间件,你需要确保它在StartSession
网络中间件之后加载。
答案 4 :(得分:0)
我有同样的问题,如果某些条件成立,我在中间件中设置值并在同一个地方取消设置。
我完全忘了404s,有些文件得到404(缺少图像)所以nginx将请求传递给Laravel应用程序显示404页面,因为它是其他网址我在那里取消了。我认为在会话中存储语言内容存在同样的问题。只需检查您的浏览器网络并查看加载页面时正在进行的请求,您可能同时设置和取消设置
答案 5 :(得分:0)
我有同样的问题。 @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',
],
];