Cookie 在控制器中正确读取但在中间件中不正确 - Laravel
Cookie read correctly in controllers but not in middleware - Laravel
我试图设置一个 cookie 来定义用户首选语言。我这样做是通过 link 导致辅助控制器:
/set-locale/{locale}
public function edit_locale($locale) {
$durata= 2628000; // "forever"
if (Cookie::has('locale')) {
Cookie::queue(Cookie::forget('locale')); // If locale cookie is already defined, delete it
}
Cookie::queue("locale", $locale, $durata); // Set the cookie to either "en", "fr" or "ar"
return redirect()->back();
}
我知道这可以正常工作,因为如果我这样做:
dd(Cookie::get('locale'));
它显示了选择的正确语言环境。所以下一步是使用中间件实际应用这个选择的语言环境,我将其命名为“SetLocale”:
public function handle(Request $request, Closure $next)
{
if (Cookie::has('locale')) {
$locale = Cookie::get('locale'); // The cookie gotten here is all scrambled for some reason
} else {
// other logic for when cookie is not set (irrelevant for this question)
}
App::setLocale($locale);
return $next($request);
}
但是如果我执行
dd(Cookie::get('locale'));
在中间件中,它读取所有已加扰的 cookie。
所以我的问题是它为什么这样做以及我如何从这里正确读取 cookie?
使用它从请求中获取 cookie:
\Crypt::decrypt(Cookie::get('locale'))
或使用
\Crypt::decryptString(Cookie::get('locale'))
好的,esmaill 的回答对我不起作用(出现“unserialize(): Error at offset 0 of 43 bytes”错误)但它确实帮助我指出了正确的方向来解决它。
我所做的只是将 'locale' 添加到 EncryptCookies 中间件的 $except 属性并重置 cookie,现在它已被正确读取。
我试图设置一个 cookie 来定义用户首选语言。我这样做是通过 link 导致辅助控制器:
/set-locale/{locale}
public function edit_locale($locale) {
$durata= 2628000; // "forever"
if (Cookie::has('locale')) {
Cookie::queue(Cookie::forget('locale')); // If locale cookie is already defined, delete it
}
Cookie::queue("locale", $locale, $durata); // Set the cookie to either "en", "fr" or "ar"
return redirect()->back();
}
我知道这可以正常工作,因为如果我这样做:
dd(Cookie::get('locale'));
它显示了选择的正确语言环境。所以下一步是使用中间件实际应用这个选择的语言环境,我将其命名为“SetLocale”:
public function handle(Request $request, Closure $next)
{
if (Cookie::has('locale')) {
$locale = Cookie::get('locale'); // The cookie gotten here is all scrambled for some reason
} else {
// other logic for when cookie is not set (irrelevant for this question)
}
App::setLocale($locale);
return $next($request);
}
但是如果我执行
dd(Cookie::get('locale'));
在中间件中,它读取所有已加扰的 cookie。 所以我的问题是它为什么这样做以及我如何从这里正确读取 cookie?
使用它从请求中获取 cookie:
\Crypt::decrypt(Cookie::get('locale'))
或使用
\Crypt::decryptString(Cookie::get('locale'))
好的,esmaill 的回答对我不起作用(出现“unserialize(): Error at offset 0 of 43 bytes”错误)但它确实帮助我指出了正确的方向来解决它。
我所做的只是将 'locale' 添加到 EncryptCookies 中间件的 $except 属性并重置 cookie,现在它已被正确读取。