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

Php 如何在Laravel中设置动态路由前缀?,php,laravel,Php,Laravel,我需要创建一个应用程序与多个地区。每个路由都以区域设置作为前缀。例如,xxx.com/en/home,xxx.com/fr/home 问题是,我需要将区域设置字符串动态绑定到路由前缀。由于用户可以更改区域设置,因此区域设置字符串存储在会话中。我需要参考web.php上的会话。Session对象不能在web.php上的globle作用域中使用,这意味着Session('key')在最外层的作用域中不会得到任何东西(null),除了路由函数,因为我认为Laravel在实例化任何Session对象之前

我需要创建一个应用程序与多个地区。每个路由都以区域设置作为前缀。例如,
xxx.com/en/home
xxx.com/fr/home


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

我不确定您的场景和应用程序的复杂性,但我会尝试通过一次生成所有路由来保持简单,比如

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

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

然后我将编写一个中间件来解析区域设置并相应地进行设置。希望能有所帮助。

我最近在路由前面加上了locale,我发现使用它很容易实现。在设置包安装之后,我只需要为所有我想要的带有区域设置前缀的URL添加一个路由组

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

您可以使用以下内容:

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));
        }
    }

}

如何添加一个中间件,找出本地和重定向相应。顺便说一句,你可以在应用程序的任何地方设置/访问
session()
helper。它可以完成这项工作。谢谢