laravel - 如何设置语言环境和重定向逻辑 Laravel 5
问题描述
我是 laravel 的新手,正在寻找有关如何在结构上设置某些功能的建议。
我的应用程序使用 ipInfo api 通过 ip 识别访问者所在的国家/地区,然后将用户重定向到适当的语言环境(例如 /gb/、/ca/ 等...)。
我只想对每个请求进行一次 ipInfo 调用,但由于访问者被重定向,我正在努力将调用减少到一个(从两个)。
最初,我在 serviceprovider 启动方法中有逻辑,但我认为使用会话变量是跟踪访问者的好主意 - 由于会话(通常)在服务提供商中不可用,我将逻辑移至自定义中间件.
这个中间件是在 sessionStart 中间件之后调用的,并且在大多数情况下运行良好。但是,我现在注意到这个中间件并没有被我认为可能与缓存有关的每个请求都触发?这意味着语言环境重定向逻辑并不总是被触发,用户有时也不会被重定向。
这在很多 laravel 应用程序中肯定是一个正常的特性,那么应该怎么做呢?请记住,我希望重定向/语言环境逻辑保持尽可能快,因此我不希望此逻辑出现在视图中。
*旁注,我在 laravel 5 之上使用 statamic 作为框架。
谢谢!
public function handle($request, Closure $next)
{
$uri = $request->server->get('REQUEST_URI');
if (
env('APP_ENV') != 'dev' &&
request()->server->get('REQUEST_METHOD') === 'GET' &&
!in_array('img', request()->segments()) &&
!in_array('_debugbar', request()->segments())) {
if (!Session::has('from_redirect')) {
$user_real_country = $this->getUserCountry();
Session::put('user_country', $user_real_country);
} else {
$user_real_country = Session::get('user_country');
Session::forget('from_redirect');
Session::save();
}
if (Request::input('orc') && in_array(Request::input('orc'), explode(',', env('ORC_OPTIONS')))) {
$country = Request::input('orc');
if (Cookie::has('country')) {
Cookie::forget('country');
}
} elseif (Cookie::has('country')) {
$country = Cookie::get('country');
} else {
$country = $user_real_country;
}
if (!is_null($country)) {
Cookie::put('country', $country);
$this->setLocale($country);
$this->setuser_Locale($user_real_country);
}
}
if (site_locale() == 'en-GB' && substr($uri, 0, 3) != '/gb') {
Session::put('from_redirect', true);
if(substr($uri, 0, 3) == '/ca') {
return redirect(Config::getSiteUrl() . substr($uri, 4));
}
return redirect(Config::getSiteUrl() . ltrim($uri, '/'));
} elseif (site_locale() == 'en-CA' && substr($uri, 0, 3) != '/ca') {
Session::put('from_redirect', true);
if(substr($uri, 0, 3) == '/gb') {
return redirect(Config::getSiteUrl() . substr($uri, 4));
}
return redirect(Config::getSiteUrl() . ltrim($uri, '/'));
} elseif(site_locale() == 'en' && (substr($uri, 0, 3) == '/ca' || substr($uri, 0, 3) == '/gb')) {
Session::put('from_redirect', true);
return redirect(Config::getSiteUrl() . substr($uri, 4));
}
return $next($request);
}
解决方案
推荐阅读
- vue.js - vuejs中可以在组件中动态添加组件
- javascript - 在 JavaScript 中连接嵌套数组时测试失败
- java - 如何确定在文本字段中输入的时间是否在两个预先确定的开市和收市时间范围内?
- google-cloud-platform - 如何查看从 Firebase 分析导入到谷歌分析的转化事件?
- javascript - 从 Html 将数据/元素名称传递给 TypeScript 类
- javascript - 如何用 JS 设置 img attr
- connectycube - 需要在 React Native 的后台、前台和终止状态下支持 connectycube 视频通话
- amazon-s3 - 是否可以分块反序列化 ORC 文件?
- reactjs - 我可以将顺风类名作为 React 中的道具传递吗?
- php - 'pg_connect()' 我需要什么库?