在 Laravel 首次打开网站时设置 cookie
Set cookie when the website opened first time in Laravel
我正在用 cookie 编写本地化。本地化与 cookie 配合得很好,但我想为第一次打开网站的人设置默认语言。所以,我为此创建了一个中间件并在路由中间件中注册:
public function handle(Request $request, Closure $next)
{
get_cookie('lang') ?? set_cookie('lang', 'az');
return $next($request);
}
get_cookie
和 set_cookie
来自自定义助手:
if (!function_exists('get_cookie')) {
function get_cookie($name)
{
return Cookie::get($name);
}
}
if (!function_exists('set_cookie')) {
function set_cookie($name, $value)
{
return Cookie::queue($name, $value, time() * 360 * 60);
}
}
问题是当我第一次打开网站时它设置了 cookie,但它没有显示带有 cookie 的网站。但是,我第二次打开网站时,它显示了带有 cookie 的网站。
我用谷歌搜索并在堆栈溢出中找到了这个:
if($request->hasCookie('lang')) {
return $next($request);
}
$response = $next($request);
return $response->withCookie(cookie()->forever('lang', 'az'));
但它对我没有用,我认为它适用于旧版本的 laravel。我假设,我以错误的方式使用中间件,但我没有弄清楚。任何建议将不胜感激。
编辑:
我将中间件的位置 $routeMiddleware 更改为 $middlewareGroups。我认为 AddQueuedCookiesToResponse 中间件必须在该中间件列表中。但是,这似乎并没有什么帮助。也许,列表中必须有另一个中间件?
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\SetLanguage::class,
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
我没能找到让它与 cookie 一起工作的方法。所以,我只是简单地使用会话而不是 cookie。因此,在中间件中我将 lang 变量设置为 session.
public function handle(Request $request, Closure $next)
{
if(!$request->session()->get('lang')) {
session(['lang' => 'az']);
}
return $next($request);
}
我正在用 cookie 编写本地化。本地化与 cookie 配合得很好,但我想为第一次打开网站的人设置默认语言。所以,我为此创建了一个中间件并在路由中间件中注册:
public function handle(Request $request, Closure $next)
{
get_cookie('lang') ?? set_cookie('lang', 'az');
return $next($request);
}
get_cookie
和 set_cookie
来自自定义助手:
if (!function_exists('get_cookie')) {
function get_cookie($name)
{
return Cookie::get($name);
}
}
if (!function_exists('set_cookie')) {
function set_cookie($name, $value)
{
return Cookie::queue($name, $value, time() * 360 * 60);
}
}
问题是当我第一次打开网站时它设置了 cookie,但它没有显示带有 cookie 的网站。但是,我第二次打开网站时,它显示了带有 cookie 的网站。 我用谷歌搜索并在堆栈溢出中找到了这个:
if($request->hasCookie('lang')) {
return $next($request);
}
$response = $next($request);
return $response->withCookie(cookie()->forever('lang', 'az'));
但它对我没有用,我认为它适用于旧版本的 laravel。我假设,我以错误的方式使用中间件,但我没有弄清楚。任何建议将不胜感激。
编辑: 我将中间件的位置 $routeMiddleware 更改为 $middlewareGroups。我认为 AddQueuedCookiesToResponse 中间件必须在该中间件列表中。但是,这似乎并没有什么帮助。也许,列表中必须有另一个中间件?
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\SetLanguage::class,
],
'api' => [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
我没能找到让它与 cookie 一起工作的方法。所以,我只是简单地使用会话而不是 cookie。因此,在中间件中我将 lang 变量设置为 session.
public function handle(Request $request, Closure $next)
{
if(!$request->session()->get('lang')) {
session(['lang' => 'az']);
}
return $next($request);
}