Php 会话在中间件Laravel 5中不工作
我试图使用Laravel5中间件中的会话,但它们不起作用。 具体来说-Php 会话在中间件Laravel 5中不工作,php,session,laravel,laravel-5,Php,Session,Laravel,Laravel 5,我试图使用Laravel5中间件中的会话,但它们不起作用。 具体来说-var_dump(Session::all())在handle的开头,方法给我一个数组值-_tokken,然后在这个方法的末尾 Session::put('lang',$locale); var_dump(Session::all()); 给我两个值的数组,_tokken和我的lang键,但在刷新后是相同的,因为我知道在第二次刷新后应该会有相同的结果 我想我可能在会话中间件之前加载了中间件,这是真的,然后我切换了,现在我的K
var_dump(Session::all())代码>在handle的开头,方法给我一个数组值-_tokken,然后在这个方法的末尾
Session::put('lang',$locale);
var_dump(Session::all());
给我两个值的数组,_tokken和我的lang键,但在刷新后是相同的,因为我知道在第二次刷新后应该会有相同的结果
我想我可能在会话中间件之前加载了中间件,这是真的,然后我切换了,现在我的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',
];
所以我问——我做错了什么
编辑:在Illumb\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()的测试不相关。您需要使用
\Session::save();
无论何时您想要保存修改,让我们假设我想要存储用户的语言
\Session::put('lang','en');
\Session::save();
现在刷新时,您将找到新创建的密钥。另一件需要注意的事情是,如果您正在制作一些中间件来处理/检索会话中的数据,您需要确保它在启动会话之后加载。我也遇到了同样的问题,我在登录时使用会话来存储区域设置,然后重定向到主仪表板,但当加载中间件时,会话尚未启动。所以它不起作用
首先,我要说的是,我不是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,
请注意,这个新中间件位于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,而根本不需要会话
但是您可以这样做,只需使用App::setLocale(Session::get('locale')),而不必包括会话外观。我也有同样的问题,我在中间件中设置值,如果某些条件为真,则在同一位置取消设置
我完全忘记了404,一些文件得到了404(丢失的图像),所以nginx将请求传递给Laravel应用程序以显示404页面,因为这是另一个url,所以我在那里不确定。我认为在会话中存储语言内容也是一个问题。只需检查您的浏览器网络,查看加载页面时发出的请求,您可能同时设置和取消设置如果您需要当前中间件中的会话,我发现了一个(n)(丑陋的)解决方法
<?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;
});
}
}
我也有同样的问题@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',
],
];
我只是删除了我的答案,因为它是不正确的。我在项目的中间件中测试了Session::all()
,效果很好。很抱歉回答不正确。@limonte别担心,是的,我编写了Session::all()返回\u标记,但不是稍后为我设置自己的值。它的工作方式与预期一样,即\u标记、\u先前和我的自定义values@limonte也许你可以分享你的项目或其他什么?或者私下里帮我?你让它工作了吗?这个save
方法在Laravel 5.2中不是必需的,有时是必需的。如果执行redirect()->route('myroute')->send()
,它不会存储会话数据,因此应该添加session::save()代码>之前。使用v5.8,我还发现有必要在中间件调用的函数中使用它。值得指出的是,这个示例实现了一个“之后”中间件——它在应用程序处理请求之后运行。这可能不是大多数需要中间件会话的人想要的。要更改此设置,请删除$response=$next($request)代码>行并更改返回$response代码>行到返回$next($request)代码>在Laravel 6中为我工作,当时我将中间件添加到$middlewareGroups数组“web”Point 2帮助了我,即新中间件出现在StartSession类之后。谢谢:)那么添加StartSession会破坏你的应用程序?这是哪一个版本的拉威尔?因为对我来说它没有坏,这很有效。为了我。我试图为会话变量中的所有视图设置一个变量。将中间件添加到web组完全有意义,我首先将其添加到全局中间件阵列。谢谢@WoodyDRN很抱歉我回复晚了。我很忙,我忘了。此代码段来自Laravel5.8。