【问题标题】:How to set dynamic route prefix in Laravel?如何在 Laravel 中设置动态路由前缀?
【发布时间】:2018-03-20 23:40:33
【问题描述】:

我需要创建一个具有多个语言环境的应用。每条路由都以语言环境为前缀。例如xxx.com/en/homexxx.com/fr/home

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

【问题讨论】:

  • 如何添加一个中间件来找出本地并相应地重定向。顺便说一句,您可以在应用程序的任何位置设置/访问 session() 助手。

标签: php laravel


【解决方案1】:

你可以这样使用:

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

}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 它完成了这项工作。谢谢!
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-17
      • 1970-01-01
      • 2015-01-10
      • 2020-12-25
      • 2019-12-11
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多