首页 > 解决方案 > 如何设置语言环境和重定向逻辑 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);
}

标签: laravelredirectlaravel-5localelaravel-middleware

解决方案


推荐阅读