如何在Laravel中设置动态路由前缀?

时间:2018-03-02 01:45:57

标签: php laravel

我需要创建一个包含多个区域设置的应用。每个路由都以区域设置为前缀。例如,xxx.com/en/homexxx.com/fr/home

问题是,我需要动态地将语言环境字符串绑定到路由前缀。由于用户可以更改区域设置,因此区域设置字符串存储在会话中。我需要参考web.php上的会话。 Session对象不能在web.php的globle范围内使用,这意味着session('key')除了路由函数之外不会在最外层的范围内获取任何东西(null),因为Laravel在实例化任何会话之前解析web.php对象,我想。因此,我面临一个难题,即我不能在web.php的最外层范围内引用会话,而我需要会话来创建动态前缀。我怎么解决这个问题?

3 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

Route::prefix(App::getLocale())->middleware('lang')->group(function () { 
    // Routes
});

Lang中间件:

class Language {

    public function handle(Request $request, Closure $next)
    {
        $locale = $request->segment(1);

        if (in_array($locale, config('app.locales'))) {
            \App::setLocale($locale);
            return $next($request);
        }

        if (!in_array($locale, config('app.locales'))) {

            $segments = $request->segments();
            $segments[0] = config('app.fallback_locale');

            return redirect(implode('/', $segments));
        }
    }

}

答案 1 :(得分:1)

我最近使用语言环境为我的路线添加了前缀,我发现使用mcamara's Laravel Localization package很容易实现。设置软件包安装后,我只需要为所有需要的语言环境前缀添加一个路由组。

Route::group([
    'prefix' => LaravelLocalization::setLocale(),
    'middleware' => ['localeSessionRedirect', 'localizationRedirect']
], function()
{
   Route::get('/contact', 'HomeController@contact_page');
});

答案 2 :(得分:0)

我不确定你的情况和你应用程序的复杂性,但我会尝试通过一次生成所有路径来保持简单

$locales = [
    'en',
    'ru',
];

foreach ($locales as $locale) {
    Route::group(['prefix' => $locale], function() {
        Route::get('route1',function(){});
        Route::post('route1',function(){});
    });
} return false;

然后我会编写一个解析语言环境并相应设置的中间件。希望它有所帮助。